在爬虫开发的过程中,一般情况下我们用浏览器自带的抓包工具即可完成分析,即按住F12后进入的开发者模式,但在开发者模式中,有些数据并没有抓得那么全,无法抓取到所有我们想要的数据,这个时候我们就要借助专业的抓包工具了,下面我们就用Fiddler抓取b站视频评论为例,简单讲解Fiddler的应用。
Fiddler 是一个 http 调试代理,它能够记录所有的你电脑和互联网之间的 http 通讯,Fiddler 可以也可以让你检查所有的 http 通讯,设置断点,以及 Fiddle 所有的 “进出” 的数据(如 cookie,html,js,css 等文件)。Fiddler 要比其他的网络调试器要更加简单,因为它仅仅暴露 http 通讯还有提供一个用户友好的格式。联系本站客服在网上下载安装即可,安装完成后打开的是这样的一个界面:

打开b站视频评论区,发现评论同样是Ajax动态加载的,在加载出的数据中,发现一个名为main?csrf...的包,点击进去,在预览下的data中发现replies,点开后发现正是加载出的评论。

点开其中一条评论,发现在这个包中只提供了评论中可见的子评论,‘点击查看’的其他子评论获取不到,XHR中也没有捕获到新的包。

这个时候就该我们的Fiddler登场了,看看能不能抓到更多我们所需的包,打开Fiddler后,点击‘查看更多’,可以发现Fiddler会刷新出一组包,找到Host为api.bilibili.com的包,在浏览器的开发者模式中,我们可以发现评论是Json数据,所以选择api.bilibili.com包中的Json,在data中,我们打开replies,可以发现加载出的子评论。

点击进去,展开后发现确实是加载出的隐藏子评论:

复制子评论包的url:
https://api.bilibili.com/x/v2/reply/reply?csrf=0329e0b73103f5e307b6a8bd5e212ff2&oid=69241910&pn=1&ps=10&root=1991252104&type=1

经对比分析发现只有pn参数和root参数不同,pn参数为子评论页数,root则与父评论的rpid相同,因此,我们可以请求父评论URL:

https://api.bilibili.com/x/v2/reply/main?csrf=0329e0b73103f5e307b6a8bd5e212ff2&mode=3&next=2&oid=69241910&plat=1&type=1
经分析父URL也只有pn参数不同,pn代表页数,即只需在循环中改变pn变量即可。请求成功后提取父评论以及它所携带的rpid,提取后的rpid传参给子URL的root后对子URL发起请求即可获得子评论的所有内容。
#由于不知道具体的页数,写个死循环:
while True:
response = requests.get(url, headers=headers, verify=False)
response.encoding = 'utf-8'
Json_data = response.json()['data']['replies']
if len(Json_data) == 0:#当Json_data为空时退出循环
break
#提取父评论以及子评论所需的rpid
for node in jp.Json_data:
rpid = node['rpid']
content = node['content']['message']
# 如果有子评论,爬取子评论
if node['replies'] is not None:
#传rpid给请求子评论URL所在的函数即可
getSonReplies(rpid)
至此,我们获取了b站视频的所有评论,根据需要选择相应的存储方式进行存储即可,在实际爬取过程中注意设置等待时间,避免请求频率过快被b站屏蔽。
上一条:Minitab21版本介绍
下一条:Fiddler-Inspectors