前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >顺手写了个 B 站视频下载器

顺手写了个 B 站视频下载器

作者头像
月小水长
发布2020-04-24 16:17:38
9700
发布2020-04-24 16:17:38
举报
文章被收录于专栏:月小水长

我为什么要写 B 站视频爬虫

这几天沉迷于 B 站的某些剪辑,洗脑循环中,如 up 主 上天下 的《白蛇:缘起》无对白版片尾曲《前世今生》完整版4分06秒 演唱:龚笑笑,链接如下

https://www.bilibili.com/video/BV1Qb411q7Xu

面对这样一个深得我心的视频,我脑海里瞬间冒出了下载到本地这个需求,一来方便离线播放,二来可以进行再创作(当然会注明出处~),于是乎,我上网查找了 B 站视频下载爬虫。

关于 B 站视频爬虫背后那些事

不查不知道,搜到好多可以下载 B站视频的插件或库,you-get(https://github.com/soimort/you-get/releases/tag/v0.4.486)和 IDM(一款多线程下载工具,有 exe 版和浏览器插件,可以嗅探并下载 web上的媒体文件,包括图片、音频、视频),我试了下,然并软,由于 b 站技术迭代,各种插件软件未能及时更新,坑太多,放弃了,还是自己写个吧~

神奇的是,我居然在搜到了自己以前写的一个b站视频爬虫(https://blog.csdn.net/ygdxt/article/details/84501500),我欣喜若狂地试了下,发现果然不行了,查阅资料改了 json 解析的一处代码,又可以跑起来了:

代码语言:javascript
复制
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 字...

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 月小水长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 我为什么要写 B 站视频爬虫
  • 关于 B 站视频爬虫背后那些事
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档