python抓取腾讯视频弹幕_Python实战 | 如何抓取腾讯视频弹幕

原标题:Python实战 | 如何抓取腾讯视频弹幕

当代年轻人的快乐是网络给的。

如果有人吐槽周末太无聊,他们一定会反驳:

是追剧不香吗?

是吃鸡不好玩吗?

周末辣么短,怎么会无聊呢?

诚然,追剧和游戏已然成了这届年轻人的快乐源泉。这份快乐是多重的,网剧和游戏所扮演的角色已经不是以前那个单一的角色了,它们被赋予了新的功能——社交功能。

如果说剧情是下饭的主料,那么沙雕网友的各种爆笑弹幕便是锦上添花的佐料,让追剧更加有滋有味。

高兴了,发个弹幕,和剧友们一起分享快乐;生气了,也能发个弹幕,向剧友们尽情吐槽。

如此看来,网剧可不就是一个社交平台么?

那么弹幕该如何爬取呢?

我们以腾讯视频《天行九歌》为例,为大家细解析腾讯视频弹幕爬取的细节和难点。

写爬虫需要理清目标数据和网址的变化规律,随后再去解决细节的数据定位和抓取,往往事半功倍。

接下来先看看爬虫的一般步骤:

第一步:明确需求,确定需要抓取的字段

第二步:分析网站,寻找目标URL

第三步:分析目标URL参数,请求方式(get,post)

第四步:发起请求

1.设置请求头(User-Agent,Cookie,Host)

2.实例化一个Request对象(request.Request)

3.根据实例化的Request对象,使用request.get()或者post()方法发起请求

第五步:反爬与反反爬

1.基于headers的反爬:基于用户请求的headers反爬是最常见的反爬机制,在请求头headers中,包含很多键值对,服务器会根据这些键值对进行反爬。

2.基于用户行为的反爬:检测用户的行为是否正常,如访问频率

3.基于动态页面的反爬:使用动态网页,动态生成数据,或者动态加载,无法从源码直接查看数据

4.基于验证码的反爬:检测到异常访问可能会弹出验证码

5.基于加密的反爬:通过js来对数据进行加密或者通过css字体加密

第六步:处理响应结果

1.Ajax请求得到的一般是json数据,使用json模块处理,使用json.loads将json字符串,转为python数据类型

2.对于非结构化数据(数据在html页面中),可以使用re正则模块提取数据(xpath,BeautifulSoup,pyquery)

3.如果还有其他url需要发起请求则继续发起请求

开始你的表演

1

数据定位

打开腾讯是视频《天行九歌》视频随便选取一集,观察我们需要抓取的弹幕,可以明显看出来弹幕不是在视频上的而是浮动在视频上面,而且弹幕在视频播放之后才滚动加载,所以我们大概能得出弹幕是JS异步加载的。

按F12审查元素, 观察Network是的请求,播放开始后出现了大量请求,除了大部分图片外我们发现了一个比较特殊的请求 "danmu" ,打开这个请求后果然这就是我们要的弹幕数据。

获取到弹幕数据的URL地址

2

弹幕URL规律分析

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

我们观察请求参数的时候注意下Requet Method。这里是get请求也就是可以直接在浏览器请求URL,看能否能拿到数据。

第一个URL:

https://mfm.video.qq.com/danmu?otype=json&callback=jQuery19109468267287377041_1563457399127&target_id=4005600990%26vid%3Da0031sxc3f8&session_key=33792%2C4336%2C1563458184&timestamp=75&_=1563457399193

浏览器上请求结果:

开始暴力删除无关参数,URL?后面拼接的参数有callback, targetid, sessionkey, timestamp, 。网址最后一串数据好像是时间戳,删了试试,结果不变,是无关参数。sessiongkey到底影不影响呢?不知道可以删除试试。

最后精简成下面这个URL,只有target_id, timestamp两个是必须参数

https://mfm.video.qq.com/danmu?target_id=4005600990%26vid%3Da0031sxc3f8&timestamp=15

将第二,三, 四个请求拿出来精简

https://mfm.video.qq.com/danmu?target_id=4005600990%26vid%3Da0031sxc3f8&timestamp=45

https://mfm.video.qq.com/danmu?target_id=4005600990%26vid%3Da0031sxc3f8&timestamp=75

https://mfm.video.qq.com/danmu?target_id=4005600990%26vid%3Da0031sxc3f8&timestamp=105

对比很容易找到规律,从第一页到第二页,timestamp值从15变到了45,第二页到第三页从45到75,target_id不变。

这个规律我们可以大胆猜测这个 timestamp 值是控制页数的,并且起始值是15每30秒更新一次。

一集视频弹幕有多少页呢?如何获取最后一个timestamp的值?

这里有个小技巧,先将视频拉倒最后观察timestamp的值是多少,然后给timestamp一个远远超出最后这个值到浏览器请求,返回数据为count值为0,说明弹幕已经加载完。

接下来获取一集弹幕,只需要使用while循环timetamp给一个步长30的变量,到最后获取count为0的时候退出,就可以获取到一集的所有弹幕。

3

不同集之间URL规律分析

一集的弹幕规律搞清楚之后,我们来研究不同集之间的URL规律。

第73集精简后的URL

https://mfm.video.qq.com/danmu?target_id=4005600990%26vid%3Da0031sxc3f8&timestamp=15

第72集精简后的URL

https://mfm.video.qq.com/danmu?&target_id=3991095756%26vid%3Dl0031n48946&timestamp=465

对比不同集之间的URL发现targetid值是不一样的,猜测这个targetid决定的集数。timestamp 规律之前已经找到,这里我们将精力投入到targetid中寻找它的规律,但我们研究了几集之后发targetid除了 %26vid%3D 这一串其他的毫无规律。

那我们现在将 target_id 分成两半,我将它们称之为前缀ID,后缀ID。但从URL上面我们是找不到有用线索了,这时候我们必须转换思路回到页面上来。

后缀ID

在浏览视频页面的时候,我们发现播放视频时在播放屏右边总会显示全部集数,点击对应的集数就会进行相应的换集跳转,所以我们有理由相信target_id相关的东西就藏在其中。

检查元素,果然不出所料,html页面里就藏着后缀ID。

浏览页面源代码的时候我们发现HTML源码里面有这样一段JS,包含了所有集的后缀ID,从里面面去获取会更好。

(注意F2是正常的已上线的集,F0可能是脏数据或者是没上线的所以我们只需要去F2的数据即可获取到所有的后缀ID)

前缀ID

但遗憾的是前缀ID在页面里面并没有找到,既然页面上没有,那我们再转换下思路。页面上没有那么有可能是点击跳集的时候才请求前缀ID。

播放视频F12在不同集之间切换继续观察Network的请求, 每次切换不同集的时候有一个请求 regist 进入了我们得视线点击进去看果然里面有我们需要的前缀ID。

切换不同集观察URL变化,没有什么变化都是同一个URL。

https://access.video.qq.com/danmu_manage/regist?vappid=97767206&vsecret=c0bdcbae120669fff425d0ef853674614aa659c605a613a4&raw=1

但是我们发现每一集的请求都有一个参数变化 vecIdList,仔细一看这不就是我们的后缀ID?(注意这里使用post请求,参数是json格式)

{"wRegistType":2,"vecIdList":["s0019ub7cbi"],"wSpeSource":0,"bIsGetUserCfg":1,"mapExtData":{"s0019ub7cbi":{"strCid":"rm3tmmat4li8uul","strLid":""}}}

也就是拿到后缀id之后,再次请求获取到后缀ID。

到这里我们已经可以获取到一个完整的target_id,所有的参数以及规律都摸清楚了,已经跃跃欲试?别急梳理下思路。

4

思路梳理

第一步:搞清楚单集内部弹幕网址的动态变化,只需要改变timestamp的值即可循环爬取单集所有内容。

第二步:发现不同集之间有一个参数target_id 是变量,除了 %26vid%3D 一样外,没有规律,我们将其分成前缀ID和后缀ID。

第三步:任意一集网页中都能直接找到所有剧集的后缀ID,但无法获取前缀ID。

第四步:通过分析发现,要获取前缀ID需要通过后缀ID发送请求获取,两个ID都获取到之后拼接成 target_id=前缀ID + %26vid%3D + 后缀ID

第五步:所有参数已经获取,URL规律已经搞清楚就可以写代码了。代码较长,不在此展示了哈。

5

结果

如果你想学习更多的python知识,微信搜索“恒企行家网校”公众号,关注公众号,一起学习吧~返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值