我为什么要写 B 站视频爬虫
这几天沉迷于 B 站的某些剪辑,洗脑循环中,如 up 主 上天下 的《白蛇:缘起》无对白版片尾曲《前世今生》完整版4分06秒 演唱:龚笑笑,链接如下
面对这样一个深得我心的视频,我脑海里瞬间冒出了下载到本地这个需求,一来方便离线播放,二来可以进行再创作(当然会注明出处~),于是乎,我上网查找了 B 站视频下载爬虫。
关于 B 站视频爬虫背后那些事
不查不知道,搜到好多可以下载 B 站视频的插件或库,you-get(https://github.com/soimort/you-get/releases/tag/v0.4.486) 和 IDM(一款多线程下载工具,有 exe 版和浏览器插件,可以嗅探并下载 web 上的媒体文件,包括图片、音频、视频),我试了下,然并软,坑太多,放弃了,还是自己写个吧~
神奇的是,我居然在搜到了自己以前写的一个 b 站视频爬虫(https://blog.csdn.net/ygdxt/article/details/84501500),我欣喜若狂地试了下,发现果然不行了,查阅资料改了 json 解析的一处代码,又可以跑起来了:
def parseHtml(self,html):
#用pq解析得到视频标题
doc = pq(html)
video_title = doc('#viewbox_report > h1 > span').text()
#用正则、json得到视频url;用pq失败后的无奈之举
pattern = r'\<script\>window\.__playinfo__=(.*?)\</script\>'
result = re.findall(pattern, html)[0]
temp = json.loads(result)
# 改了此处,原来是 temp['durl']
for item in temp['data']['durl']:
if 'url' in item.keys():
video_url = item['url']
return{
'title': video_title,
'url': video_url
}
好事多为,有的视频可以正确下载,而有的下载下来是 0kb,我觉得事情肯定没这么简单。进一步查阅资料得知,B 站 2018 前使用的视频格式都是 flv 的,后面技术升级转成 dash 了(可参见 b 站通知:https://www.bilibili.com/read/cv855111),而我之前的爬虫只是针对 flv 的,所以只能下载某些视频。
不仅如此,后面的视频都是声音和图像分离的,下载一个完整的视频我们需要分别下载视频和音频,视频和音频的地址获取和我之前的代码大同小异,不过要注意一点是,下载音视频必须先向 b 站发一个 OPTIONS 请求,我们常用 GET/POST,这个 OPTIONS 可能用的比较少,不过在 requests 库中使用方式区别不大,然后合成,合成音视频的主流库首选 ffmpeg ,嗯,大致有了个技术路线。
插一句,就在上一个月(2020/3/23),B 站将视频 av 号升级到了 BV 号
一直以来,AV号都是B站视频稿件的重要标识,在视频的传播和分享中起到了关键作用。
为了保护稿件信息安全,容纳更多投稿,维护UP主的权益,自2020年3月23日起,AV号将全面升级为BV号。与纯数字的AV号不同,BV号是一段由数字和大小写字母组成的字符串,经过算法自动生成。未来将统一使用BV号作为稿件标识。
同时,2020年3月23日前生成AV号的相关功能保持不变。例如,已分享的稿件链接,AV号搜索,以及动态、评论、私信中的高亮跳转。
此外,用户在复制BV号或者包含BV号的链接后,打开B站APP的同时会自动跳转至该视频
简而言之,就是 2020年3月23日之前的视频都是通过 av 确定的,现在也可以通过 BV 号确定,但是 2020年3月23日之后的视频,就只是 BV 号索引了。
所以我们干脆直接根据 BV 号爬取,网上的绝绝大部分 b 站视频爬虫都是针对 av 号的。
至于我是如何将思路写成代码,一并其中遇到的坑,此处可以省略 1 w 字...
还是直接看怎么获得该工具并使用吧~
如何使用
请欣赏下面这段演示视频,一目了然
关注公众号 月小水长,后台回复,干杯,即可获得下载工具
为了方便使用,将 ffmpeg 环境一并集成到下载工具中,无需重新配置 ffmpeg 环境,也无需配置 Python 环境,开箱即用~