This repository has been archived on 2026-08-07. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
kb-skills/.planning/phases/08-crawler/08-CONTEXT.md
T

92 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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*