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 抓取不匹配同上
ScrapeGraphAIlangchain 依赖冲突同上
chubbyskills 535★中文全渠道采集,Hermes 已在支持列表13 个 Skill,未安装
twscrape / xhs / yt-dlp旧方案标注「已部署」实测一个都没装(yt-dlp 系统包存在但非 venv 内)

3GB 可用内存这一条,直接排除了所有需要浏览器的方案。

数据源(全部实测可达)

源方式语言单次产出备注
V2EX公开 JSON API中文42无鉴权,中文技术圈最可靠的免费源
HN Algolia公开 JSON API英文30front_page,含分数与评论数
arXiv cs.AIAtom feed英文15按提交时间倒序
GitHub TrendingHTML 解析英文17日榜,含 star 与描述

单次 104 条 / 约 5 秒。

已排除的源

源原因
RSSHub 公共实例直连与代理均 403
阮一峰博客 Atom403(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。

核验依据:Crawlee CheerioCrawler;Linux cgroup v2。