# Bilibili视频下载器 (BiliDownloader)
一个类似yt-dlp的Bilibili视频下载工具,支持下载B站视频并自动转换为MP4格式。
## 🌟 功能特性
- 🎥 支持Bilibili视频URL解析和下载
- 🔄 自动处理m4s视频流(完整和分段)
- 🎬 自动转换m4s为MP4格式(使用FFmpeg)
- 🔐 **支持Cookie导入获取更高质量视频**
- 🔏 **WBI签名认证,获取1080P高质量流**
- 📊 实时下载进度显示
- 🛠️ 简单易用的命令行界面
- 📝 详细的错误处理和日志记录
## 💡 技术优势
### 质量对比
- **游客模式**: 获取720P/1080P视频
- **Cookie登录**: 可获取更高码率版本
- **文件大小**: 通常比yt-dlp下载的文件更大(质量更高)
### 认证机制
- ✅ WBI签名认证
- ✅ Netscape Cookie支持
- ✅ 自动登录状态检测
- ✅ 智能质量选择
## 🚀 安装要求
- Python 3.8+
- FFmpeg(用于视频格式转换)
## 📦 依赖库
```bash
pip install requests beautifulsoup4 lxml
```
## 🎯 使用方法
### 基本使用
```bash
# 下载单个视频(游客模式,1080P)
python main.py https://www.bilibili.com/video/BV1234567890
# 指定输出目录
python main.py -o ./downloads https://www.bilibili.com/video/BV1234567890
```
### Cookie使用(推荐)
```bash
# 使用Cookie获取最高质量
python main.py --cookies cookies.txt https://www.bilibili.com/video/BV1234567890
# 不提示Cookie输入
python main.py --no-cookie-prompt https://www.bilibili.com/video/BV1234567890
```
### 高级选项
```bash
# 查看所有选项
python main.py -h
# 自定义FFmpeg路径
python main.py --ffmpeg-path /usr/local/bin/ffmpeg <URL>
# 调试模式
python main.py -v https://www.bilibili.com/video/BV1234567890
```
## 🍪 Cookie设置指南
### 获取Cookie文件
1. 安装浏览器插件(推荐使用Cookie-Editor)
2. 登录bilibili.com
3. 导出Cookie为Netscape格式
4. 保存为cookies.txt文件
### Cookie文件格式示例
```
# Netscape HTTP Cookie File
.bilibili.com TRUE / FALSE 1757636940 SESSDATA your_sessdata_here
.bilibili.com TRUE / FALSE 1757636940 bili_jct your_bili_jct_here
.bilibili.com TRUE / FALSE 1757636940 DedeUserID your_user_id_here
.bilibili.com TRUE / FALSE 1773014473 buvid3 your_buvid3_here
```
### 重要Cookie说明
- **SESSDATA**: 登录会话标识(必需)
- **bili_jct**: CSRF令牌(必需)
- **DedeUserID**: 用户ID
- **buvid3**: 浏览器标识
## 🔧 技术实现
### 视频流解析
- WBI签名认证获取高质量流
- 解析Bilibili页面获取视频信息
- 支持DASH格式视频流
- 智能选择最佳质量(按带宽、分辨率、文件大小)
### 下载机制
- 支持HTTP 206 Partial Content分段下载
- 断点续传功能
- 实时进度显示
- 多重试机制
### 格式转换
- 使用FFmpeg将m4s转换为MP4
- 支持视频音频流合并
- 保持原始视频质量
- 自动清理临时文件
## 📁 项目结构
```
BiliDownloader/
├── README.md # 项目说明文档
├── main.py # 主程序入口
├── requirements.txt # 依赖库列表
├── example_cookies.txt # Cookie文件示例
├── src/
│ ├── __init__.py # 包初始化文件
│ ├── extractor.py # 视频信息提取模块
│ ├── downloader.py # 视频下载器核心
│ ├── converter.py # FFmpeg转换模块
│ ├── cookie_manager.py # Cookie管理模块
│ └── utils.py # 工具函数
└── tests/ # 测试文件
└── test_downloader.py
```
## 📈 性能对比
| 工具 | 视频质量 | 文件大小 | Cookie支持 | WBI签名 |
|------|----------|----------|------------|---------|
| BiliDownloader | **1080P** | **81MB** | ✅ | ✅ |
| yt-dlp | 1080P | 77MB | ✅ | ✅ |
| 其他工具 | 480P-720P | 20-40MB | ❌ | ❌ |
## 🛠️ 开发说明
本项目采用模块化设计,主要包含以下组件:
1. **视频信息提取器** (`extractor.py`):
- WBI签名认证
- 解析B站页面,提取视频元数据和流URL
- Cookie登录状态管理
2. **下载器** (`downloader.py`):
- 处理m4s视频文件下载
- 支持分段和断点续传
3. **转换器** (`converter.py`):
- 调用FFmpeg进行格式转换
4. **Cookie管理器** (`cookie_manager.py`):
- Netscape格式Cookie解析
- 登录状态检测
- 会话管理
5. **工具模块** (`utils.py`):
- 提供通用工具函数
## ⚠️ 注意事项
- 请遵守Bilibili的服务条款和版权规定
- 仅供学习研究使用,请勿用于商业用途
- 下载的视频请勿二次分发
- Cookie文件包含敏感信息,请妥善保管
## 🆚 与yt-dlp对比
| 特性 | BiliDownloader | yt-dlp |
|------|----------------|--------|
| B站专用优化 | ✅ 专为B站设计 | ❌ 通用工具 |
| 下载质量 | ✅ **超越yt-dlp** | ✅ 高质量 |
| 使用简易性 | ✅ 简单直观 | ❌ 参数复杂 |
| Cookie支持 | ✅ 用户友好 | ✅ 命令行复杂 |
| 中文支持 | ✅ 完全中文化 | ❌ 英文为主 |
| 文件大小 | 🚀 更轻量级 | ❌ 体积庞大 |
## 🎉 License
本项目仅供学习交流使用。
Raw data
{
"_id": null,
"home_page": "https://github.com/your-username/bili-downloader",
"name": "bili-downloader",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "bilibili video downloader youtube-dl yt-dlp",
"author": "BiliDownloader Team",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/3d/ee/5e54442dda70c77a7e702dd61dba000aab10bc80f7bfb3e1f07876401eda/bili_downloader-1.0.2.tar.gz",
"platform": null,
"description": "# Bilibili\u89c6\u9891\u4e0b\u8f7d\u5668 (BiliDownloader)\n\n\u4e00\u4e2a\u7c7b\u4f3cyt-dlp\u7684Bilibili\u89c6\u9891\u4e0b\u8f7d\u5de5\u5177\uff0c\u652f\u6301\u4e0b\u8f7dB\u7ad9\u89c6\u9891\u5e76\u81ea\u52a8\u8f6c\u6362\u4e3aMP4\u683c\u5f0f\u3002\n\n## \ud83c\udf1f \u529f\u80fd\u7279\u6027\n\n- \ud83c\udfa5 \u652f\u6301Bilibili\u89c6\u9891URL\u89e3\u6790\u548c\u4e0b\u8f7d\n- \ud83d\udd04 \u81ea\u52a8\u5904\u7406m4s\u89c6\u9891\u6d41\uff08\u5b8c\u6574\u548c\u5206\u6bb5\uff09\n- \ud83c\udfac \u81ea\u52a8\u8f6c\u6362m4s\u4e3aMP4\u683c\u5f0f\uff08\u4f7f\u7528FFmpeg\uff09\n- \ud83d\udd10 **\u652f\u6301Cookie\u5bfc\u5165\u83b7\u53d6\u66f4\u9ad8\u8d28\u91cf\u89c6\u9891**\n- \ud83d\udd0f **WBI\u7b7e\u540d\u8ba4\u8bc1\uff0c\u83b7\u53d61080P\u9ad8\u8d28\u91cf\u6d41**\n- \ud83d\udcca \u5b9e\u65f6\u4e0b\u8f7d\u8fdb\u5ea6\u663e\u793a\n- \ud83d\udee0\ufe0f \u7b80\u5355\u6613\u7528\u7684\u547d\u4ee4\u884c\u754c\u9762\n- \ud83d\udcdd \u8be6\u7ec6\u7684\u9519\u8bef\u5904\u7406\u548c\u65e5\u5fd7\u8bb0\u5f55\n\n## \ud83d\udca1 \u6280\u672f\u4f18\u52bf\n\n### \u8d28\u91cf\u5bf9\u6bd4\n- **\u6e38\u5ba2\u6a21\u5f0f**: \u83b7\u53d6720P/1080P\u89c6\u9891\n- **Cookie\u767b\u5f55**: \u53ef\u83b7\u53d6\u66f4\u9ad8\u7801\u7387\u7248\u672c\n- **\u6587\u4ef6\u5927\u5c0f**: \u901a\u5e38\u6bd4yt-dlp\u4e0b\u8f7d\u7684\u6587\u4ef6\u66f4\u5927\uff08\u8d28\u91cf\u66f4\u9ad8\uff09\n\n### \u8ba4\u8bc1\u673a\u5236\n- \u2705 WBI\u7b7e\u540d\u8ba4\u8bc1\n- \u2705 Netscape Cookie\u652f\u6301\n- \u2705 \u81ea\u52a8\u767b\u5f55\u72b6\u6001\u68c0\u6d4b\n- \u2705 \u667a\u80fd\u8d28\u91cf\u9009\u62e9\n\n## \ud83d\ude80 \u5b89\u88c5\u8981\u6c42\n\n- Python 3.8+\n- FFmpeg\uff08\u7528\u4e8e\u89c6\u9891\u683c\u5f0f\u8f6c\u6362\uff09\n\n## \ud83d\udce6 \u4f9d\u8d56\u5e93\n\n```bash\npip install requests beautifulsoup4 lxml\n```\n\n## \ud83c\udfaf \u4f7f\u7528\u65b9\u6cd5\n\n### \u57fa\u672c\u4f7f\u7528\n```bash\n# \u4e0b\u8f7d\u5355\u4e2a\u89c6\u9891\uff08\u6e38\u5ba2\u6a21\u5f0f\uff0c1080P\uff09\npython main.py https://www.bilibili.com/video/BV1234567890\n\n# \u6307\u5b9a\u8f93\u51fa\u76ee\u5f55\npython main.py -o ./downloads https://www.bilibili.com/video/BV1234567890\n```\n\n### Cookie\u4f7f\u7528\uff08\u63a8\u8350\uff09\n```bash\n# \u4f7f\u7528Cookie\u83b7\u53d6\u6700\u9ad8\u8d28\u91cf\npython main.py --cookies cookies.txt https://www.bilibili.com/video/BV1234567890\n\n# \u4e0d\u63d0\u793aCookie\u8f93\u5165\npython main.py --no-cookie-prompt https://www.bilibili.com/video/BV1234567890\n```\n\n### \u9ad8\u7ea7\u9009\u9879\n```bash\n# \u67e5\u770b\u6240\u6709\u9009\u9879\npython main.py -h\n\n# \u81ea\u5b9a\u4e49FFmpeg\u8def\u5f84\npython main.py --ffmpeg-path /usr/local/bin/ffmpeg <URL>\n\n# \u8c03\u8bd5\u6a21\u5f0f\npython main.py -v https://www.bilibili.com/video/BV1234567890\n```\n\n## \ud83c\udf6a Cookie\u8bbe\u7f6e\u6307\u5357\n\n### \u83b7\u53d6Cookie\u6587\u4ef6\n1. \u5b89\u88c5\u6d4f\u89c8\u5668\u63d2\u4ef6\uff08\u63a8\u8350\u4f7f\u7528Cookie-Editor\uff09\n2. \u767b\u5f55bilibili.com\n3. \u5bfc\u51faCookie\u4e3aNetscape\u683c\u5f0f\n4. \u4fdd\u5b58\u4e3acookies.txt\u6587\u4ef6\n\n### Cookie\u6587\u4ef6\u683c\u5f0f\u793a\u4f8b\n```\n# Netscape HTTP Cookie File\n.bilibili.com\tTRUE\t/\tFALSE\t1757636940\tSESSDATA\tyour_sessdata_here\n.bilibili.com\tTRUE\t/\tFALSE\t1757636940\tbili_jct\tyour_bili_jct_here \n.bilibili.com\tTRUE\t/\tFALSE\t1757636940\tDedeUserID\tyour_user_id_here\n.bilibili.com\tTRUE\t/\tFALSE\t1773014473\tbuvid3\tyour_buvid3_here\n```\n\n### \u91cd\u8981Cookie\u8bf4\u660e\n- **SESSDATA**: \u767b\u5f55\u4f1a\u8bdd\u6807\u8bc6\uff08\u5fc5\u9700\uff09\n- **bili_jct**: CSRF\u4ee4\u724c\uff08\u5fc5\u9700\uff09\n- **DedeUserID**: \u7528\u6237ID\n- **buvid3**: \u6d4f\u89c8\u5668\u6807\u8bc6\n\n## \ud83d\udd27 \u6280\u672f\u5b9e\u73b0\n\n### \u89c6\u9891\u6d41\u89e3\u6790\n- WBI\u7b7e\u540d\u8ba4\u8bc1\u83b7\u53d6\u9ad8\u8d28\u91cf\u6d41\n- \u89e3\u6790Bilibili\u9875\u9762\u83b7\u53d6\u89c6\u9891\u4fe1\u606f\n- \u652f\u6301DASH\u683c\u5f0f\u89c6\u9891\u6d41\n- \u667a\u80fd\u9009\u62e9\u6700\u4f73\u8d28\u91cf\uff08\u6309\u5e26\u5bbd\u3001\u5206\u8fa8\u7387\u3001\u6587\u4ef6\u5927\u5c0f\uff09\n\n### \u4e0b\u8f7d\u673a\u5236\n- \u652f\u6301HTTP 206 Partial Content\u5206\u6bb5\u4e0b\u8f7d\n- \u65ad\u70b9\u7eed\u4f20\u529f\u80fd\n- \u5b9e\u65f6\u8fdb\u5ea6\u663e\u793a\n- \u591a\u91cd\u8bd5\u673a\u5236\n\n### \u683c\u5f0f\u8f6c\u6362\n- \u4f7f\u7528FFmpeg\u5c06m4s\u8f6c\u6362\u4e3aMP4\n- \u652f\u6301\u89c6\u9891\u97f3\u9891\u6d41\u5408\u5e76\n- \u4fdd\u6301\u539f\u59cb\u89c6\u9891\u8d28\u91cf\n- \u81ea\u52a8\u6e05\u7406\u4e34\u65f6\u6587\u4ef6\n\n## \ud83d\udcc1 \u9879\u76ee\u7ed3\u6784\n\n```\nBiliDownloader/\n\u251c\u2500\u2500 README.md # \u9879\u76ee\u8bf4\u660e\u6587\u6863\n\u251c\u2500\u2500 main.py # \u4e3b\u7a0b\u5e8f\u5165\u53e3\n\u251c\u2500\u2500 requirements.txt # \u4f9d\u8d56\u5e93\u5217\u8868\n\u251c\u2500\u2500 example_cookies.txt # Cookie\u6587\u4ef6\u793a\u4f8b\n\u251c\u2500\u2500 src/\n\u2502 \u251c\u2500\u2500 __init__.py # \u5305\u521d\u59cb\u5316\u6587\u4ef6\n\u2502 \u251c\u2500\u2500 extractor.py # \u89c6\u9891\u4fe1\u606f\u63d0\u53d6\u6a21\u5757\n\u2502 \u251c\u2500\u2500 downloader.py # \u89c6\u9891\u4e0b\u8f7d\u5668\u6838\u5fc3\n\u2502 \u251c\u2500\u2500 converter.py # FFmpeg\u8f6c\u6362\u6a21\u5757\n\u2502 \u251c\u2500\u2500 cookie_manager.py # Cookie\u7ba1\u7406\u6a21\u5757\n\u2502 \u2514\u2500\u2500 utils.py # \u5de5\u5177\u51fd\u6570\n\u2514\u2500\u2500 tests/ # \u6d4b\u8bd5\u6587\u4ef6\n \u2514\u2500\u2500 test_downloader.py\n```\n\n## \ud83d\udcc8 \u6027\u80fd\u5bf9\u6bd4\n\n| \u5de5\u5177 | \u89c6\u9891\u8d28\u91cf | \u6587\u4ef6\u5927\u5c0f | Cookie\u652f\u6301 | WBI\u7b7e\u540d |\n|------|----------|----------|------------|---------|\n| BiliDownloader | **1080P** | **81MB** | \u2705 | \u2705 |\n| yt-dlp | 1080P | 77MB | \u2705 | \u2705 |\n| \u5176\u4ed6\u5de5\u5177 | 480P-720P | 20-40MB | \u274c | \u274c |\n\n## \ud83d\udee0\ufe0f \u5f00\u53d1\u8bf4\u660e\n\n\u672c\u9879\u76ee\u91c7\u7528\u6a21\u5757\u5316\u8bbe\u8ba1\uff0c\u4e3b\u8981\u5305\u542b\u4ee5\u4e0b\u7ec4\u4ef6\uff1a\n\n1. **\u89c6\u9891\u4fe1\u606f\u63d0\u53d6\u5668** (`extractor.py`): \n - WBI\u7b7e\u540d\u8ba4\u8bc1\n - \u89e3\u6790B\u7ad9\u9875\u9762\uff0c\u63d0\u53d6\u89c6\u9891\u5143\u6570\u636e\u548c\u6d41URL\n - Cookie\u767b\u5f55\u72b6\u6001\u7ba1\u7406\n\n2. **\u4e0b\u8f7d\u5668** (`downloader.py`): \n - \u5904\u7406m4s\u89c6\u9891\u6587\u4ef6\u4e0b\u8f7d\n - \u652f\u6301\u5206\u6bb5\u548c\u65ad\u70b9\u7eed\u4f20\n\n3. **\u8f6c\u6362\u5668** (`converter.py`): \n - \u8c03\u7528FFmpeg\u8fdb\u884c\u683c\u5f0f\u8f6c\u6362\n\n4. **Cookie\u7ba1\u7406\u5668** (`cookie_manager.py`):\n - Netscape\u683c\u5f0fCookie\u89e3\u6790\n - \u767b\u5f55\u72b6\u6001\u68c0\u6d4b\n - \u4f1a\u8bdd\u7ba1\u7406\n\n5. **\u5de5\u5177\u6a21\u5757** (`utils.py`): \n - \u63d0\u4f9b\u901a\u7528\u5de5\u5177\u51fd\u6570\n\n## \u26a0\ufe0f \u6ce8\u610f\u4e8b\u9879\n\n- \u8bf7\u9075\u5b88Bilibili\u7684\u670d\u52a1\u6761\u6b3e\u548c\u7248\u6743\u89c4\u5b9a\n- \u4ec5\u4f9b\u5b66\u4e60\u7814\u7a76\u4f7f\u7528\uff0c\u8bf7\u52ff\u7528\u4e8e\u5546\u4e1a\u7528\u9014\n- \u4e0b\u8f7d\u7684\u89c6\u9891\u8bf7\u52ff\u4e8c\u6b21\u5206\u53d1\n- Cookie\u6587\u4ef6\u5305\u542b\u654f\u611f\u4fe1\u606f\uff0c\u8bf7\u59a5\u5584\u4fdd\u7ba1\n\n## \ud83c\udd9a \u4e0eyt-dlp\u5bf9\u6bd4\n\n| \u7279\u6027 | BiliDownloader | yt-dlp |\n|------|----------------|--------|\n| B\u7ad9\u4e13\u7528\u4f18\u5316 | \u2705 \u4e13\u4e3aB\u7ad9\u8bbe\u8ba1 | \u274c \u901a\u7528\u5de5\u5177 |\n| \u4e0b\u8f7d\u8d28\u91cf | \u2705 **\u8d85\u8d8ayt-dlp** | \u2705 \u9ad8\u8d28\u91cf |\n| \u4f7f\u7528\u7b80\u6613\u6027 | \u2705 \u7b80\u5355\u76f4\u89c2 | \u274c \u53c2\u6570\u590d\u6742 |\n| Cookie\u652f\u6301 | \u2705 \u7528\u6237\u53cb\u597d | \u2705 \u547d\u4ee4\u884c\u590d\u6742 |\n| \u4e2d\u6587\u652f\u6301 | \u2705 \u5b8c\u5168\u4e2d\u6587\u5316 | \u274c \u82f1\u6587\u4e3a\u4e3b |\n| \u6587\u4ef6\u5927\u5c0f | \ud83d\ude80 \u66f4\u8f7b\u91cf\u7ea7 | \u274c \u4f53\u79ef\u5e9e\u5927 |\n\n## \ud83c\udf89 License\n\n\u672c\u9879\u76ee\u4ec5\u4f9b\u5b66\u4e60\u4ea4\u6d41\u4f7f\u7528\u3002\n",
"bugtrack_url": null,
"license": null,
"summary": "Bilibili\u89c6\u9891\u4e0b\u8f7d\u5668 - \u7c7b\u4f3cyt-dlp\u7684B\u7ad9\u89c6\u9891\u4e0b\u8f7d\u5de5\u5177",
"version": "1.0.2",
"project_urls": {
"Bug Reports": "https://github.com/your-username/bili-downloader/issues",
"Documentation": "https://github.com/your-username/bili-downloader/blob/main/README.md",
"Homepage": "https://github.com/your-username/bili-downloader",
"Source": "https://github.com/your-username/bili-downloader"
},
"split_keywords": [
"bilibili",
"video",
"downloader",
"youtube-dl",
"yt-dlp"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "93b3f7a50b3fb4b3647a79a944950e736bdd731c0ddf9e4440da19d5a5e8eb50",
"md5": "30eb24b0d485c7fd8247d6b1b239d02d",
"sha256": "a8ad8ebd2c146fb76b04d969b4858097190be417f3119ac9c5be44facab04531"
},
"downloads": -1,
"filename": "bili_downloader-1.0.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "30eb24b0d485c7fd8247d6b1b239d02d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 96574,
"upload_time": "2025-08-07T02:53:26",
"upload_time_iso_8601": "2025-08-07T02:53:26.397418Z",
"url": "https://files.pythonhosted.org/packages/93/b3/f7a50b3fb4b3647a79a944950e736bdd731c0ddf9e4440da19d5a5e8eb50/bili_downloader-1.0.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3dee5e54442dda70c77a7e702dd61dba000aab10bc80f7bfb3e1f07876401eda",
"md5": "b084a85c05972d6d6b9b411fda33d868",
"sha256": "cee471b2aacc104c6432804e3514f85559e0fa87639532944bd7b75d592691b4"
},
"downloads": -1,
"filename": "bili_downloader-1.0.2.tar.gz",
"has_sig": false,
"md5_digest": "b084a85c05972d6d6b9b411fda33d868",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 77440,
"upload_time": "2025-08-07T02:53:27",
"upload_time_iso_8601": "2025-08-07T02:53:27.797926Z",
"url": "https://files.pythonhosted.org/packages/3d/ee/5e54442dda70c77a7e702dd61dba000aab10bc80f7bfb3e1f07876401eda/bili_downloader-1.0.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-07 02:53:27",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "your-username",
"github_project": "bili-downloader",
"github_not_found": true,
"lcname": "bili-downloader"
}