B站视频爬取技能
概述
自动化爬取B站视频内容,支持多种场景:
- 关键词搜索视频
- UP主空间批量获取
- 收藏夹/合集解析
- 单个视频下载
前置条件
- Cookie配置 — 在脚本中设置有效的
COOKIE_STR,必须包含SESSDATA和bili_jct - 安装ffmpeg — 用于合并DASH分离的音视频流
- 安装requests —
pip install requests
核心功能
1. 搜索视频
# 搜索关键词
search_videos("lidar360教程", page=1, order="totalrank")
- 使用WBI签名请求搜索API
- 支持排序(总排名、最多点击、最新发布)
- 自动过滤非视频结果
2. UP主空间爬取
# 获取UP主视频列表
get_space_videos(uid=649019192, pn=1, ps=30)
- 自动获取UP主所有视频
- 支持分页浏览
- 提取标题、BV号、播放量、时长
3. 单个视频下载
# 下载单个视频
download_video("BV1xxxxxx", qn=80)
- 自动获取DASH音视频流
- 进度显示
- ffmpeg合并为MP4
- 自动清理临时文件
关键技术实现
WBI签名
B站API防爬机制:
MIXIN_ENC_TAB = [46,47,18,2,53,8,23,32,15,50,10,31,58,3,45,35,27,43,5,49,33,9,42,19,29,28,14,39,12,38,41,13,37,48,7,16,24,55,40,61,26,17,0,1,60,51,30,4,22,25,34,56,63,11,36,59,2,21,20,44,62,18,52]
def get_wbi_key():
# 从nav接口获取img_key和sub_key
# 拼接并按MIXIN_ENC_TAB重排
# 返回前32位作为mixin_key
pass
def sign_params(params):
# 添加wts时间戳
# 参数按key排序
# 去除特殊字符
# MD5拼接mixin_key
pass
DASH流处理
B站视频采用DASH分离传输:
- 请求
/x/player/playurl获取音视频流URL - 分别下载
.m4s文件 - 使用ffmpeg合并:
ffmpeg -i video.m4s -i audio.m4s -c copy output.mp4
文件名处理
def clean_filename(name):
# 移除Windows非法字符
# 截断至80字符
return cleaned_name
Pitfalls
- Cookie失效 — SESSDATA通常7天过期,过期后需重新获取
- WBI签名超时 — 接口有频率限制,建议请求间隔1.5秒
- 大文件下载 — 高清视频可能数GB,注意磁盘空间
- 网络波动 — 下载大文件时可能中断,需要重试机制
- 版权限制 — 部分视频有地域或会员限制
- WBI参数排序陷阱 — 当
aid值极大时,aid参与签名字典排序会导致-400错误。请求播放地址时必须同时传bvid+cid+aid。详见media/bilibili-downloader技能的 Pitfalls 章节。 - 搜索接口签名差异 —
/x/web-interface/search/type签名方式可能与普通API不同,遇-400时用网页端搜索提取BV号替代。
输出格式
下载视频保存至 bilibili_download/ 目录:
bilibili_download/
├── lidar360地面点分类和等高线绘制.mp4
├── lidar360点云数据处理教学视频机载林业-单木分割流程.mp4
└── lidar360点云数据处理教学视频地基林业-单木分割流程.mp4
支持文件
templates/search_videos.py— 视频搜索脚本模板templates/space_crawler.py— UP主空间爬取脚本模板templates/video_downloader.py— 单视频下载脚本模板references/bilibili-api-reference.md— B站API完整参考references/search-api-fallback.md— 搜索接口签名问题的网页端替代方案references/skillhub-upload-guide.md— SkillHub平台上传指南(API只读,需Web界面上传)
微信扫一扫