首页/新闻资讯/正文详情

bilibili-downloader异步并发下载深度解析:asyncio与信号量如何高效控制批量下载不翻车

发布时间:2026/9/25 5:12:52 来源:云帆数科 栏目:资讯中心
bilibili-downloader异步并发下载深度解析:asyncio与信号量如何高效控制批量下载不翻车
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),仅供参考

相关推荐

自定义对象池实战:用 Dictionary + List 在 Unity 中实现高效的 GameObject 复用(Unity3DTraining Object Pool2 源码解析)
自定义对象池实战:用 Dictionary + List 在 Unity 中实现高效的 GameObject 复用(Unity3DTraining Object Pool2 源码解析)

示例工程 【免费下载链接】Unity3DTraining 【Unity杂货铺】unity大杂烩~ 项目地址: https://gitcode.com/gh_mirrors/un/Unity3DTraining 点击查看 免费下载 本篇文章聚焦 Unity3DTraining 仓库中 MemoryPool_ObjectPool/Object Pool2 示例的完整实现:… · 2026/9/25 5:12:52

mikro-orm 虚拟实体(Virtual Entities)实战:用动态 SQL 与 MongoDB 聚合映射只读实体
mikro-orm 虚拟实体(Virtual Entities)实战:用动态 SQL 与 MongoDB 聚合映射只读实体

后端 【免费下载链接】mikro-orm TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, MariaDB, MS SQL Server, PostgreSQL and SQLite/libSQL databases. 项目地址: https://gitcode.com/gh_mir… · 2026/9/25 5:12:52

Atlas 300V 24G推理加速卡实测:YOLOv5部署全链路与调优
Atlas 300V 24G推理加速卡实测:YOLOv5部署全链路与调优

接到手这块Atlas 300V 24G的时候,我第一反应也是去查它到底算运算加速卡还是别的什么卡。等真正把YOLOv5跑起来,又折腾了一阵驱动和模型转换之后,才发现网上一堆帖子说得云里雾里。这篇文章就围绕两个高频问题来写:Atlas 300V 24G… · 2026/9/25 5:12:52

Atlas 300V Pro 24G上部署YOLOv5:从环境搭建到推理优化全攻略
Atlas 300V Pro 24G上部署YOLOv5:从环境搭建到推理优化全攻略

最近接手一个视频结构化的项目,边缘侧要同时对8路1080p视频做实时目标检测,要求每路不低于20帧,预算又被压得很低。折腾一圈后,最终选了Atlas 300V Pro 24G这张卡,把YOLOv5从PyTorch一路搬到昇腾推理环境。这中间踩了不… · 2026/9/25 5:39:31

RFID仓库管理系统:从标签到可信库存的完整落地指南
RFID仓库管理系统:从标签到可信库存的完整落地指南

简介:基于射频识别技术的仓库管理系统是一套面向仓库管理信息化场景的完整工程包,重点服务物联网、嵌入式及物流仓储方向的开发者,用于解决到货检验、入库、分派库位、库存变动记录、出库等作业环节的数据自动采集与库存精准掌握问题。压缩包… · 2026/9/25 5:39:31

用Vue 3从零打造问答组件:上一题下一题、自动保存与答题卡
用Vue 3从零打造问答组件:上一题下一题、自动保存与答题卡

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 5:39:31

论文AI率从58%到3.7%:困惑度与突发性降AI实战指南
论文AI率从58%到3.7%:困惑度与突发性降AI实战指南

1. 为什么一篇论文的AI率会高达58%先说结论:论文被判定高AI率,往往不是因为你“用了AI”,而是因为你的写作方式太像AI了。这个认知的转变,是我这次降AI整件事里最关键的一步。事情起因很简单。我写了一篇偏综述性质的论文&#xf… · 2026/9/25 5:39:25

react-map-gl Popup 组件解析:在 React 中声明式管理 mapbox-gl 弹窗
react-map-gl Popup 组件解析:在 React 中声明式管理 mapbox-gl 弹窗

前端UI组件 【免费下载链接】react-map-gl React friendly API wrapper around MapboxGL JS 项目地址: https://gitcode.com/gh_mirrors/re/react-map-gl 点击查看 免费下载 本文基于 docs/api-reference/mapbox/popup.md 展开,系统讲解 react-map-gl&a… · 2026/9/25 5:39:25

LangGraph 集成 MCP 实战:用 TaoToken 统一 Key 打通多工具调用链
LangGraph 集成 MCP 实战:用 TaoToken 统一 Key 打通多工具调用链

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 5:39:25

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码