600行写了个Python视频下载器? 聊聊现在的B站视频下载方法


先看看现在的B站视频下载方法
大家刷B站的时候遇到想要下载下来的视频。我们都知道电脑网页上是不提供下载缓存功能的。
目前本人已知有以下几种办法下载缓存B站的视频:
手机APP缓存:这是官方的缓存功能,但是它所缓存下来文件是音视频分开的两个文件,且后缀是m4s,其实这个文件并不是什么加密后的文件,只是一般的MP4换了个扩展名,m4s文件用视频播放器就可以直接打开,想要转成我们正常本地观看的视频,需经过音视频合并操作。
Win10 UWP客户端缓存:这个也是官方的客户端,虽然界面看起来相比手机APP比较简陋,但它在某些功能上却强于手机APP,比如视频缓存。它可以缓存视频为flv格式和mp4格式。mp4其实是和手机APP一样会将音视频分开下载,但它又可以在下载完成后自动将音视频合并。
两个官方客户端在缓存视频方面都有一个共同的缺点,他们缓存后的文件是按照稿件的aid(也就是av号),以及稿件下面每个分页视频的cid来存储。这样的方式方便程序进行识别,但对于下载的我们用户进行归档非常不便。因为我们缓存的往往不会单个视频,而是一系列。比如我需要从B站上缓存一部有100多个分P的视频课程,每个P都有自己的子标题,用APP全部缓存后得到的是一个用aid命名的文件夹,里面又有1-100编号的子文件夹,每个文件夹内又存着对应分页视频的音视频和弹幕文件。虽然这样用APP直接观看没什么问题,但这些文件依然在APP的管理下,APP随时都有可能删掉它们,所以我们就要自行复制出来归档,但一百个分页,我不可能一个一个把它们的子标题手动重新加上。这需要下载时自动对它们重命名。

下面是两个第三方的方法:
哔哩哔哩助手浏览器插件(https://github.com/bilibili-helper/bilibili-helper-o):这个直接在网页上提供了下载按钮,并拥有自动签到,直播开播提醒等多种功能。但它不具备一次性下载一个稿件下所有分页的功能,且目前版本无法缓存4K画质(这个下个版本会支持)

you-get 这个是个Python编写的视频下载器(https://github.com/soimort/you-get)。它不仅可以下载B站视频,也支持其他网站,并可以导入cookie来下载会员内容。但是它作为一个开源项目,支持的视频网站基本是不同的coder贡献代码,导致其兼容程度层次不齐,有些网站已无法解析到视频,却已长时间得不到更新。虽然它对B站的支持性还算比较完善,在看过其针对B站的源码后发现除去视频它还能解析音乐资源,并且它下载得到的视频文件也比较适合归档,但是他还是会有一定的bug:比如无法获取会员画质的flv视频,以及部分视频无法获得1080p60、720p60、1080p+画质。并且它的运行效率有点低。而且它是用命令操作的,虽然比较简单且有充分的提示信息,但对小白并不友好。

正好之前研究了下B站下载视频的接口:

虽然能达成下载的目的,但这直接调接口的方法,除去装个B,好像没啥用,我自己也不会日常用它来缓存视频。这分明是给程序调用准备的啊。
于是就有了长达三周的Python下载器开发工程(三周才600行,主要时间用在测试上了),8月2日终于达成了初步目标

我的PythonB站视频下载器
1.获取
先放上下载地址:https://github.com/Daniel2022/bilibili-downloader-py/releases (下最新的)
优先下载zip包,保证可运行,不需要另外安装Python解释器等其他支持

解压到一个文件夹,会得到三个exe程序

不下载会员内容,也还是建议导入一下cookie,这需要用火狐浏览器登录下你的账号
方法为视频:BV1WT4y1j7XN 的2P 把cookies.sqlite文件复制到上面的文件夹里



双击downloader即可开启,进入主界面

2.添加稿件(剧集)
所有输入指令有提示(字母不区分大小写)
现在还没有添加稿件或者番剧集
键入“a”回车,进入添加界面

在添加界面可批量添加av号BV号以及剧集的ep_id season_id media_id
av号BV号好理解,剧集的标识又是什么?以超炮第一季举例

我们进入观看界面:

地址栏中为https://www.bilibili.com/bangumi/play/ss425/ ss425即season_id
任选一集观看:

地址栏中为https://www.bilibili.com/bangumi/play/ep84340 ep84340为该集的ep_id
进入番剧介绍页:

地址栏中为:https://www.bilibili.com/bangumi/media/md425 md425为该季media_id(这里的数值与season_id一致,而有新番会不一样)
以上的三种编号在本程序中会均指向超炮第一季!
演示下:

3.全列表批量下载
添加好了输入“x”返回主界面

刚才添加的已经显示出来了,这时候输入指令“z”,并选择画质,会进入全列表下载:

最终程序目录下会产生downloads目录:(内容类似)


当前版本批量下载仅可下载flv格式
4.单独稿件剧集下载
从主界面输入数字选择:
由av或BV号添加的普通稿件会提示如下:

剧集会提示如下:

这时候输入指令“a”会把当前稿件或剧集的所有P的flv下载下来,过程与之前全列表下载类似,视频文件存档形式与之前一样,不做演示
单独输入数字选择P或集,会先提示选择画质(此时显示的都是该视频可用的画质),接下来会提示选择封装flv或者MP4(这个MP4和APP缓存一样先分开下载音视频再合并)
选flv会直接开始下载,选择mp4程序会检测该画质下是否存在h265编码的视频源(h265是B站正在测试的流媒体编码,仅在移动APP或UWP客户端上会使用,特点节省流量),如果存在会询问是否下载h265编码,否则会直接下载通用的h264编码

最后关闭程序之前添加的内容会被存储下来,下次运行无需在此添加。
主要功能就介绍到这儿,其实还有些功能想做,比如稿件信息刷新功能。

本项目使用开源软件aria2作下载内核,ffmpeg合并音视频
源码仓库:https://github.com/Daniel2022/bilibili-downloader-py
源码中cookie处理部分引用了you-get以及@UnGrown 的https://github.com/mo-han/mo-han-toolbox中的相关函数。

这只是介绍我这小程序的基本功能使用。
后续会更新其的概念产生,设计的框架等更深的内容,敬请期待。
Copyright @ZHY2020