如何批量下载b站收藏夹内的视频



最近有位朋友找我帮忙,要求是这样的:
下载他的b站收藏夹中的所有视频,并转换为音频

为什么会变成这样?主要是考虑到QQ音乐,网易云之类的平台下载的音乐大部分需要VIP,相比之下,b站一些up主上传到音乐MV就更加亲民一些。主要是这种要求我还是第一次见(貌似很冷门的样子),网上并没有检索到现成的方法,于是我总结了一下自己用到的一些方法。

思路:
1. 获取所有视频的链接
2. 写python脚本进行批量下载

首先放一下他的收藏夹:帕多露

进入收藏夹第一页,Edge浏览器中按 Ctrl+Shift+i 打开开发人员工具
然后按 Ctrl+Shift+c ,选择收藏夹中第一个视频,结构树将展开到以下位置

1
2
3
4
5
6
7
8
<div data-v-9fdc3374="" class="items">
<div data-v-9fdc3374="" class="items__item">
<div data-v-9fdc3374="" class="bili-video-card">
<div class="bili-video-card__wrap">
<div class="bili-video-card__cover">
<a class="bili-cover-card" href="https://www.bilibili.com/video/BV1Bh4y1m7mz?spm_id_from=333.1387.favlist.content.click" target="_blank">
<div class="bili-cover-card__thumbnail">
<img src="//i2.hdslb.com/bfs/archive/028de27be3f632c42b07d6387a8c84ffd5e36c7f.jpg@672w_378h_1c.webp" class="" alt="在百万豪装录音棚大声听 汪苏泷《不分手的恋爱》【Hi-res】" onload="typeof window.bmgCmptOnload === 'function' &amp;&amp; window.bmgCmptOnload(this)" onerror="typeof window.bmgCmptOnerror === 'function' &amp;&amp; window.bmgCmptOnerror(this)">

向上寻找,找到类似 <div data-v-9fdc3374="" class="items"> 的标签,右键选择 Edit as HTML 编辑为HTML,将里面的内容全部复制

1
内容太多就不展示了

然后使用正则表达式匹配其中的视频链接
正则表达式在线测试

1
https://www.bilibili.com/video/BV[A-Za-z0-9_]+\?spm_id_from=[0-9]+.[0-9]+.favlist.content.click

匹配结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
https://www.bilibili.com/video/BV1Bh4y1m7mz?spm_id_from=333.1387.favlist.content.click
https://www.bilibili.com/video/BV1Bh4y1m7mz?spm_id_from=333.1387.favlist.content.click
https://www.bilibili.com/video/BV11i421r752?spm_id_from=333.1387.favlist.content.click
https://www.bilibili.com/video/BV11i421r752?spm_id_from=333.1387.favlist.content.click
https://www.bilibili.com/video/BV1uK4y127K2?spm_id_from=333.1387.favlist.content.click
https://www.bilibili.com/video/BV1uK4y127K2?spm_id_from=333.1387.favlist.content.click
https://www.bilibili.com/video/BV1me411n7eu?spm_id_from=333.1387.favlist.content.click
https://www.bilibili.com/video/BV1me411n7eu?spm_id_from=333.1387.favlist.content.click
https://www.bilibili.com/video/BV1PT421X7EZ?spm_id_from=333.1387.favlist.content.click
https://www.bilibili.com/video/BV1PT421X7EZ?spm_id_from=333.1387.favlist.content.click
https://www.bilibili.com/video/BV15u411H7kP?spm_id_from=333.1387.favlist.content.click
https://www.bilibili.com/video/BV15u411H7kP?spm_id_from=333.1387.favlist.content.click
https://www.bilibili.com/video/BV1JK4y1u7KH?spm_id_from=333.1387.favlist.content.click
https://www.bilibili.com/video/BV1JK4y1u7KH?spm_id_from=333.1387.favlist.content.click
https://www.bilibili.com/video/BV14h4y1J7kw?spm_id_from=333.1387.favlist.content.click
https://www.bilibili.com/video/BV14h4y1J7kw?spm_id_from=333.1387.favlist.content.click

此时不难注意到每条链接被重复匹配了两次,这个一会在python代码中处理
刚才的操作只是获取了收藏夹第一页的视频链接,使用相同的方法获取对其余页进行处理

将提取好的链接保存在文本文档中,接下来编写程序实现批量下载
程序中使用了 you-get 下载器,执行以下命令安装

1
pip install you-get

然后使用以下python程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# downloader.py

import os
import sys

args = sys.argv
file = args[1]
savedir = args[2]

with open(file) as f:
links = f.read().split("\n")
for i in range(int(len(links)/2)):
del links[i]
for i in links:
os.system("you-get %s -o %s"%(i,savedir))

os.system("pause")

运行程序,参数如下
其中 file为保存了视频链接的文本文档的路径,savedir为视频保存路径
这里演示从 FBY.txt 中读取链接,并将视频保存在 D:\download

1
python downloader.py [file] [savedir]
1
python downloader.py "FBY.txt" "D:\download"

部分输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
you-get: You will need login cookies for 720p formats or above. (use --cookies to load cookies.txt.)
site: Bilibili
title: 【4K超高清】千本桜原版MV feat 初音ミク
stream:
- format: dash-flv480-AVC
container: mp4
quality: 清晰 480P avc1.64001F
size: 26.0 MiB (27215369 bytes)
# download-with: you-get --format=dash-flv480-AVC [URL]

Downloading 【4K超高清】千本桜原版MV feat 初音ミク.mp4 ...
100% ( 26.0/ 26.0MB) ├████████████████████████████████████████┤[2/2] 7 MB/s
Merging video parts... Merged into 【4K超高清】千本桜原版MV feat 初音ミク.mp4

Downloading 【4K超高清】千本桜原版MV feat 初音ミク.cmt.xml ...

保存路径中的.xml文件为视频对应的弹幕文件,可以将其删除,其余的.mp4为视频文件,根据需求使用格式工厂之类的软件进行转码。