# B站视频内容提取 - 反爬虫解决方案 ## 工具选择与理由 ### 选择的工具:Playwright + undetected-playwright **选择理由:** 1. **Playwright 的优势** - 比Selenium更现代,支持更好的异步操作 - 跨浏览器支持(Chrome、Firefox、WebKit) - 自动等待机制,减少手动等待代码 - 强大的选择器系统 - 内置拦截和Mock功能 2. **undetected-playwright (stealth_async) 的优势** - 专门设计用于绕过反爬虫检测 - 自动隐藏自动化特征(如navigator.webdriver) - 修改浏览器指纹,减少被检测的风险 - 与Playwright无缝集成 3. **其他候选工具对比** - **undetected-chromedriver**: 基于Selenium,较为老旧 - **Patchright**: Playwright分支,维护频率不如官方 - **nodriver**: 较新,但文档和社区支持不如Playwright ## 安装步骤 ### 1. 创建虚拟环境 ```bash python3 -m venv bilibili_venv source bilibili_venv/bin/activate ``` ### 2. 安装依赖 ```bash pip install playwright undetected-playwright beautifulsoup4 lxml ``` ### 3. 安装浏览器 ```bash playwright install chromium ``` ## 使用方法 ### 基本用法 ```bash # 无头模式(推荐,速度更快) python bilibili_extractor.py # 如果需要处理验证码,修改脚本中的 headless=False python bilibili_extractor.py ``` ### 自定义视频 编辑脚本中的 `bvid` 变量: ```python bvid = "BV11t64BJEDZ" # 改为你想提取的视频BV号 ``` ### 自定义输出路径 编辑脚本中的 `output_file` 变量: ```python 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模式实现 ```python from undetected_playwright import stealth_async # 应用stealth模式 await stealth_async(context) ``` ### 多策略数据提取 ```python # 方法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}) ``` ### 验证码处理 ```python async def _check_captcha(self): # 检查常见的验证码元素 ... async def _handle_captcha(self): # 尝试自动处理或等待用户手动处理 ... ``` ## 优化建议 1. **性能优化** - 对于批量提取,考虑复用浏览器context - 使用连接池管理API请求 2. **稳定性优化** - 添加重试机制 - 实现更完善的错误处理 - 添加日志记录 3. **功能扩展** - 支持批量视频提取 - 支持视频下载 - 支持弹幕提取 4. **验证码处理** - 集成第三方验证码识别服务 - 实现更智能的等待策略 ## 注意事项 1. **遵守B站服务条款** - 不要频繁请求,避免触发反爬虫 - 合理使用提取的数据 2. **headless vs 有头模式** - headless模式:速度快,适合已验证的请求 - 有头模式:可处理验证码,适合首次请求 3. **网络环境** - 确保网络连接稳定 - 考虑使用代理IP(如需要) 4. **数据使用** - 提取的数据仅供个人学习使用 - 请勿用于商业用途或侵犯版权 ## 总结 本方案成功实现了B站视频内容的自动化提取,主要特点: ✅ 成功绕过B站的反爬虫检测 ✅ 实现多种数据提取策略,确保数据获取 ✅ 生成结构化的Markdown笔记 ✅ 代码清晰,易于维护和扩展 **工具组合:Playwright + undetected-playwright** 是一个强大且稳定的反爬虫解决方案!