【爬虫】批量下载B站收藏夹视频 - Python

news/2024/11/7 5:37:37/

批量下载B站收藏夹视频

  • 起因
  • 开发过程
  • 环境需求
  • B站API介绍
    • 收藏夹基本信息
    • 收藏夹中各个视频的AV号
    • 收藏夹中各个视频的BV号
  • 最终代码

起因

不知道大家在浏览自己的B站收藏夹的时候,有没有遇到这样的情况:自己之前的收藏的视频不见了。

然后,一脸懵逼的对着自己的收藏夹发呆,懊恼自己为啥只收藏不下载,捶胸顿足,后悔万分。

综上所述,处于对视频的惋惜以及希望不要再发生这样的事情。写了一个批量下载B站收藏夹视频的python脚本。

以下讲述整个过程。喜欢直接发车的,请跳转到最终代码。


开发过程

人问:为什么我要重复造轮子呢?下载B站视频的工具那么多?

答曰:是的,下载B站视频的工具确实多。但是(Tempermonkey, Chrome Extension, Github, Baidu, Google)确实没有 批量 下载 收藏夹 视频的工具。

于是,我开始了思考,如何批量下载收藏夹视频。

  1. 首先,我想到的是我正在使用的油猴脚本 Bilibili Evolved. 该脚本自带下载功能。能识别单个视频和番剧,但是收藏夹不行。
  2. 然后,我又想到它自带的批量下载功能。但是,这项功能需要输入av号且目前只支持av号。
  3. 因此,我想到了通过爬虫批量获取收藏夹中的bv号,在通过算法得出av号。看了B站专栏上用户樱花三味线发布的复杂算法,果断放弃。
  4. 开玩笑,是打算按着这个原理,自己写一个转换器的。接下来打开Jupyter otebook, 开始尝试通过requests获取收藏夹视频列表及其bv号。
  5. 尝试通过登陆后的收藏夹界面获取,失败。因为requests很难模仿b站的登陆。尝试使用Cookie模式登陆,发现不方便。
  6. 之后发现,收藏夹中的 播放全部 按钮打开的播单,不需要登录即可访问。
  7. 尝试使用requests获取播单的html文件,发现全是js脚本。并没有任何html元素。立马明白了,b站的页面是页面打开之后,再动态加载的。
  8. 打开chrome的控制台,刷新界面,通过排查网页发出的请求。发现了b站的获取播放列表信息api。
  9. 期间,发现了python写的视频下载工具:you-get。但是,它下载速度并不快(我的电脑不快,但是我另一台电脑,在腾讯和优酷上挺快的)。于是,果断使用多进程。

环境需求

  • Python 3.6+ 环境
  • pip install you-get
  • pip install requests
  • pip install multiprocessing

B站API介绍

收藏夹播放网址一般为:https://www.bilibili.com/medialist/play/ml941734307/p1 , 其中ml941734307为收藏夹id号

收藏夹基本信息

API地址:https://api.bilibili.com/x/v1/medialist/info?media_id=xxxxxx
将列链接中的xxxxx替换为收藏夹的id号941734307,即可获得收藏夹基本信息。

收藏夹中各个视频的AV号

API地址:https://api.bilibili.com/x/v1/medialist/resource/ids4Player?media_id=xxxxxxx

将列链接中的xxxxxxx替换为收藏夹的id号941734307,即可获得收藏夹中所有视频的av号(收藏的视频所属播单 的其他视频除外

收藏夹中各个视频的BV号

通过一下的api可以获取收藏夹播放列表中所有的视频信息(json格式)
API地址:https://api.bilibili.com/x/v1/medialist/resource/list?type=3&biz_id=941734307&offset_index=0&from=web&first_page=true&ps=1000

其中

  • type=3 表示列表的类型,不要变动。没有具体研究,目前只知type=2的列表需要登录,type=3不需要
  • biz_id=730696607 收藏夹的id
  • offset_index=0 从收藏夹中的第几个视频开始往后读取
  • from=web 表示请求来自web
  • first_page=true 当前为第一页
  • ps=1000 每次获取多少个视频的info
    • 这里设置为1000,因为自定义收藏夹最大为1000,可以保证一次性获取到所有的视频信息
    • 设为1000,有时会报错。该API获取播单所有视频的信息(包括视频所属其它播单),若收藏夹中保存了过多其它播单的视频,会导致json字符串过长,超出b站的限制,导致报错。 酌情修改。

最终代码

import requests
from multiprocessing import Pool
import osdef analyse_palylist(ml_link):#获取收藏夹播放列表idml_id = ml_link.split(r'/')[-2][2:]#获取收藏夹基本信息及名称info_api = 'https://api.bilibili.com/x/v1/medialist/info?media_id='+ml_idinfo_res = requests.get(info_api)collection_name = info_res.json()['data']['title']#获取播放列表的所有视频的链接list_api = 'https://api.bilibili.com/x/v1/medialist/resource/list?type=3&biz_id='+ml_id+'&offset_index=0&from=web&first_page=true&ps=1000'res = requests.get(list_api)video_infos = res.json()video_list = video_infos['data']['mediaList']video_link_list = [video_info['short_link'] for video_info in video_list]return collection_name, video_link_listdef download_video(save_dir, link):cmd = r'you-get -o "'+ save_dir +'" "'+ link+'"'os.system(cmd)def current_batch_download(collection_name, save_dir, link_list):p = Pool(8)for link in link_list:p.apply_async(download_video, args=(save_dir,link))p.close()p.join()print(collection_name+" is done...")if __name__ == '__main__':ml_link_list = ['收藏夹网址','https://www.bilibili.com/medialist/play/xxxxxx/p1']base_dir = r'G:\\B站收藏夹\\'for link in ml_link_list:collection_name, video_link_list = analyse_palylist(link)save_dir = base_dir + collection_nameif not os.path.exists(save_dir):os.mkdir(save_dir)print("Start "+collection_name+ " donwloading...")current_batch_download(collection_name, save_dir, video_link_list)

其实,除了使用you-get下载视频之外,还有可直接调用B站的API下载视频其音频,然后在合并成一个视频。没错,B站确实把音频和视频分开来传输了。这也是为什么,明明B站视频缓冲了,但是你还能听到的原因。播放器同时播放音视频。

不过,这个功能在这里并没有实现,就不多细说了。有兴趣的同学可以自行研究。

以上。


http://www.ppmy.cn/news/601526.html

相关文章

html5个人收藏页面,safari个人收藏全不见 大侠不过一剑之遥是倚天的新版本吗?...

大侠不过一剑之遥是倚天的新版本吗? 倚天回馈福袋-大侠不过一剑之遥-倚天官方网站-腾讯倚天回馈福袋-大侠不过一剑之遥-倚天官方网站-腾讯游戏-腾讯侠文化网页游戏 ...倚天 回馈 搜索资料 本地图片 图片链接 代码 提交回答 匿名 回答自动保存中 CSS布局HTML小编今…

个人收藏夹

myeclipse 添加自动提示 http://jingyan.baidu.com/article/95c9d20df6c56aec4e7561ad.html 在eclipse中关联源代码 http://blog.csdn.net/longyuhome/article/details/8497505 MyEclipse看不见SVN图标 http://blog.csdn.net/huhai463127310/article/details/6003913 修改Ec…

傲游浏览器如何显示收藏夹栏 傲游浏览器显示收藏夹栏的方法

傲游浏览器如何显示收藏夹栏?很多人使用的浏览器的时候,都会把自己喜欢的网站收藏起来,下次要浏览可以直接进入,要是傲游浏览器的收藏栏突然不见了,要怎么办呢,下面就给大家分享具体步骤。 方法1: 1、在…

收藏夹也能执行javascript代码

如何让收藏夹&#xff08;书签栏&#xff09;执行javascript代码 HTML页面在浏览器中可以运行是总所周知的&#xff0c;但是你肯定不知道浏览器书签栏也是可以执行javascript代码的。 1、首先创建这么一个index.html文件 <!DOCTYPE html> <html lang"zh-CN"…

TIA博途软件中程序编辑区标题上的收藏快捷指令取消了,如何恢复显示?

TIA博途软件中程序编辑区标题上的收藏快捷指令取消了&#xff0c;如何恢复显示? 对于刚接触博途软件的小伙伴来说,上手还是需要一些时间的,如果在使用时,不小心把程序编辑区上方收藏的快捷指令取消了,如果进行显示呢? 如下图所示, 我们只需要在右侧收藏夹空白处右击,勾选&q…

Microsoft edge升级之后收藏夹内容丢失_再见了,老Edge,再见了,Microsoft Edge

这是我头一回发东西,不管是在QQ空间微博或是B站。主要是为了纪念一下,跟随我很多年的Edge。 记得第一次遇到它是在Windows10系统出来的时候,当时还没有太注意,把它当IE浏览器用了。虽然早就注意过这个和IE不一样的图标,看起来不一样的浏览器,但让我真正意识到它的名字还是…

[linux] .git/objects/pack 删除git的大文件

参考&#xff1a;git进阶 | 03 -如何彻底删除git中的大文件_git 删除大文件_Mculover666的博客-CSDN博客 &#xff08;1&#xff09;查看当前5个大文件 git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | …

在 CentOS 上安装 Docker Engine

文章目录 在 CentOS 上安装 Docker Engine先决条件操作系统要求卸载旧版本 安装方法使用 rpm 存储库安装设置存储库安装 Docker Engine安装最新版本安装指定版本 以非 root 用户身份管理 Docker配置 Docker 以使用 systemd 启动 参考官方文档&#xff1a; https://docs.docker…