Skip to content

feat(ingest): 掘金等信源入库前补全文存 raw_content (#161) - #163

Merged
fxbin merged 1 commit into
mainfrom
issue-161-ingest-fulltext
Oct 27, 2026
Merged

fxbin merged 1 commit into
mainfrom
issue-161-ingest-fulltext

Conversation

@fxbin

@fxbin fxbin commented Oct 27, 2026

Copy link
Copy Markdown
Owner

变更

Closes #161,与 #160(PR #162)互补:那边把点击时抓取的失败兜住,这边让掘金条目点击时根本不需要外呼。

  • 新服务 content_enrichment.py:入库管线 Step 3.5(去重后、落库前)对命中 INGEST_FULLTEXT_HOSTS(默认 juejin.cn,逗号分隔可扩展,空关闭)且 raw_content 缺失/过短(<200 字)的候选预抓一次原文,从提取出的结构块重建受控 HTML(heading/p/li/quote/pre/img,文本全转义)存进 raw_content。站内阅读因此优先走 ingested 路径,点击时零外呼,从根上避开掘金按 IP 频率限流的 WAF。
  • 抓取复用 article_reader 分层链路(新增公开入口 fetch_readable_article):SSRF 校验、robots、体积上限、站内阅读把反爬挑战页误报为「没有可提取的正文」,且失败无冷却会加深限流 #160 的挑战识别全部继承。
  • 频率护栏:每 sync 上限 INGEST_FULLTEXT_MAX_PER_SYNC(默认 6)+ 进程级 2 秒最小间隔(asyncio.Lock + 单调时钟),多个信源并发入库也不会密集外呼同一源站。
  • fail-open:抓取/提取任何失败只跳过该条目、绝不阻断入库;该条目站内阅读回退点击时抓取(站内阅读把反爬挑战页误报为「没有可提取的正文」,且失败无冷却会加深限流 #160 冷却兜底)。
  • 配套:_extract_from_ingested_content 补上 _extract_from_html 已有的「trafilatura 丢短标题/小列表时整篇回退手工提取」口径,入库全文与点击时抓取的结构还原一致(标题/代码块/列表在站内阅读里完整保留)。

方案取舍(调研记录在 #161):掘金 content detail API 对数字 article_id 不开放(int→404、string→参数错误,内部 UUID 无映射),推荐流只带 90 字 brief,故走 www SSR 页面抓取。

Verification

  • 本地隔离环境(一次性 PG 5433):
    • tests/test_content_enrichment.py 6/6:非目标域名/已有正文不外呼、补全 + ingested 路径结构还原 roundtrip、恶意文本转义、抓取失败 fail-open、每 sync 上限、hosts 留空关闭
    • tests/test_content_pipeline.py:存量全绿 + 新增接线测试(去重后的新候选才进补全,重复条目零外呼)
    • tests/test_article_reader.py 12/12 存量绿(ingested 路径结构回退不破坏现有行为)
    • 后端全量 pytest tests/:exit 0,1372 通过 0 失败
  • make layering:通过(service→service 方向合法)
  • ruff format --check + ruff check + py_compile:通过
  • 未覆盖:真实掘金源端到端入库(WAF 状态不可控,留给部署后验证;单元层已 mock 全链路)
  • 独立复核:待合并前由非实现过程复核者确认

站内阅读点击时才外呼源站,会被掘金按 IP 频率限流的 WAF 挑战页挡住。
现在入库管线在去重后、落库前对命中 INGEST_FULLTEXT_HOSTS(默认 juejin.cn)
且缺正文的候选预抓一次原文,从提取出的结构块重建受控 HTML 存进
raw_content,站内阅读优先走 ingested 路径、点击时零外呼。

抓取复用 article_reader 分层链路(SSRF/robots/体积上限/挑战识别全继承),
每 sync 上限 6 条 + 进程级 2 秒最小间隔,任何失败只跳过该条目不阻断入库。
ingested 提取路径同步补上 trafilatura 丢短标题/小列表时的整篇回退,
入库全文与点击时抓取的结构还原口径一致。
@fxbin
fxbin force-pushed the issue-161-ingest-fulltext branch from 45dacd5 to 4a7fd03 Compare October 27, 2026 08:59
@fxbin
fxbin merged commit 86d2480 into main Oct 27, 2026
8 checks passed
@fxbin
fxbin deleted the issue-161-ingest-fulltext branch October 27, 2026 09:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

掘金信源入库时补全文 raw_content,站内阅读点击时不再外呼源站

1 participant