harvest — 信息采集系统
当前有效方案(2026-10-03 重建)
代码
~/app/harvest/产物~/var/harvest/文档~/app/harvest/README.md取代 2026-06/07 的旧采集方案(旧文档已归档至${AI_ARCHIVE_ROOT}/harvest-archive/)。
硬件与网络约束(决定了方案选型)
| 约束 | 实测值 | 推论 |
|---|---|---|
| 可用内存 | 3 GB / 15 GB | 不装浏览器。Playwright + Chromium 不可行 |
| 依赖污染历史 | 曾装 crawl4ai 导致 cryptography 46→49、openai 2.24→2.16、pydantic 2.13→2.12 | 独立 uv venv,绝不碰 Hermes venv |
| 代理行为 | RSSHub / 阮一峰:直连与代理均 403;api.github.com:代理 403、直连 200 | 直连优先,逐源探测而非全局套代理 |
为什么没有采用旧方案评估的任何工具
| 工具 | 旧评估结论 | 本次未采用的原因 |
|---|---|---|
| Firecrawl 13万星 | 已内置 Hermes,作 web search provider | 需 API key,无 key 时不可用 |
| Crawl4AI | 性能最好(HN 2.25s / 16.7K chars) | 曾破坏依赖;且需装 Chromium(3GB 内存不足) |
| Browser-Use | 装了但结构复杂 | 需 daemon + CDP + LLM 编排,内存不足 |
| Crawlee | 传统爬虫,与 AI 抓取不匹配 | 同上 |
| ScrapeGraphAI | langchain 依赖冲突 | 同上 |
| chubbyskills 535★ | 中文全渠道采集,Hermes 已在支持列表 | 13 个 Skill,未安装 |
| twscrape / xhs / yt-dlp | 旧方案标注「已部署」 | 实测一个都没装(yt-dlp 系统包存在但非 venv 内) |
3GB 可用内存这一条,直接排除了所有需要浏览器的方案。
数据源(全部实测可达)
| 源 | 方式 | 语言 | 单次产出 | 备注 |
|---|---|---|---|---|
| V2EX | 公开 JSON API | 中文 | 42 | 无鉴权,中文技术圈最可靠的免费源 |
| HN Algolia | 公开 JSON API | 英文 | 30 | front_page,含分数与评论数 |
| arXiv cs.AI | Atom feed | 英文 | 15 | 按提交时间倒序 |
| GitHub Trending | HTML 解析 | 英文 | 17 | 日榜,含 star 与描述 |
单次 104 条 / 约 5 秒。
已排除的源
| 源 | 原因 |
|---|---|
| RSSHub 公共实例 | 直连与代理均 403 |
| 阮一峰博客 Atom | 403(UA 拦截) |
| 小红书 | 首页 200,取内容需登录 cookie → 待配 cookie |
| 抖音 / B站 | yt-dlp 系统已装,但无发现式订阅源 |
架构
~/app/harvest/
├── .venv/ uv 独立环境(httpx feedparser trafilatura,共 3 个直接依赖)
├── lib/harvest.py 采集器:JSON API / Atom / HTML 三类 fetcher
├── bin/harvest-run.sh 入口:限速 0.5s、日志轮转、异常判定
└── README.md 完整运维文档
~/var/harvest/
├── raw/ harvest-YYYYmmdd-HHMMSS.json 原始产物(90 天自动清理)
├── logs/ YYYYmmdd-HHMMSS.log 运行日志(60 天自动清理)
├── daily/ 日报(待实现)
└── digest/ 摘要(待实现)
产物不直接进 a —— 未消化的原始内容不进知识库,中间层隔离。
调度与资源隔离
# harvest.timer — 每 4 小时,错开整点 + 0~5min 随机延迟
OnCalendar=*-*-* 01,05,09,13,17,21:37:00
# harvest.service
Nice=10
IOSchedulingClass=idle
CPUWeight=10
MemoryMax=512M实测 RSS 约 15 MB,MemoryMax=512M 余量充足,采集不与 agent 服务抢资源。
异常判定
脚本会检查产出量:全源返回 0 条时 rc=2。这样源全部挂掉时不会静默”成功”,能被发现。
运维
# 手动跑一次
systemctl --user start harvest.service
# 看调度
systemctl --user list-timers harvest.timer
# 看最近日志
tail -20 ~/var/harvest/logs/$(ls -t ~/var/harvest/logs | head -1)
# 单源调试
cd ~/app/harvest && .venv/bin/python lib/harvest.py v2ex下一步
- digest — 104 条合并成一篇日报(去重、排序、标注来源)
- 筛选 — 按主题(AI agent / 工具 / 运维)过滤噪音
- 入库 — 消化后才写入 a 的
web/ - 小红书 — 配 cookie 后接入,补齐中文平台缺口
历史
旧采集流水线产出 web/ 里 467 篇(2026-05 至 2026-08-07),此后停止。
相关 cron 与脚本已不存在,仅留下产物。旧方案文档见归档目录。
2026-10-09 Codex 审阅说明
3 GB 预算下避开 Chromium 是本方案的资源选择,不是浏览器在所有低内存环境中技术上不可行。Crawlee 的 CheerioCrawler 使用普通 HTTP 请求,不强制启动浏览器;Playwright/Puppeteer crawler 才采用浏览器。Firecrawl 的云服务认证与本地部署也需分别说明。
“工具未安装”须区分项目 venv 与系统可执行文件。MemoryMax/Nice 控制该任务的限制和调度优先级,不能保证完全不竞争 CPU、I/O 或其他共享资源。104 条/5 秒是一次观测,不是运行 SLA;本次未运行采集或改 timer。