今天逛论坛的时候发现了一篇关于B站视频爬取的帖子
求助抓B站视频接口 (出处: 吾爱破解论坛)
B站视频的爬取已经多到烂大街了,原理也有很多种,最常见的还是用ffmpeg或者别的方法将视频流碎片m4s合并起来
而这个API居然直接可以爬取到完整的视频
[Python]
纯文本查看 复制代码
api_url = 'https://api.bilibili.com/x/player/playurl?cid={}&avid={}&qn={}&otype=json&requestFrom=bilibili-helper'
因此,我去抓包试了下,但是对API的来源同样难以找到
在b站找了下最近新的API分享:
https://www.bilibili.com/read/cv3430609
里面没有关于 api.bilibili.com/x/player/playurl 的内容
根据经验我尝试从B站个人主页下手
经过一番努力,我成功找到了以下内容

1.png
api_1

1 (1).png
api_2
甚至发现了奇怪的东东

1 (2).png
api_3

1 (3).png
json_1
但是很可惜,因为其中一点关于视频播放的东西都没有.
无可奈何走一遍别人走过的路,老老实实点开视频抓包~
首先想到的当然还是和video有关的

2.png
getvideo
很可惜并没有很重要的内容,于是转而去研究play.so,同样没有重要的数据,但是绝对在里面有重要的内容,不可奈何打不开

TIM图片20200629144150.png
play.so

2.2.png
fangwen
这就很难下手,于是尝试了对m4s文件分析一下
对文件大小排序,拿到源文件片段

2.10.png
m4s

2.11.png
m4s

2.12.png
m4s
改了改其中的参数,列如
deadline: 1593419974
发现结果没有两样,只是片段m4s的地址,又试着将参数删了部分,最后摸索出来如果有nsb=1就会出403

2.22.png
如果没有就会出949,显然没有其他可以研究的路了
看了看m4s的乱码内容,没有丝毫头绪了,点开Initator,点开其中一个js

xiwang.png
js
突然找到的希望,这肯定不是凭空来的,又找了下js内的内容

js.png
js
发现这种API是有很多类似的,应该是为了PC,app等不同的配备,还有新版旧版的区别
翻上去一看是我自己的bilibili Evolved脚本代码,白高兴一场,但是同时也明白了肯定在什么地方会有这个API,或者是旧版本的接口,或者是其他地方里面拼接的比较隐蔽,
这时候加载的视频也放完了

demo.png
demo
看着刷出来的推荐视频的链接,突然想到,会不会在这个时候的视频链接没有被封装直接是API,
找了下最后一段时间抓到的包

TIM截图20200629135439.png
end
果然抓到了!
打开内容看了一眼

awo.png
json_2
居然是很多个片段的地址!!!
由此终于找到了API的来源:源自视频加载完后的视频推存,这时候会调用的是完整的裸露的API,可以直接调用来使用爬虫下载
心急吃不了热豆腐,虽然js中一定可以分析出这个API,但是毕竟是动态的加载,加载完之后的视频推荐或者跳转到下一个视频可能就是关键~
[Python]
纯文本查看 复制代码
api_url = 'https://api.bilibili.com/x/player/playurl?cid={}&avid={}&qn={}&otype=json&requestFrom=bilibili-helper'