本项目属于个人学习记录,爬取的数据会于12小时内销毁,且不可用于商用。
1 初始化环境
首先我们需要有python环境,先安装一下python,然后配置环境变量,这边给出windows的配置:
我这边的安装目录是D:\python38,然后配置上面框出来的2个路径就可以了,然后我们只需要在命令行里面输入 python ,和pip -V ,就可以检查环境是否配置正确了。
接下来的操作我们都是用系统python解释器的,没有用虚拟环境。
下一步要先安装scrapy
pip install scrapy
安装好之后,我们在命令行里就可以全局使用scrapy命令了,否则是不可以执行scrapy的。
2 创建scrapy 工程
我们在我们想要的目录下调出命令行,然后执行以下命令。
scrapy startproject weiboScrapy
然后进入到weiboScrpay目录执行
# 生成爬虫
scrapy genspider weibo weibo.com
scrapy 基本框架就自动创建好了。
然后使用pychram(或者其他IDE)打开这个工程就可以继续开发了。
3 分析【微博热门榜单页面和hottimeline接口】
我们先来分析微博的页面,只有把它的页面分析清楚之后我们才能很快速的写出爬虫程序。
首先访问到热门榜单这个页面,地址是
https://weibo.com/newlogin?tabtype=weibo&gid=102803&openLoginLayer=0&url=https%3A%2F%2Fwww.weibo.com%2F
这个页面是没有分页的,每次向下滚动一部分,就会刷新一些内容,这个内容的刷新是通过页面触发js来实现的:
用开发者模式看下获取数据的接口
https://weibo.com/ajax/feed/hottimeline?since_id=0&group_id=1028039999&containerid=102803_ctg1_9999_-_ctg1_9999_home&extparam=discover|new_feed&max_id=0&count=10
可以直接在浏览器里访问这个地址:
这个接口的参数max_id 从0~10,我们可以访问11次,到11的时候就不返回数据了。
这一期,下面我们先尝试爬取下这个接口,编写weibo.py
import json
import scrapyclass WeiboSpider(scrapy.Spider):name = "weibo"allowed_domains = ["weibo.com"]# 设置初始的 max_id 列表max_ids = list(range(11)) # 从 0 到 10def __init__(self, *args, **kwargs):super(WeiboSpider, self).__init__(*args, **kwargs)self.total_status_count = 0 # 初始化总状态数量# # 定义要添加的 Cookie# cookies = {# 'SUB': '_2AkMRj066f8NxqwFRmf0TzGrkbI5yzA_EieKn079hJRMxHRl-yT9yqnEOtRB6Og9gVYRlK8MjyNQS8SoFk1YpK2-AQy9y',# 'SUBP': '0033WrSXqPxfM72-Ws9jqgMF55529P9D9WFgPmLBUsy6MwsMC5xnJgRR',# 'XSRF-TOKEN': 'izuNFQukjrNwDKLkHMPEzOzg',# 'WBPSESS': 'Av_uyMf5J_yRg2sn7ncLQTeiuJdSBhgltfM3mRx0MxWwamUSH7h4GvtzB0GGitRMjUKnTWeiDcCehmYUuP91JYDPKmR5nREclKR8dN5CqqPRIVVOrSM8MeotWgLhMj4ZKpRmWZp_c0ZUOq1_89nkTf6YXHjfXOTV1W07ZchOugw='# }def start_requests(self):# 从文件中读取 Cookiecookies = self.load_cookies('cookies.txt')# 循环生成请求for max_id in self.max_ids:url = f'https://weibo.com/ajax/feed/hottimeline?refresh=2&group_id=1028039999&containerid=102803_ctg1_9999_-_ctg1_9999_home&extparam=discover%7Cnew_feed&max_id={max_id}&count=10'yield scrapy.Request(url=url, callback=self.parse, cookies=cookies)def load_cookies(self, file_path):"""从指定文件加载 Cookies"""cookies = {}with open(file_path, 'r', encoding='utf-8') as f:# 读取整行并按分号分割cookie_line = f.read().strip()for cookie in cookie_line.split(';'):key, value = cookie.strip().split('=', 1) # 分割键和值cookies[key] = valuereturn cookiesdef parse(self, response):# 解析 JSON 数据data = json.loads(response.text)# 检查 'statuses' 是否存在if 'statuses' in data:statuses = data['statuses']for status in statuses:mid = status.get('mid') # 获取 mid 值if mid: # 如果 mid 不为空self.log(mid) # 打印 mid 值screen_name = status.get('user').get('screen_name')if screen_name:self.log(screen_name)status_count = len(statuses) # 当前请求中的状态数量self.total_status_count += status_count # 累加总状态数量self.log(f'总共爬取: {self.total_status_count}') # 记录当前请求的状态数量else:self.log("No statuses found in the response.")
在与scrapy.cfg同级目录新增一个cookies.txt,把浏览器里面的cookies直接粘贴进去(并不需要登录微博):
SUB=_2AkMRj066f8NxqwFRmf0TzGrkbI5yzA_EieKn079hJRMxHRl-yT9yqnEOtRB6Og9gVYRlK8MjyNQS8SoFk1YpK2-AQy9y; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9WFgPmLBUsy6MwsMC5xnJgRR; XSRF-TOKEN=izuNFQukjrNwDKLkHMPEzOzg; WBPSESS=Av_uyMf5J_yRg2sn7ncLQTeiuJdSBhgltfM3mRx0MxWwamUSH7h4GvtzB0GGitRMjUKnTWeiDcCehmYUuP91JYDPKmR5nREclKR8dN5CqqPRIVVOrSM8MeotWgLhMj4ZKpRmWZp_c0ZUOq1_89nkTf6YXHjfXOTV1W07ZchOugw=
测试了一下,总共可以爬取220条数据
4 小结
4.1 cookies
读取这个接口必须cookies,本文系统cookies可以从浏览器里获取,然后粘贴到cookies.txt里,爬虫会读取这个文件内容加到scrapy.Request中。
4.2 能否爬取能多?
是可以的,登录微博后再取的cookies可以爬取更多,不过测试下来,后面页数会有重复数据出现,具体的机制还不清楚。
anyway, 这个系列才刚开始,各位读者先收藏一波,多谢。