想囤B站大会员4K视频到本地,我用一个Python脚本只花了一个晚上
【免费下载链接】bilibili-downloaderB站视频下载,支持下载大会员清晰度4K,持续更新中项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader
你有没有遇到过这种情况:B站大会员刚充完,追的剧却突然显示"已下架";或者辛辛苦苦把一整套付费课程收藏进列表,想着周末慢慢看,结果周末一到,视频没了。
我上周就撞上了。一部追了半个月的番,晚上十点还在列表里,第二天早上直接灰掉。更气人的是,我手机客户端里缓存的文件,因为大会员过期直接没法播放。那一刻我下定决心:在线的东西永远只是借来的,只有躺在我硬盘里的才是我的。
于是我开始满世界找"B站视频下载"的靠谱方案。在线解析站试了三四个,不是排队一小时就是下到一半断链。最后是朋友丢给我一个开源项目——bilibili-downloader,一个用 Python 写的 B 站视频下载工具。我照着 README 折腾了一个晚上,从普通视频到大会员 4K、再到充电专属视频,全部跑通。这篇就把我踩过的坑和完整的下载流程写下来,帮你少走弯路。
装依赖这步,为什么我折腾了两次
项目要求 Python 3.8 以上,现在机器上基本都是这个版本往上。先把仓库拉下来:
git clone https://gitcode.com/gh_mirrors/bil/bilibili-downloader cd bilibili-downloader pip3 install -r requirements.txt依赖就四样:httpx(异步发请求,速度的关键)、beautifulsoup4(解析视频页面)、moviepy(合并音视频)、tqdm(画进度条)。都是常见库,正常情况一分钟装完。
我第一次栽在没看提示,直接用pip而不是pip3,结果装进了旧版 Python 的环境里,运行时报ModuleNotFoundError: httpx。换成pip3就好了。如果你机器上还装着 Python 2,记得统一用pip3。
还有个提前剧透的细节:合并音视频这步,工具会先检查你有没有装ffmpeg,有就优先用它,合并速度飞快;没有也没关系,自动退回moviepy方案。我建议顺手装一个,后面你会感谢自己。
下载大会员4K视频,卡在Cookie这一步最冤
普通视频不填 Cookie 也能下,但想拿 4K 高清、想下载充电专属内容,必须让工具认出你的会员身份。这个身份凭证就是 Cookie——浏览器登录后发给你的一串"通行证"。
具体操作就三步:
- 浏览器登录 B 站,随便打开一个视频页面
- 按
F12打开开发者工具,切到"网络"标签,按Ctrl + R刷新 - 点第一个请求,在"请求头"里找到
Cookie整段复制
然后把整串内容粘到config.py里的COOKIE变量上,就完事了。注意两件事:
- 这串 Cookie 里的
SESSDATA大约 30 天过期,过期后重新复制一遍即可,其余不用动 - 别把 Cookie 贴到任何公开场合,这等于把账号密码拱手送人
把想下的视频写进列表,一个坑提前给你排掉
下载哪些视频,同样在config.py里维护,一个URL列表搞定。支持普通视频、分P视频和充电专属视频:
URL = [ # 普通视频 'https://www.bilibili.com/video/BV1M4411c7P4/', # 分P视频,指定下载第2集 'https://www.bilibili.com/video/BV1TnsZzHEcz/?p=2', # 充电专属视频 'https://www.bilibili.com/video/BV1W1wKeWEVe/', ]这里我要重点说一个新手 99% 会踩的坑。如果你把分P链接写成BV号?p=2(BV号后面没有斜杠),B 站服务器会把这种链接重定向一次,重定向过程中登录状态直接丢失,画质掉到 480P。我当时下载一整套课程,第一集还好好的,第二集开始全是糊的,排查了半天才发现是这个原因。
工具的作者显然也被坑过,他在 strategy/bilibili_executor.py 里专门写了一层 URL 规范化逻辑,自动把BV号?p=2补成BV号/?p=2,从根上保住 1080P 甚至 4K 画质。所以只要你用的是这个工具,这个坑已经被提前填平了。
敲下 python main.py 之后,我盯着屏幕看了一分钟
配置好config.py,运行主程序:
python3 main.py终端先会打印任务概况——待下载数量、并发模式、输出目录,然后进入逐条下载。程序默认同时下载 2 个视频,而每个视频内部,视频流和音频流是分开并发拉的,进度条各自独立,速度、已下载大小一目了然。
我最惊喜的是这个工具把"善后"做得极其干净:下载完成后自动合并音视频,自动清理临时文件,最后给出一份下载摘要——成功几个、失败几个、每个文件存到哪个目录,清清楚楚。
下载失败也不用慌,失败的 URL 会被自动写进项目根目录的failed_urls.txt,格式可以直接复制回config.py重试,不用对着屏幕抄地址。
藏在源码里的三个细节,值得单独夸
用下来发现作者在细节上确实下了功夫,挑三个我最服的:
一是断点续传。看 strategy/bilibili_executor.py 里的下载逻辑,每次请求都会带上Range头,先检查本地已有文件大小,从断点继续下载而不是从头再来。我下载一个 1.4G 的 4K 视频中途断网,重跑之后直接接着断点走,这种动辄几个 G 的文件,这个设计太救命了。更贴心的是它自带 5 次重试,网络抖动时自动等待后重连。
二是清晰度自动选最优。在 models/video.py 里能看到完整的画质映射表,从 8K、杜比视界 4K、超清 4K 到 1080P60、1080P+ 都有。工具会自动挑选能拿到的最清晰档位,并按 dash 格式把视频流和音频流分开下载再合并——这也是为什么它比那些"整段拉流"的下载器快得多。
三是分P文件的命名避坑。视频标题里可能带<>:"/\|?*这类 Windows 不认的字符,工具在设置标题时会统一清洗掉;分P视频则在文件名里加_P2、_P3这样的标识,防止十几集的视频互相覆盖。我一次下载了六集分P课程,文件名规规矩矩,零冲突。
想二次开发?这个目录结构一看就懂
如果你以后想改功能或者加新的视频类型,这个项目的结构也相当清爽:
- models/:视频、分类等数据模型,画质映射表在这里
- strategy/:下载策略,普通视频和番剧各走各的实现
- config.py:所有配置集中在这一个文件
- main.py:入口,负责编排下载、合并、摘要全流程
最让我欣赏的是它用了"策略模式":BilibiliStrategy是抽象基类,DefaultStrategy管普通视频,BangumiStrategy管番剧电影,新增一种视频类型只要再写一个策略类挂上去,完全不用动主流程。想加新场景,是加代码而不是改代码,这就是好设计的味道。
写在最后
回到开头那个被下架的夜晚。现在我硬盘里躺着那部番的完整 4K 版本,还有一整套付费课程,通勤路上随便看,再也不怕哪天链接灰掉。bilibili-downloader 把"B站视频下载"这件事的门槛降到了"复制粘贴"级别——装依赖、粘 Cookie、贴链接、跑起来,四步走完,你的内容就真正归你所有了。
如果你也受够了缓冲、下架和客户端那套奇怪的存储路径,花一个晚上跑一遍这个流程。自己动手存下来的每一份内容,都是你的个人资产,攒着攒着,就成了一座图书馆。
【免费下载链接】bilibili-downloaderB站视频下载,支持下载大会员清晰度4K,持续更新中项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考