爬虫(二)——Bilibili 视频获取
本文最后更新于245 天前,其中的信息可能已经过时,如有错误请发送邮件到lysun26@163.com

前言

首先需要声明的是,如果你不是大会员,就没法爬取到大会员才能看的视频,即只能爬你能看到的视频。(悄咪咪的说,你可以用别人的大会员账号登录一下浏览器,然后把 cookie 记下来,就可以下大会员视频了)。另外,爬取480P以上的视频,需要添加cookie。

抓包

首先,我们就去找视频对应的包。我们随便打开一个视频,按 F12,然后刷新页面,如下:

可以看到有两个名字很显眼,分别是 1298370763-1-30102 和 30280,然后我们点开,查看响应结果,发现是一堆乱码,这时我们就可以猜测这两个文件大概率就是视频所对应的包了,一般音频和视频的响应数据,查看的话就是乱码。然后去查看标头,可以看到类型为 video/mp4,就基本可以确认了。

那么这两个包具体有什么区别呢?我们可以去 python 中,写代码请求一下,看看得到的文件是什么样的。

这里推荐一个网站, https://curlconverter.com/python/ 。这个网站可以快速生成请求代码,使用方法如下:

然后将复制的结果粘贴到网站中,就可以快速生成代码了。将文件下载下来之后,可以发现视频的时间很短,这时可以猜测视频是分段存储和播放的。然后也可以发现,30102 对应的文件是只有画面,没有声音,而 30280 对应的文件是只有声音,没有画面。这时就很清晰了,30280 对应的音频文件,30102 对应的视频文件。此时文件的位置已经确定了,接下来就是对请求头的分析了。

分析

通过观察 Headers,可以发现有一个 Range,后面是"bytes=5873944-6613096",结合前面的分析,很显然,这个就代表了视频的哪一段。因此,我们可以将其改成 0 开头,然后以一个很大的数结尾,改成"0-100000000000"试一试,发现果然得到了完整的视频。好了,接下来就是对 url 进行分析了。url 如下:

https://xy58x218x65x48xy.mcdn.bilivideo.cn:4483/upgcxcode/63/07/1298370763/1298370763-1-30102.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1697274367&gen=playurlv2&os=mcdn&oi=1786350859&trid=000069aae7622d194378b008d5bdecd0a8fau&mid=383582195&platform=pc&upsig=f4d46e3c4f716b974ab7e7cbd5c734a2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&mcdnid=14002137&bvc=vod&nettype=0&orderid=0,3&buvid=CE3C8865-9B51-484D-D665-F55C56F0EBDB58781infoc&build=0&f=u_0_0&agrr=1&bw=127451&logo=A0002000

我们视频的网址一般是 https://www.bilibili.com/video/BV1FN4y117bR/ 。显然这两个是毫不相关的。因此,我们需要去寻找这个视频的 url 是在哪个包中。我们复制其中的 1298370763,在开发者工具中搜索。

显然,第一个的名字是 videoshot,就很不像。然后我们先去第二个,然后并没有发现视频的 url。然后我们就去第三个,发现就在这里面,且这个正好是请求网址返回的 HTML 文件。通过查看 Headers 也不难看出来,请求的 url 正好是浏览器上方的 url。

这时我们直接去 Element 中寻找,如下:

显然,视频的 url 就在 script 标签下,并且可以发现,playinfo 后面的是一个 json 数据,而视频的 url 就在这些 json 数据中。那么,我们就可以从该 HTML 中提取出这些内容了。

提取

xpath

首先,我们采用 XPath 方法进行提取,我们直接复制 XPath,得到 /html/head/script[4]。然后利用 text 方法,即 /html/head/script[4]/text() 得到其中的内容。然后我们将前面的 window.__playinfo__= 去掉,直接采用 python 的字符串的方法,比如 res = res[20:] 即可。然后将其转换为字典数据,就可以取出其中的视频 url 了。

正则表达式

直接去网站测试一下。所以就可以用 window.__playinfo__=(.*)<\/script><script>,然后就 ok 了。

结果分析

通过对提取出来的结果进行分析,可以发现不同的视频质量,对应一个 id,并且同一个视频质量,有三个链接,具体有什么区别我就不知道了。视频是在 video 下,音频是在 audio 下。

视频与音频合并

这个可以借助 ffmpeg 工具,很简单。具体使用方法可以去查找,比如:

https://blog.csdn.net/weixin_43835542/article/details/109493050

最后,如果有代码问题的话,可以私聊我。这篇文章主要就是分享了找视频链接的过程。

有问题可以留言哦~ 觉得有帮助也可以投喂一下博主,感谢~
文章链接:https://www.corrain.top/scrapy-2/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章地址及作者
Loading comments...
上一篇
下一篇