2021.10.27上午开始,B站的网页源码中再也不包含视频音频的下载地址了,B站这样搞就算了,居然在源码中之前视频音频下载地址的位置上留下一句戏虐之语:message":"啥都木有"。

B站视频源码

当时我的第一感觉就是就尼玛离谱,我前两天才写的采集爬虫,居然又用不了了,真就过分呗。

于是在得到空闲的时候,准备再次开搞b站。

其实在之前写爬虫的时候,就翻遍了GitHub上的b站下载的python源码,大体分为两种,一种是最简单的,直接从网页源代码中提取下载链接,也就是在window.__playinfo__内,有现成的下载链接,只需要从中提取就行了。第二种则是将bv号转为av号,然后再获取cid,aid,然后再请求api进行视频下载。

现在第一种方法失效了,但是第二种方法还是可以使用的,只不过现在大多数人用的都是第一种,所以才导致市面上的软件都不能使用。

首先我们需要三个库,一个是requests,一个是json,一个是fake-useragent,分别的作用一是请求,二是将数据转化成json格式,三是获取随机的user-agent。

之后我们就开始引入库,然后简单写一个headers。

import requests,json
from fake_useragent import UserAgent

ua = UserAgent()
ua = ua.chrome

headers = {
    "User-agent": ua,
    "referer":"https://www.bilibili.com"
}

不知道大家知不知道referer是啥意思,这个是防盗链,如果不是从bilibili.com请求b站的话,大概率是请求不到数据的,所以我们就要增加上防盗链。

然后再就是我们需要获取视频链接的av号,那么我们其实应该都清楚,现在b站的视频大多都是bv号了,所以我们需要进行转化。

好吧,发现还是需要第四个库,也就是re库,对视频链接进行正则取值才行。

import re
url = 'https://www.bilibili.com/video/BV1Wf4y157tj?p=1'
bv = requests.get(url,headers=headers)
pattern =re.compile(r'/video/(.*)\?p')
bv = pattern.findall(bv.url)

简单通过正则取到视频的bv号,然后再传入b站的api中请求av号。

avapi = "http://api.bilibili.com/x/web-interface/archive/stat?bvid="

av = requests.get(avapi+bv[0],headers=headers)
av = json.loads(av.text)['data']['aid']

获取到av号也就是aid后,我们再获取cid,

cvapi = "https://api.bilibili.com/x/web-interface/view?aid="

cv = requests.get(cvapi+str(av),headers=headers)
cv = json.loads(cv.text)

写到这里突然感觉应该整个代理来用,所以就先去整个爬代理的爬虫去。

最后修改:2021 年 11 月 05 日 10 : 40 PM
如果觉得我的文章对你有用,请随意赞赏