让弹幕飞一会儿——腾讯视频弹幕(39W+)爬取实战

发布时间: 2019-10-08? 来源:本站原创 作者:admin

  本文以腾讯视频(都挺好)为例,解析弹幕爬取的细节和难点,对思路感兴趣的旁友们可以跟着文章逻辑走一遍,对于想直接上手爬的同学,文末已给出完整代码。

  相对于一般电影OR电视剧评论,弹幕能够贴合剧情,进行更多有意思的脑洞分析。

  本文以腾讯视频(都挺好)为例,解析弹幕爬取的细节和难点,对思路感兴趣的旁友们可以跟着文章逻辑走一遍,对于想直接上手爬的同学,文末已给出完整代码。

  相对于一般电影OR电视剧评论,弹幕能够贴合剧情,进行更多有意思的脑洞分析。

  短短四句,揭示了两种本质——碗是大和圆的,面是长亦宽的。一秒就看清事物本质的人和一辈子才看透事物本质的人自然过着不同的人生。

  所以,写爬虫也是一样的,理清目标数据和网址的变化规律,也就是先看到碗的大和圆,面的长和宽,随后再去解决细节的数据定位和抓取(欣赏碗的花纹细节,面的Q弹),往往事半功倍。

  打开腾讯视频的电视剧(这里以《都挺好》为例),F12审查元素,默默的等待目标猎物出现,因为弹幕是播放时不断滚动出现,所以我们先假设它在JS下。

  正片开始后,一群以“danmu为开头的请求不断加载打破了短暂的平静,我们把这个疑似目标预览一下:

  果然,弹幕内容赫然在列,对于我们分析有用的字段还有弹幕的ID,upcount(点赞数),opername(用户名)和uservip_degree(会员等级)。

  到这一步,我们先不纠结于这个JSON文件要如何伪装访问,如何解析,不妨跟随那句“大碗宽面”的旋律,跳出碗来,看看这个碗是大还是圆(找规律)

  在找网址规律的时候,有一个小技巧,就是尝试暴力删掉目标网址中不影响最终结果的部分参数,再从最精简的网址中寻找规律。

  网址最后一串数据好像是时间戳,我们删掉试试,果然,返回的内容没变。那个sessiong_key到底影不影响呢?删了试试,返回内容还是没变!

  对比很容易找到规律,从第一页到第二页,timestamp值从15变到了45,其他部分没有任何变化,我有一个大胆的猜测,这个timestamp值是控制页数的变量,并且是30秒更新一次弹幕。

  那一级有多少页呢?我们把进度条拉到影片结束的边缘,发现最后一页的网址的timestamp的值变成了2565。

  整个过程,我们只需要构造步长为30的循环变量来替换timestamp参数就可以实现批量访问了。

  到这里,单集中弹幕动态更新的规律我们已经探究清楚,下面来对单个页面进行解析。

  (PS:其实大碗宽面的逻辑下,我们这个时候应该再继续对比不同集数之间网址变化规律,并找到规律本身,但考虑到内容实操性与可读性,我们不妨把这一块往后稍稍)

  以第一集第一页的弹幕为例,我们只进行简单的headers伪装,进行访问尝试:

  异常顺利,成功返回目标结果,而且是友好的JSON格式,我们用JSON来解析一下:

  告诉我们在35444的位置有字符问题,经过排查,发现错误的原因是解析的部分内容因为格式问题没有通过JSON语法检查,解决方法很简单,我们json.loads中strict参数变成Fasle即可:

  大写的EASY!要进行多页爬取,只需要在外层构造一个循环,以30为步长改变timestamp的变量即可。

  发现是target_id值和%3D后面一串ID(第一集是t00306i1e62,第二集是x003061htl5)的变化决定了不同的集数。(为了区分,我们把后面那一串ID叫做后缀ID)

  而难点就在于他们之间没有像timestamp那样明显的规律可循,弹幕内容所在的网址本身又没有任何关于两个ID的信息。

  所以,我们必须跳出碗来找线索,看看有没有又大又黑的锅装这些碗(目的在于找到存储target_id和后面不规则ID的那口大锅)。

  这个时候,需要一些常识来开路了。我们发现播放视频的时候,在播放屏右边总会显示全部集数:

  点击对应的集数就会进行相应的换集跳转,所以我们有理由相信ID相关的锅藏在其中。重新刷新网页,很容易找到了他们的踪迹:

  可以看到,最新舞台剧演出资讯_最新舞台剧娱乐新闻事件报道_明星娱乐新闻_上面截图中第一集的ID“t00306i1e62”对应着我们前面找到的规律(后缀ID)。打开任意一集,发现1-30集和31-46集相关的后缀ID都分别存储在两个相邻的网页。

  目前来说我们拿到了所有的后缀ID,但还是缺少target_id,无法构造完整的网页进行自动循环爬取。而我们在这两个网页中找不到任何和target_id有关的信息,线、死磕target_id

  这个时候就需要耐心的筛选了,最后,我们发现,单集的target_id,隐藏在XHR下的一个regist开头的动态网址中:

  第一步,我们搞清楚了单集内部弹幕网址的动态变化,只需要改变timestamp的值即可循环爬取单集所有内容。第二步,发现要自动爬取每一集,必须先找到构造网址的target_id和后缀的ID

  第三步,任意一集网页中都能直接找到所有剧集的后缀ID(我们已经拿下了所有的后缀ID),但是却只能在一集中找到单集的一个target_id。

  第四步,也就是接下来的一步,我们可以基于已经爬到的后缀ID,去循环访问每一集,拿到单集对应的target_id,这样就能构造出完整的弹幕网页所需的ID们了。

  ,只需要构造两个循环就可以实现完整的弹幕爬取(第一个循环构造每一集的基础网页,第二个循环构造单集内的弹幕页数)。目前来说,对于弹幕爬取(腾讯视频),单纯的headers伪装就能够畅通无阻,但也建议大家文明爬取,理性分析 :)

  至此,我们锅、碗和面都已经准备到位了,再把刚才各模块写的精简一些,然后就可以酣畅淋漓的吃大碗宽面了。

  声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。


Copyright © 2002-2011 DEDECMS. 织梦科技 版权所有 Power by DedeCms
赌圣心水论坛| 喜哥大型免费图库| 高手解料四字梅花诗赢钱| 正版澳门老鼠报报彩图| 精准12肖及15码中特料| 管家婆心水高手论坛| 开奖直播网| 单双精准四肖与八尾| 管家婆彩图开奖现场直播| 今晚特马|