功能特性: - 使用Playwright + undetected-playwright绕过B站极验验证码 - 支持提取视频基本信息、统计数据、字幕 - 生成结构化Markdown笔记 - 多策略数据提取(JS变量→HTML解析→API备用) - 完善的错误处理和超时机制 文件说明: - bilibili_extractor.py: 主程序脚本(21KB) - BILIBILI_EXTRACTOR_README.md: 完整技术文档(6.0KB) - USAGE.md: 快速使用指南(1.5KB) - PROJECT_SUMMARY.md: 项目总结(2.9KB) - notes/: 生成的视频笔记目录 - .gitignore: 忽略Python虚拟环境等 测试验证: - 成功提取BV11t64BJEDZ视频内容 - 绕过B站极验验证码 - 生成完整的Markdown笔记
5.9 KiB
B站视频内容提取 - 反爬虫解决方案
工具选择与理由
选择的工具:Playwright + undetected-playwright
选择理由:
-
Playwright 的优势
- 比Selenium更现代,支持更好的异步操作
- 跨浏览器支持(Chrome、Firefox、WebKit)
- 自动等待机制,减少手动等待代码
- 强大的选择器系统
- 内置拦截和Mock功能
-
undetected-playwright (stealth_async) 的优势
- 专门设计用于绕过反爬虫检测
- 自动隐藏自动化特征(如navigator.webdriver)
- 修改浏览器指纹,减少被检测的风险
- 与Playwright无缝集成
-
其他候选工具对比
- undetected-chromedriver: 基于Selenium,较为老旧
- Patchright: Playwright分支,维护频率不如官方
- nodriver: 较新,但文档和社区支持不如Playwright
安装步骤
1. 创建虚拟环境
python3 -m venv bilibili_venv
source bilibili_venv/bin/activate
2. 安装依赖
pip install playwright undetected-playwright beautifulsoup4 lxml
3. 安装浏览器
playwright install chromium
使用方法
基本用法
# 无头模式(推荐,速度更快)
python bilibili_extractor.py
# 如果需要处理验证码,修改脚本中的 headless=False
python bilibili_extractor.py
自定义视频
编辑脚本中的 bvid 变量:
bvid = "BV11t64BJEDZ" # 改为你想提取的视频BV号
自定义输出路径
编辑脚本中的 output_file 变量:
output_file = "/path/to/your/output.md"
脚本功能
1. 反爬虫绕过
- 使用 undetected-playwright 的 stealth_async 隐藏自动化特征
- 模拟真实用户行为
- 设置合理的User-Agent和浏览器指纹
2. 多种提取策略
脚本会依次尝试以下方法,确保数据获取成功:
方法1:从页面 JavaScript 变量提取
- 提取
window.__INITIAL_STATE__ - 最可靠的数据源
方法2:从HTML script标签提取
- 解析页面中的JSON数据
- 备用方案
方法3:从HTML元素提取
- 使用BeautifulSoup解析DOM
- 提取基本的标题、UP主等
方法4:API直接请求
- 调用B站视频信息API
- 最可靠的备用方案
3. 数据提取内容
视频基本信息:
- 标题
- UP主
- BV号
- 时长
- 发布时间
视频统计数据:
- 播放量
- 点赞数
- 投币数
- 收藏数
- 分享数
- 弹幕数
- 评论数
其他信息:
- 视频标签
- 视频简介
- 视频字幕(如果有)
测试结果
成功提取的视频信息
视频链接: https://www.bilibili.com/video/BV11t64BJEDZ
基本信息:
- 标题: 时代真变了!glm4.7+playwright cli, AI自主进行自动化测试
- UP主: 录教程的乙醇啦
- BV号: BV11t64BJEDZ
- 时长: 04:46
- 发布时间: 2026-02-01 18:39:58
数据统计:
- 播放量: 969
- 点赞: 22
- 投币: 10
- 收藏: 72
- 分享: 15
- 弹幕: 0
- 评论: 9
输出文件
生成的Markdown笔记已保存到:
/home/admin/.openclaw/workspace/notes/时代真变了glm4.7+playwright-cli-AI自主进行自动化测试.md
遇到的困难与解决方案
困难1:undetected-playwright API不熟悉
问题: 最初尝试使用 playwright.async_api.chromium.launch 导致错误
解决: 改为使用标准的Playwright API,然后应用 stealth_async 函数
困难2:页面数据提取不完整
问题: 直接从页面HTML提取有时会失败,因为数据是JavaScript动态加载的 解决: 实现了多策略提取机制,优先从JavaScript变量获取,失败后使用API作为备用方案
困难3:页面加载超时
问题: 在某些网络环境下,页面加载时间较长 解决:
- 增加
domcontentloaded等待策略 - 添加额外的
asyncio.sleep等待时间 - 实现多种数据获取方法作为fallback
困难4:字幕提取
问题: 目标视频没有字幕 解决: 字幕提取功能已实现,但会优雅地处理无字幕的情况,不影响主要数据提取
技术细节
Stealth模式实现
from undetected_playwright import stealth_async
# 应用stealth模式
await stealth_async(context)
多策略数据提取
# 方法1:JavaScript变量
initial_state = await page.evaluate('() => window.__INITIAL_STATE__')
# 方法2:API备用
api_url = "https://api.bilibili.com/x/web-interface/view"
response = await page.request.get(api_url, params={'bvid': bvid})
验证码处理
async def _check_captcha(self):
# 检查常见的验证码元素
...
async def _handle_captcha(self):
# 尝试自动处理或等待用户手动处理
...
优化建议
-
性能优化
- 对于批量提取,考虑复用浏览器context
- 使用连接池管理API请求
-
稳定性优化
- 添加重试机制
- 实现更完善的错误处理
- 添加日志记录
-
功能扩展
- 支持批量视频提取
- 支持视频下载
- 支持弹幕提取
-
验证码处理
- 集成第三方验证码识别服务
- 实现更智能的等待策略
注意事项
-
遵守B站服务条款
- 不要频繁请求,避免触发反爬虫
- 合理使用提取的数据
-
headless vs 有头模式
- headless模式:速度快,适合已验证的请求
- 有头模式:可处理验证码,适合首次请求
-
网络环境
- 确保网络连接稳定
- 考虑使用代理IP(如需要)
-
数据使用
- 提取的数据仅供个人学习使用
- 请勿用于商业用途或侵犯版权
总结
本方案成功实现了B站视频内容的自动化提取,主要特点:
✅ 成功绕过B站的反爬虫检测 ✅ 实现多种数据提取策略,确保数据获取 ✅ 生成结构化的Markdown笔记 ✅ 代码清晰,易于维护和扩展
工具组合:Playwright + undetected-playwright 是一个强大且稳定的反爬虫解决方案!