吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6585|回复: 14
收起左侧

[Python 转载] Python爬取b站视频并分析视频清晰度问题

[复制链接]
BienBoy 发表于 2022-1-23 17:07
本帖最后由 BienBoy 于 2022-1-23 17:11 编辑

最近在学爬虫,准备把b站视频爬下来练练手。
一、请求分析
b站视频采用m4s文件,将视频分段传输。以https://www.bilibili.com/bangumi/play/ep402232视频为例,打开检查,找到network选项,选择Fetch/XHR,并筛选出m4s文件,如图。

1.jpg

打开一个查看,可以看到请求的url。

2.jpg

查看请求头,其中有一个重要参数range: bytes=996-4603,表示请求的m4s文件是视频的哪部分片段,在爬取视频时,将其更改为range: bytes=0-xxxxxx,xxxxxx为请求的数据总量,我们可在响应头中查看到。

3.jpg


4.jpg

图中响应头中的参数Content-Range: bytes 996-4603/137773542,137773542即为数据总量。故爬取时将range设置为bytes=0-137773542即可爬取完整视频。或者,可以将总量设置为一个极大的数,只要比数据总量大,都可以获得完整视频。
二、获取视频的下载url
在批量下载视频时,显然不应每次人工去查看下载url。但是,下载url中未知参数过多,我们显然无法直接构造出来。索性,在网页的html文件中,已经包含了视频的下载url。
我们找到网页的初始html文件。


5.jpg

我们可以将响应体复制出来以便分析。在script标签内部,我们可以找到一组名为data的JSON格式的数据。如图。

6.jpg

可以看到,里面包含了许多的网址,我们将这组数据拿出来,json格式化以便分析。格式化之后,清晰地看到有两组数据,一组“video”数据,一组“audio”数据,分别存储了视频和音频的url。

7.jpg


8.jpg

可以和network中的请求url对比,可以发现,两组数据第一组数据中的base_url后面的url与network中的请求url高度相似。

9.jpg
三、简单粗暴,直接爬取


到了这里,如果只想把视频爬下来的话,已经完全可以实现了。只要在video和audio两组数据中,分别用正则表达式提取出base_url就可以分别获得video和audio的下载url。

四、深入分析data数据中的大量url,实现下载不同清晰度的视频


深入分析data数据,我们可以发现一些规律。在video和audio这两组数据之前,还有一些比较简明数据。其中support_formats说明了这个视频支持的画质。其中的quality是不同清晰度的代码表示。



10.jpg

我们再看回之前的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的视频验证一下猜测,结果如下:


11.jpg

至此,对python爬取不同清晰度视频的分析就结束了。不过除了视频清晰度的分析,我们在data数据中还可以看到,实际上,高码率 1080p,高清 1080p,高清 720P,清晰 480p,流畅 360p对应的视频格式分别为:hdflv2,flv,flv720,flv480,mp4;url中的mid其实就是自己的b站账号id……
关于爬取b站视频的代码,之后有时间我会再单独写一下。

免费评分

参与人数 6吾爱币 +12 热心值 +5 收起 理由
萌新与小白 + 1 + 1 热心回复!
iandros + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
zhu0598 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
潇洒小洋哥。 + 1 + 1 用心讨论,共获提升!
zjun777 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| BienBoy 发表于 2022-1-24 10:12
wang2019 发表于 2022-1-24 03:34
楼主请问在 二、获取视频的下载url  找不到响应咋办

是找不到html文件吗?是的话刷新一下,记得把之前筛选m4s文件的条件清除一下
 楼主| BienBoy 发表于 2022-1-24 10:10
mscsky 发表于 2022-1-24 09:41
高码率要会员吧

嗯,不过需要登陆才能看的清晰度好像不登陆也可以爬取
036豪 发表于 2022-1-23 21:10
老哥的爬虫厉害啊,相关资料需要哪些呢?0基础
a66558461 发表于 2022-1-23 21:12
思路很明确,但没有基础,还是不好普及开来.大多数应该是看得一头雾水
shinexieonline 发表于 2022-1-23 21:28
牛人很多
罗通晓 发表于 2022-1-24 03:26
github上有现成的,可以参考一下
wang2019 发表于 2022-1-24 03:34
楼主请问在 二、获取视频的下载url  找不到响应咋办
默不言 发表于 2022-1-24 09:16
036豪 发表于 2022-1-23 21:10
老哥的爬虫厉害啊,相关资料需要哪些呢?0基础

哔哩哔哩有很多的基础课程
mscsky 发表于 2022-1-24 09:41
高码率要会员吧
亿联网络 发表于 2022-1-24 09:41
这个弄下来的链接是无水印的?
yaojiahong 发表于 2022-1-24 10:01
我准备尝试一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 20:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表