b站视频自某年以后其缓存的视频皆为分段分开的,比较不方便。因此个人想着用python将其更加自动化。

既然视频和音频分开了,那么必然需要先请求获取视频和音频的url再通过各自的url分别获取各自的内容。最后再借助moviepy将视频和音频合成。

关于批量处理爬取,一开始想得过于复杂(当然,相较于其他更快的方式,基于此方式来说是复杂的),导致连连异常。经过一觉,发现豁然开朗。复杂点在于当找到位于network中的关键name之后,想着更加自动化的获取通用id走了不少弯路。后面才发现通用id就在网址中。

大体思路如下:在进入喜欢up主的空间后,点击播放全部(图1),

​图1

→进入新页面,发现网址(图2),并没有附着视频bv,因此需要换一种方式思考。

图2

→右键检查页面,在network栏下发现了特殊name(图3),里面包含了up主其他的视频(图4,5)。

图3

​图4

图5

→思路清晰起来了,我们可以通过请求图2页面,找到图3所示信息群,再请求该url获取json数据迭代索引获取各bv_id。

代码及分析如下:

①获取bv_id并导入相关

说明:user-agent获取在网页headers部,可自行获取键入。

②构建循环附带跳出条件

③构建bilibilispider()类

1.主体框架

说明:此处的合成视频和音频方法是调整过的,起初使用ffmpeg发现不太好使,经过交流群前辈指导改用moivepy,较方便且好使。

2.发出通用请求格式(方便

说明:global意味在于其他方法处需要请求内容。

3.请求获取标题,json数据,视频和音频url

说明:此处的title索引、jsondata索引、videourl索引、audiourl索引和上文的referer等信息皆可在图中找到,获取大概流程皆为右键检查页面获取信息(图6,7,8)。

图6

图7

图8

4.保存数据

5.合成视频和音频

说明:路径一定要对,不然找不到会报错(可以自己设置路径,前后统一即可)。后面条件语句那开始是清楚之前单独的视频和音频,合成后的名字多了加号,以防被系统按照单独的视频给误删。

起初使用ffmpeg合成视频和音频并不顺利(图9),因此改用moviepy。

图9

6.调用方法

说明:全文尽量统一

全文代码如下:

试运行:

综上,还有提升空间,比如下载速度太慢。然后是画质的选择,爬的时候默认是最高的,具体自定义画质还在研究(即文中的params貌似没啥用,待测试)。