处理爬虫控制中的重复或冲突信号,核心是先把每条信号拆成“谁发出、约束谁、作用范围多大、优先级如何”四项,再按优先级从高到低逐层核对,而不是看到矛盾就立刻改规则。下面用一个假设例子说明定位过程。
假设站点 example.com 的 robots.txt 中同时存在以下内容(仅为示例,非真实站点):
User-agent: *<br>Disallow: /private/<br>Allow: /private/report.html
同时页面 /private/report.html 的 HTML 头部写有 <meta name="robots" content="noindex">,而站点地图中又收录了该 URL。此时出现三类信号:抓取层禁止、抓取层允许、索引层禁止、发现层推荐。它们并不在同一层,不能简单判定“谁覆盖谁”。
爬虫控制信号至少分布在三个层面,处理冲突前必须先归类:
robots.txt 的 Disallow/Allow、meta robots 中的 nofollow、HTTP 头中的 X-Robots-Tag。它们影响是否抓取或是否追踪链接。noindex、X-Robots-Tag: noindex、规范链接(canonical)。它们影响页面是否进入索引、哪条 URL 被视为代表。关键判断:robots.txt 的 Disallow 只阻止抓取,不能可靠地移除已被索引的页面;若页面已被索引,仅加 Disallow 往往无法让它从索引消失,因为爬虫可能不再读取页面上的 noindex。站点地图同样不保证收录,它只是发现入口。
同一层内出现重复或冲突时,可按以下顺序核对:
User-agent: * 组。Allow: /private/report.html 比 Disallow: /private/ 更具体,通常后者不覆盖前者。但不同实现可能有差异,需以实际抓取行为验证。noindex 不会因为 robots.txt 允许抓取就失效,反之亦然。按下面顺序操作,可以定位大多数重复或冲突信号:
robots.txt 对应行、HTTP 响应头、HTML meta、canonical、站点地图收录状态。noindex 可能无法生效,因为爬虫不再抓取该页。noindex 是否指向同一 URL。若 canonical 指向 A、noindex 写在 B,需明确最终希望哪个 URL 被索引。常见错误包括:把站点地图当作收录保证;认为加了 Disallow 就等于删除索引;在已 Disallow 的页面上加 noindex 却不解除抓取限制;以及忽略不同搜索引擎对同一指令支持程度不同,未分别核查。
如果排查后发现冲突来自“抓取层禁止 + 索引层禁止”叠加,且页面已被索引,正确顺序通常是先允许抓取,让爬虫读到 noindex,再等待其生效,而不是继续叠加更多禁止规则。如果冲突来自 canonical 与 noindex,则要先确定代表 URL,再决定保留哪条指令。若冲突仅存在于站点地图与页面指令之间,以页面指令为准,站点地图只影响发现,不决定索引。
下一步:选取一个出现冲突的具体 URL,按上面的清单逐条记录信号,再决定是调整 robots.txt、页面 meta 还是 canonical,修改后重新抓取核对。