提示

返回博客列表

用 yt-dlp 把 B 站合集扒成"带章节"的文件名(一篇讲透)

用 yt-dlp 把 B 站合集扒成"带章节"的文件名(一篇讲透)

说实话,B 站合集(以前叫视频列表、频道合集)用浏览器插件一个个点,几百个视频能点到手抽筋。我真正想要的是:一行命令把整季扒下来,文件名里带序号、带分 P 标题,最好弹幕、封面、清晰度自选也一并到位,丢进播放器能按顺序连播。这篇文章不打算只给你一条命令,而是把我和 B 站斗智斗勇半年攒下的全套配置、参数含义、以及各种诡异报错讲透。

先声明:下自己买过的课程、UP 主标明可转载的内容完全没问题;扒别人原创合集拿去二传赚钱,不地道也违规,自己把握分寸。下面只谈技术。

B 站不登录基本只能下 360p,而且现在风控越来越烦,频繁请求直接 412。最省事的办法是把浏览器里登录态导出来:

yt-dlp --cookies-from-browser chrome \
  -f "bv*+ba/b" \
  "https://www.bilibili.com/video/BV1xx411c7mD"

--cookies-from-browser chrome 会直接读你 Chrome 的 cookie 库(需要浏览器没在跑,或者它自己能读锁)。如果你和我一样讨厌每次启动浏览器,可以先导出一份文件留着:

yt-dlp --cookies-from-browser chrome --cookies cookies.txt "about:blank" || true
# 上面只是为了触发导出;更稳的做法是:
yt-dlp --cookies-from-browser chrome -F "URL" 2>&1 | head
# 真正导出:
# 用浏览器扩展(比如 Get cookies.txt)导出 cookies.txt,之后统一用 --cookies cookies.txt

注意这个 cookies.txt 里有你的 SESSDATA 登录态,别发给别人、别提交到 git。我早年就因为误传到公开 gist,号被踢了重登。

二、格式选择:别再用 -f best 了

-f best 在 B 站会踩坑:B 站把视频流和音频流分开(DASH),best 经常只选到视频流,结果下来没声音。正确写法是让 yt-dlp 自己合并最佳视频+最佳音频:

-f "bv*+ba/b"

含义:bv* 是任意最佳视频流,ba 是最佳音频,+ 表示合并,/b 是兜底(实在合并不了就单文件)。如果想指定清晰度:

-f "bv[height<=1080]+ba/b[height<=1080]"

[height<=1080] 是格式选择器(format selector),还能写 [ext=mp4][vcodec^=avc][filesize<100M] 等等,组合起来很灵活。

三、合集到底怎么"整批"下

关键在 URL 形态。B 站几种入口:
- 单视频:/video/BVxxxx,带 ?p=3 只是跳到第 3 P,本质是同一个视频的某一 P。
- 合集/系列:UP 主空间的 series 或者视频页下方的"合集"链接,这种才是真正的多视频列表。
- 收藏夹:/fav/xxxxx,需要登录 cookie。

我一般用空间视频列表入口:

yt-dlp --cookies cookies.txt \
  --playlist-items 1-50 \
  -f "bv*+ba/b" \
  -o "%(playlist_title)s/%(playlist_index)s - %(title)s.%(ext)s" \
  "https://space.bilibili.com/123456/video"

--playlist-items 1-50 可以分段下,避免一口气几百个把号搞风控。

四、输出模板:章节从哪来

很多人说的"章节",其实是两件事:一是 UP 主手写的"分 P 标题",二是 YouTube 那种嵌在流里的 chapter 元数据。B 站主要是前者。"分 P 标题" yt-dlp 能拿到,挂在 %(section_title)s%(chapter)s(不同版本字段名不一样,踩过坑)。

我的模板最终长这样:

-o "%(playlist_title)s/%(autonumber)03d - %(title)s [%(section_title)s].%(ext)s"

但这里有个大坑:%(playlist_index)s 在 B 站经常不是从 1 开始,因为它把动态里的视频也算进列表了,导致序号乱跳。我后来改用 %(autonumber)s 配合 --autonumber-start 1,序号才稳。

另一个坑:如果某 P 没有分 P 标题,%(section_title)s 会是空字符串,文件名就出现一对空方括号 [],Windows 上偶尔会报"文件名非法"。所以我加了个后置重命名小脚本,用正则把 [] 清掉,顺便把 /\: 这些非法字符替换掉。

五、后处理:合并、嵌封面、写元数据

下载完最好顺手做三件事,免得文件孤零零:

yt-dlp --cookies cookies.txt \
  -f "bv*+ba/b" \
  --merge-output-format mp4 \
  --embed-thumbnail \
  --write-thumbnail \
  --add-metadata \
  --write-subs --sub-langs "zh-CN,zh-Hans" \
  --autonumber-start 1 \
  -o "%(playlist_title)s/%(autonumber)03d - %(title)s.%(ext)s" \
  "URL"
  • --merge-output-format mp4:合并时强制封装成 mp4,兼容性最好(默认可能给你 mkv)。
  • --embed-thumbnail:把封面嵌进视频,文件管理器里直接显示封面图。
  • --add-metadata:写入标题、上传者等,播放器能识别。
  • --write-subs:B 站的字幕是 XML/JSON 格式,yt-dlp 能转成 srt/vtt;注意 B 站字幕有时需要 --write-subs 配合 --sub-format srt

六、别把号搞风控:限速、重试、断点

批量下几百个,最怕被限流。几个保命参数:

--retries 5
--fragment-retries 10
--limit-rate 3M
--sleep-interval 2 --max-sleep-interval 8

--limit-rate 3M 把速度压到 3MB/s,别把带宽打满也别让服务器觉得你是爬虫;--sleep-interval 在每个任务间随机睡 2~8 秒,模拟人手。还有一个神器 --download-archive archive.txt,它会记录已下载的视频 ID,下次跑自动跳过,断点续传/增量更新必备:

yt-dlp ... --download-archive archive.txt "URL"

七、代理与跨网络

如果你在海外或者需要走代理(有些 region 限制),加 --proxy

yt-dlp --proxy "http://127.0.0.1:7890" ...

注意 B 站对代理 IP 的风控更狠,用代理反而更容易 412,谨慎。

八、定时批量:扔后台跑

我一般把整条命令写进一个 .sh/.bat,再用 nohup 或任务计划程序半夜跑,配合 --download-archive 只补新增。这样每周跑一次,自动增量同步某个 UP 的更新。

九、常见报错速查表

报错 原因 解法
412 Precondition Failed 风控/请求过快 --sleep-interval、降 --limit-rate、换 cookie
签名错误/sign 缺失 B 站改了接口 升级 yt-dlp 到最新
只有视频没声音 没合并音频 bv*+ba/b
文件名非法 / 或空 [] 后处理脚本清洗
合集只下到 1 个 URL 用成单视频页 换 series/空间列表入口
清晰度只有 360p 没登录 检查 cookie 是否失效

十、我最终用的那条"全家桶"命令

yt-dlp --cookies cookies.txt \
  -f "bv*+ba/b" \
  --merge-output-format mp4 \
  --embed-thumbnail --add-metadata \
  --autonumber-start 1 \
  --retries 5 --fragment-retries 10 \
  --limit-rate 5M \
  --sleep-interval 2 --max-sleep-interval 6 \
  --download-archive archive.txt \
  --playlist-items 1-999 \
  -o "%(playlist_title)s/%(autonumber)03d - %(title)s.%(ext)s" \
  "URL"

跑完目录是一水儿的 001 - xxx.mp4002 - xxx.mp4,丢进任何播放器都能顺序播。说实话,比那些"一键下载器"稳多了——那些工具一更新就挂,命令行反而长治久安。

最后提醒:上面所有能力,请只用在你有权的内容上。技术是中性的,分寸在自己。

想亲手试试?用 VidDown 一键解析下载

粘贴视频链接即可解析,多平台支持、网页端即用;下载桌面客户端解锁海外平台本地解析,开通会员更享不限次下载。

顶部