87ba038d39
功能特性: - 使用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笔记
243 lines
5.9 KiB
Markdown
243 lines
5.9 KiB
Markdown
# 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** 是一个强大且稳定的反爬虫解决方案!
|