它解开了一个循环依赖
DEV-sampler.md §六
调度器需要 crawl_delay 与 disallow_prefix_list,但它自己不抓 robots。本服务在首次采样时顺带取回并解析,随判定结果一起回调 —— 循环就断开了。
| field字段 | produced产出 | executed by谁执行 |
|---|---|---|
| min_interval_ms最小请求间隔(毫秒) | = max(crawl_delay, 语种默认值) | 调度器出队限速 + 下载器本地保险 |
| disallow_prefix_list | 原样回传,不做任何加工 | 调度器,入队前与 lease 前各校验一次 |
⚠️ 下载器不开 --obey-robots,执行者只有调度器。这一环断了,全系统就没人遵守 robots 了。下载器开了反而会造成两处判定不一致,表现为静默失败。
⚠️ min_interval_ms 在本服务已经取过一次 max。调度器与下载器直接用,禁止再取一次 max,外部消费方同样禁止。
两份 robots 不可互相替代
CONVENTION.md 第四条 · 必须标 ⚠️ 的易混字段
| where位置 | field字段 | owner所有者 | nature性质 |
|---|---|---|---|
| sampler:robots_rule | content | 采样器 | 当前规则,复核时会刷新 |
| 网页对象 | robots_snapshot | 下载器 | 抓取时刻的同期证据,永不刷新 |
| 导出项 | robots_rule_content | 采样器 | 上面第一行的副本,名字必须区别于第二行 |
⚠️ 导出字段名是 robots_rule_content,不是 robots_snapshot。导出的是可刷新的规则副本,借用证据字段的名字会让合规论证本身塌掉 —— 半年后对方改 robots 来追责,要拿出的是抓取时刻那一份,不是现在这一份。
⚠️ 三者不可互相替代,名字也不可互借。这是全系统最容易被「反正都是 robots」合并掉的一处。
已解析的规则
sampler:robots_rule:{domain} → {content, fetched_at, crawl_delay, disallow_prefix_list} · 唯一写入方 采样器
| domain域名 | crawl_delay抓取延迟(秒) | 语种默认(毫秒) | min_interval_ms取 max 后(毫秒) | disallow_prefix_list禁止前缀条数 | fetched_at获取时间 | actions操作 |
|---|---|---|---|---|---|---|
| news.example.tw | 2 | 1000 | 2000 | 2 | 2026-08-11T09:19:12Z | 规则 |
| docs.example.cn | null | 1000 | 1000 | 1 | 2026-08-09T14:02:04Z | 规则 |
| shop.example.jp | 5 | 1500 | 5000 | 4 | 2026-08-13T05:46:20Z | 规则 |
| corp.example.hk | null | 1000 | 1000 | 0 | 2026-08-02T19:30:51Z | 规则 |
| blocked.example.eu | 1 | 1000 | 1000 | 7 | 2026-08-10T11:25:04Z | 待定 |
⚠️ crawl_delay 为 null 表示 robots 里没有这条指令,不是 0。此时 min_interval_ms 直接取语种默认值。
⚠️ 第三行 crawl_delay = 5 秒大于语种默认 1500ms,取 max 得 5000ms。方向不能反 —— 取 min 就等于不遵守对方的声明。
⚠️ 最后一行 disallow_prefix_list 有 7 条且覆盖了采样路径,判为 undetermined_reason = robots_disallowed,进待定池。合规留痕,不再尝试。
⚠️ crawl_delay 与 etag / rel / lang 同属「镜像外部标准的字段」,照抄标准拼写,不展开。改了就与标准对不上,读的人反而要在两套名字之间做映射。
sitemap 地址没有具名字段
待补项 · 属采样器内部表,不动契约
sampler:robots_rule 只存 content / fetched_at / crawl_delay / disallow_prefix_list 四项。robots 里的 Sitemap: 指令藏在 content 里,没被单独取出来,所以域名列表上的 sitemap 地址那一列现在是空的。
| question要过的关 | constraint约束 |
|---|---|
| 名字里有缩写吗 | 不是外部标准名、也不在白名单,就展开。sitemap 是 robots 指令原名,属例外一,可照抄 |
| 数组还是单值 | robots 可以有多条 Sitemap:,数组一律带 _list 后缀 |
| 这个名字在别处被占了吗 | 不得与网页对象的 robots_snapshot 混,也不得与调度器的 URL 发现来源混 |
| 属任务还是结果 | 填不进表名后缀那张表,说明放错地方了。它属 _rule,与 robots 同表 |
| 要不要改契约 | 不要。它是采样器内部表的字段,不出现在任何跨服务 payload 里 |
⚠️ 该不该有这个字段,是 DEV-sampler.md 的管辖范围,不是本页能定的。CONVENTION.md 只管它叫什么。
刷新
复核时同步刷新 robots
| trigger触发 | action动作 |
|---|---|
| 首次采样 | should_render = false 取 robots.txt,解析后写表 |
| 复核 | 同步刷新,新的 min_interval_ms 与 disallow_prefix_list 随 /v1/rules 回调下发 |
⚠️ 刷新只改 sampler:robots_rule,不回头改任何已入库网页对象的 robots_snapshot。那是历史证据,改了就不成其为证据。
⚠️ 取 robots 走 POST crs.tongsou.com/v1/render,should_render = false。它不是一条抓取路径,只发 HTTP、不进渲染队列,但走同一条限速路径。