# 抖音推荐流视频抓取设计文档

## 背景

当前系统支持抓取指定博主主页或单视频。现需扩展支持抓取抖音推荐流（For You页面）当前可见的视频。

## 目标

- 支持抓取抖音推荐流（`https://www.douyin.com/`）的视频
- 记录每个视频对应的博主信息
- 支持滚动加载，最多抓取50条
- 视频统一保存到 `video/` 目录
- 保持现有两步式工作流不变

## 方案选择

采用**方案B：新建推荐流专用抓取函数**

理由：
- 逻辑清晰，推荐流和博主页完全解耦
- 便于后续分别维护
- 工作量适中，可快速实现验证

## 详细设计

### 1. 目标识别扩展

新增推荐流URL识别模式：

```python
RECOMMENDATION_URL_PATTERN = re.compile(
    r"^https?://www\.douyin\.com/?(?:\?.*)?$"
)
```

目标类型扩展为三种：
- `creator` - 博主主页（现有）
- `single-video` - 单视频（现有）
- `recommendation` - 推荐流（新增）

### 2. 核心流程

```
用户执行 ./.venv/bin/python Douyin.py
    ↓
读取当前浏览器页面URL
    ↓
判断页面类型：
    - 推荐流 → 执行 collect_recommendations()
    - 博主页 → 执行 collect_videos()（现有）
    - 单视频 → 执行 collect_single_video()（现有）
    - 其他 → 报错提示
```

### 3. collect_recommendations() 函数

**参数：**
- `max_videos`: 最大抓取数量（默认50）
- `timeout`: 单次等待接口响应秒数（默认10）
- `output_dir`: 输出目录（默认 `video/`）
- `browser_port`: 浏览器调试端口（默认9223）

**行为：**
1. 通过 `page.get("https://www.douyin.com/")` 打开推荐流页面（复用现有页面打开逻辑，不切换标签页）
2. 启动监听，目标接口：`web/aweme/post/`（推荐流与博主页共用此接口）
3. 循环直到收集够 `max_videos` 条或无法继续加载：
   - 等待接口响应
   - 解析视频列表，提取：标题、视频ID、视频URL、博主信息
   - 过滤已下载（按 `video_id` 去重，使用 `seen_ids: set[str]` 集合）
   - 下载视频
   - 向下滚动加载更多
4. 返回实际下载数量

### 4. 数据解析增强

新增博主信息提取字段：

```python
{
    "title": "视频标题",
    "video_id": "aweme_id",
    "video_url": "下载链接",
    "author_name": "博主昵称",
    "author_id": "博主ID",
}
```

### 5. 文件名格式

**推荐流视频：**
```
[博主昵称]视频标题-aweme_id.mp4
```
示例：`[张三]搞笑视频-7619989983668240802.mp4`

**博主页视频（保持现有）：**
```
视频标题-aweme_id.mp4
```

### 6. 命令行参数

**新增参数：**
```bash
--max-videos 50    # 推荐流最大抓取数量（默认50）
```

**使用示例：**
```bash
# 零参数，自动识别当前页面
./.venv/bin/python Douyin.py

# 自定义抓取数量（仅对推荐流有效）
./.venv/bin/python Douyin.py --max-videos 30

# 显式传入URL时，--max-videos 不适用（博主页和单视频页忽略此参数）
./.venv/bin/python Douyin.py "https://www.douyin.com/user/xxx"
```

### 7. 错误处理

- **推荐流页面未加载数据**：提示用户先滚动加载内容
- **滚动后无新数据**：正常结束，返回已下载数量
- **达到最大数量**：正常结束
- **其他错误**：复用现有错误处理机制

### 8. 测试覆盖（TDD）

必须覆盖以下测试场景：

- [ ] 推荐流URL识别测试
- [ ] 推荐流页面解析测试（模拟API响应含博主信息）
- [ ] 滚动加载逻辑测试
- [ ] 最大数量限制测试
- [ ] 文件名构建测试（含博主名）
- [ ] 博主信息提取测试
- [ ] 去重逻辑测试

## 非目标

- 自动登录抖音
- 自动过验证码
- 抓取非推荐流页面（如话题页、搜索页）
- 自动筛选视频内容
- 抓取超过50条视频（如需更多，需用户手动调整参数）

## 验收标准

1. 用户可以在推荐流页面执行 `./.venv/bin/python Douyin.py` 抓取视频
2. 系统能自动识别当前页面是推荐流
3. 支持滚动加载，最多抓取50条
4. 文件名包含博主昵称
5. 所有测试通过
6. 关键失败场景有明确报错

## 实现步骤

1. 编写测试（TDD）
2. 实现推荐流URL识别
3. 实现 `collect_recommendations()` 函数
4. 增强数据解析（提取博主信息）
5. 修改文件名构建逻辑
6. 更新命令行参数
7. 运行全部测试
8. 提交代码
