Python爬取b站视频并分析视频清晰度问题
本帖最后由 BienBoy 于 2022-1-23 17:11 编辑最近在学爬虫,准备把b站视频爬下来练练手。
一、请求分析
b站视频采用m4s文件,将视频分段传输。以https://www.bilibili.com/bangumi/play/ep402232视频为例,打开检查,找到network选项,选择Fetch/XHR,并筛选出m4s文件,如图。
打开一个查看,可以看到请求的url。
查看请求头,其中有一个重要参数range: bytes=996-4603,表示请求的m4s文件是视频的哪部分片段,在爬取视频时,将其更改为range: bytes=0-xxxxxx,xxxxxx为请求的数据总量,我们可在响应头中查看到。
图中响应头中的参数Content-Range: bytes 996-4603/137773542,137773542即为数据总量。故爬取时将range设置为bytes=0-137773542即可爬取完整视频。或者,可以将总量设置为一个极大的数,只要比数据总量大,都可以获得完整视频。
二、获取视频的下载url
在批量下载视频时,显然不应每次人工去查看下载url。但是,下载url中未知参数过多,我们显然无法直接构造出来。索性,在网页的html文件中,已经包含了视频的下载url。
我们找到网页的初始html文件。
我们可以将响应体复制出来以便分析。在script标签内部,我们可以找到一组名为data的JSON格式的数据。如图。
可以看到,里面包含了许多的网址,我们将这组数据拿出来,json格式化以便分析。格式化之后,清晰地看到有两组数据,一组“video”数据,一组“audio”数据,分别存储了视频和音频的url。
可以和network中的请求url对比,可以发现,两组数据第一组数据中的base_url后面的url与network中的请求url高度相似。
三、简单粗暴,直接爬取
到了这里,如果只想把视频爬下来的话,已经完全可以实现了。只要在video和audio两组数据中,分别用正则表达式提取出base_url就可以分别获得video和audio的下载url。
四、深入分析data数据中的大量url,实现下载不同清晰度的视频
深入分析data数据,我们可以发现一些规律。在video和audio这两组数据之前,还有一些比较简明数据。其中support_formats说明了这个视频支持的画质。其中的quality是不同清晰度的代码表示。
我们再看回之前的base_url:https://upos-sz-mirrorhw.bilivideo.com/upgcxcode/54/43/330304354/330304354_nb2-1-30112.m4s……,不难发现,在其中出现了一个和quality相关的部分330303894_nb2-1-30112,这是否表示着视频的清晰度呢?
我们回到网页,打开network,调整视频的清晰度。可以发现,当清晰度从“1080p 高码率”切换到“1080p 高清”时,330303894_nb2-1-30112这一部分部分的确变为了330303894_nb2-1-30080!这无疑说明,在url中这一部分确实表示了视频的清晰度。
回到data那组json数据,我们可以发现其中的url主要有两类:backupUrl与base_url。联系backup的词义(备份),可以猜测,backupUrl可能是在base_url指向的文件出错时使用的url。我们将330303894_nb2-1-30XXX部分相同的backupUrl与base_url视为相同的url。这时,video中的大量url就根据清晰度不同分了类。
通过比较发现,虽然b站网上上视频清晰度只有5种选择,video数据中却有10种url。
30112(高码率 1080p)
30102
30080(高清 1080p)
30077
30066
30064(高清 720P)
30033
30032(清晰 480p)
30016(流畅 360p)
30011
除此在这组数据之外,B站还有30116(1080p 60帧)的清晰度。
同理,audio中也可以发现三类音频:30280,30232,30216。不过在b站看视频时,都是用的30280的音频。
再通过python爬取不同url的视频验证一下猜测,结果如下:
至此,对python爬取不同清晰度视频的分析就结束了。不过除了视频清晰度的分析,我们在data数据中还可以看到,实际上,高码率 1080p,高清 1080p,高清 720P,清晰 480p,流畅 360p对应的视频格式分别为:hdflv2,flv,flv720,flv480,mp4;url中的mid其实就是自己的b站账号id……
关于爬取b站视频的代码,之后有时间我会再单独写一下。 wang2019 发表于 2022-1-24 03:34
楼主请问在 二、获取视频的下载url找不到响应咋办
是找不到html文件吗?是的话刷新一下,记得把之前筛选m4s文件的条件清除一下 mscsky 发表于 2022-1-24 09:41
高码率要会员吧
嗯,不过需要登陆才能看的清晰度好像不登陆也可以爬取 老哥的爬虫厉害啊,相关资料需要哪些呢?0基础 思路很明确,但没有基础,还是不好普及开来.大多数应该是看得一头雾水 牛人很多 github上有现成的,可以参考一下 楼主请问在 二、获取视频的下载url找不到响应咋办 036豪 发表于 2022-1-23 21:10
老哥的爬虫厉害啊,相关资料需要哪些呢?0基础
哔哩哔哩有很多的基础课程 高码率要会员吧 这个弄下来的链接是无水印的? 我准备尝试一下
页:
[1]
2