docs(08): capture phase context for crawler implementation

This commit is contained in:
2026-03-17 18:56:56 +08:00
parent e8eaca519f
commit 87adf8aca6
+91
View File
@@ -0,0 +1,91 @@
# Phase 8: 内容爬取实现 - Context
**Gathered:** 2026-03-17
**Status:** Ready for planning
<domain>
## Phase Boundary
实现知乎问答、专栏/文章、评论的完整爬取功能,包含网络反爬措施。
此阶段不涉及 Pipeline 整合(Phase 9),只专注于爬虫核心功能。
</domain>
<decisions>
## Implementation Decisions
### 爬取方式选择
- **实现方式**: 使用 Playwright 拦截 API 请求
- **原理**: 浏览器访问页面时拦截其发出的 API 请求(如 /api/v4/answers/xxx),直接获取 JSON 响应
- **优势**: 复用浏览器 Cookie,自动处理 x-zse-96 签名,无需逆向
- **支持内容类型**: 问答 (answer)、专栏 (zhuanlan)
- **不支持**: 知乎视频 — 推迟到后续版本
### 评论爬取范围
- **爬取范围**: 只爬取热门评论
- **嵌套展开**: 不展开回复的回复,只爬第一层评论
- **可选开关**: 评论爬取是可选功能,通过参数控制是否启用
### 代理配置方式
- **配置方式**: 通过环境变量配置(HTTP_PROXY/HTTPS_PROXY)
- **配置文件**: 添加到 ~/.kb_env,与现有配置方式一致
- **使用策略**: 强制使用代理 — 不配置代理则拒绝爬取,防止 IP 被封
### 反爬策略
- **请求频率**: 随机延迟,每个请求间隔 1-3 秒
- **重试策略**: 有限重试,失败后重试 3 次,间隔递增
- **错误处理**: 重试全部失败后抛出异常,由上层处理
### Claude's Discretion
- Playwright 拦截的具体实现方式(route/intercept)
- 热门评论的具体数量限制
- 重试间隔的具体递增策略
- 错误提示信息的具体文案
</decisions>
<code_context>
## Existing Code Insights
### Reusable Assets
- `kb_workflow/auth/zhihu_login.py` — ZhihuLogin 类,Cookie 获取和验证逻辑
- `kb_workflow/metadata/zhihu_extractor.py` — PlaywrightBrowser 类,浏览器管理
- `kb_workflow/pipeline/config.py` — KBSettings 配置类,支持环境变量加载
- `kb_workflow/pipeline/platforms/zhihu.py` — ZhihuAdapter 接口定义
### Established Patterns
- 配置管理: pydantic-settings BaseSettings + 环境变量
- 浏览器管理: PlaywrightBrowser 封装,支持 Cookie 设置
- API 验证: /api/v4/me 接口验证 Cookie 有效性
- 错误处理: 自定义 AuthError 异常类
### Integration Points
- 复用 Phase 7 的 Cookie 管理逻辑
- 复用 PlaywrightBrowser 浏览器管理类
- 新建 ZhihuCrawler 类处理 API 拦截和内容提取
- 输出格式与现有 ZhihuAdapter 保持一致
</code_context>
<specifics>
## Specific Ideas
- API 拦截示例: `page.route("**/api/v4/**", handler)` 拦截所有 API 请求
- 热门评论 API: `/api/v4/comment_v5/{type}/{id}/comments?order=hot`
- 代理环境变量: `HTTP_PROXY=http://127.0.0.1:7890`
- 随机延迟实现: `time.sleep(random.uniform(1, 3))`
</specifics>
<deferred>
## Deferred Ideas
None — discussion stayed within phase scope
</deferred>
---
*Phase: 08-crawler*
*Context gathered: 2026-03-17*