bilibili-downloader异步并发下载深度解析asyncio与信号量如何高效控制批量下载不翻车【免费下载链接】bilibili-downloaderB站视频下载支持下载大会员清晰度4K持续更新中项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloaderbilibili-downloader 是一款 B站视频下载器支持大会员 4K 高清晰度、批量下载与分P视频。它的核心卖点之一就是基于 asyncio 的异步并发下载——通过信号量Semaphore精准控制并发数量让同时下载多个视频时既快又不翻车。这篇文章带你轻松读懂它背后的并发设计。为什么批量下载容易翻车批量下载视频时新手最常遇到两类问题全速并发 → 被限流一口气发起几十个请求带宽被瓜分每个都变慢甚至触发超时、连接被拒串行下载 → 太慢一个下载完再下一个10 个 1080P 视频要等几个小时。bilibili-downloader 的解法是有限并发让固定数量的下载任务同时跑某个任务完成后再补一个新的进来兼顾速度与稳定。三层并发架构总览整个下载流程分布在几个核心模块中职责清晰模块职责main.py调度入口创建并发任务、控制并发数、输出下载摘要strategy/bilibili_executor.py抓取视频信息、执行下载、合并音视频strategy/default.py普通视频BV号解析策略strategy/bangumi.py番剧/电影解析策略models/video.py视频数据模型与清晰度映射config.pyCookie、待下载 URL 列表、输出目录配置并发控制分为三层层层设防批量级Semaphore 限制同时下载的视频数默认 2 └── 视频级每个视频的音频视频流并行下载asyncio.gather └── 文件级断点续传 失败自动重试最多 5 次信号量Semaphore并发控制的核心打开 main.py核心逻辑只有短短几行semaphore asyncio.Semaphore(max_concurrent) # 默认 2 async def download_with_limit(url): async with semaphore: await self.download_single(url) tasks [download_with_limit(url) for url in urls] await asyncio.gather(*tasks)用一句通俗的话解释信号量就像停车场入口的闸机。asyncio.Semaphore(2)表示最多只有 2 个车位所有下载任务先排队拿到车位才能开始谁下载完谁归还空出的车位立刻给下一个任务。这样做的好处速度可控带宽集中在少数任务上每个视频都能跑满网速永不超时不会因请求过密触发 B 站限流或连接超时动态补位任务完成即补新任务全程无空窗期。max_concurrent在 main.py 中默认为 2网络好可以调高到 3~4网络差建议保持 2。锁Lock让共享资源井井有条多任务同时跑共享数据就容易出现竞争条件。项目用三把 asyncio 锁精准保护_lockmain.py保护成功/失败视频列表的写入保证摘要统计不串行错乱_counter_lockstrategy/bilibili_executor.py保护视频编号计数器确保每个任务拿到的编号唯一不重复_print_lockstrategy/bilibili_executor.py保护终端输出多个任务的打印不会互相穿插成乱码。 小提示asyncio 的锁是异步锁等待期间事件循环可以继续调度其他任务不会像传统线程锁那样把整个程序卡死。音视频并行单视频内的第二层并发B 站高清晰度视频采用 DASH 格式音频和视频是两条独立的流。在 strategy/bilibili_executor.py 中项目用一个asyncio.gather让两路同时下载 视频流可能高达 4K 音频流通常更小、更快两者并行完成后才判定该视频下载成功随后由 strategy/bilibili_executor.py 中的VideoMerge调用 ffmpeg 无损合并-c copy不重新编码速度极快。若系统没有 ffmpeg会自动回退到 moviepy 方案。断点续传 自动重试单文件级的保险丝即使并发控制得再好网络抖动仍可能发生。strategy/bilibili_executor.py 中的_download方法为每个文件再加了双保险自动重试捕获网络错误后最多重试 5 次每次间隔 5 秒断点续传每次请求都带上Range: bytes已下载字节-请求头中断后从断点继续已下载的几 GB 不会白费进度可见基于 tqdm 的实时进度条多任务进度互不干扰。快速上手三步完成批量 4K 下载第 1 步安装依赖pip3 install -r requirements.txt依赖清单见 requirements.txt核心是 httpx异步 HTTP 客户端、beautifulsoup4页面解析、tqdm进度条。第 2 步配置 Cookie约 30 天更新一次登录 B 站后按F12打开开发者工具 → 网络Network→ 刷新页面 → 点击第一个请求在 Request Headers 的 cookie 中找到SESSDATA完整复制 cookie 值粘贴到 config.py 的COOKIE变量中第 3 步添加视频 URL 并运行在 config.py 的URL列表中粘贴要下载的视频地址支持分P参数?p2然后执行python main.py运行结束后会输出下载摘要成功/失败数量、总用时。若有失败的视频项目会自动把它们的 URL 导出到failed_urls.txt直接复制回URL列表重试即可无需手动记录。下载失败先检查这三处现象常见原因解决办法清晰度只有 480PCookie 过期或 URL 被重定向更换 Cookie检查 URL 中/BV号后是否有斜杠项目会自动规范化见 strategy/bilibili_executor.py反复超时并发数过高或网络不稳调低max_concurrent断点续传会自动续上提示地区限制番剧版权限制换无地区限制的片源或检查网络出口清晰度的完整映射8K → 360P定义在 models/video.py其中 126 对应杜比视界 4K、120 对应超清 4K。总结并发不翻车的三个设计要点信号量限流asyncio.Semaphore把并发数锁在固定值速度与稳定兼得多层锁保护列表、计数器、输出各加一把异步锁共享数据零竞争失败自愈断点续传 5 次重试 失败 URL 自动导出任何单次抖动都不会毁掉整批任务。这套批量级信号量 视频级 gather 文件级重试的三层并发模型不只适用于 B 站下载也是所有批量 IO 任务文件同步、数据抓取都值得参考的通用模式。【免费下载链接】bilibili-downloaderB站视频下载支持下载大会员清晰度4K持续更新中项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考