diff --git a/.planning/phases/08-crawler/08-CONTEXT.md b/.planning/phases/08-crawler/08-CONTEXT.md new file mode 100644 index 0000000..27213aa --- /dev/null +++ b/.planning/phases/08-crawler/08-CONTEXT.md @@ -0,0 +1,91 @@ +# Phase 8: 内容爬取实现 - Context + +**Gathered:** 2026-03-17 +**Status:** Ready for planning + + +## Phase Boundary + +实现知乎问答、专栏/文章、评论的完整爬取功能,包含网络反爬措施。 + +此阶段不涉及 Pipeline 整合(Phase 9),只专注于爬虫核心功能。 + + + + +## 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) +- 热门评论的具体数量限制 +- 重试间隔的具体递增策略 +- 错误提示信息的具体文案 + + + + +## 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 保持一致 + + + + +## 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))` + + + + +## Deferred Ideas + +None — discussion stayed within phase scope + + + +--- + +*Phase: 08-crawler* +*Context gathered: 2026-03-17*