因为灰度流量往往避开了例外本身:被 Disallow 的深层路径、带参数变体、来自特定爬虫的请求,以及依赖内链才能发现的页面,通常不会在少量抽样里等比例出现。小流量能验证规则语法和主路径,却很难证明“全量后不会出现被误伤的抓取”。要判断该保留、改写还是退出这次改动,关键不是看灰度有没有报错,而是看灰度覆盖了哪些 URL 类别、哪些爬虫身份,以及全量后例外会以什么形式出现。
robots.txt 的匹配以路径前缀和爬虫身份为单位。灰度阶段如果只抽首页、栏目页和少量详情页,往往刚好落在允许范围内,返回 200 和正常内容,看起来一切正常。但全量发布后,抓取会自然扩散到分页、筛选参数、历史归档、大小写变体等路径,这些才是规则误伤的集中区。
判断灰度是否可信,先看它是否覆盖了以下类别,而不是看请求总数:
如果灰度里缺少后两类,全量后出现的“例外”大概率不是规则写错,而是灰度样本没有触及。此时继续扩大流量没有意义,应该先补 URL 类别,再决定是否全量。
灰度暴露例外后,常见反应是立刻回滚。但回滚不是唯一正确动作,选择取决于例外是规则意图的一部分,还是规则意图之外的误伤。
如果被拦下的路径本来就是不想被频繁抓取的参数页或重复内容,那么灰度里出现的“异常”其实是规则生效的证据。适用条件是:你能说清这些路径为什么该被限制,并且它们不承载需要被抓取的核心内容。保留的代价是这些路径的抓取会减少,但这是有意为之。
如果例外集中在某一段路径,而同一前缀下还有必须放开的页面,说明规则粒度不够。典型动作是把一条宽泛的 Disallow: /search 收窄为只限制带参数的查询,或改用更精确的路径前缀。改写的适用条件是你能列出必须保留和必须限制的两组路径,并分别验证。改写后要重新跑一轮覆盖这些类别的灰度,而不是直接全量。
如果例外涉及的是核心内容路径,且收窄规则需要长期维护一张不断变化的排除清单,那么退回到改动前的规则是合理选择。退出的判断依据不是“灰度失败了”,而是“维持正确规则的成本高于它带来的抓取节省”。
下面是一个假设例子,用于说明如何区分原因,不代表任何真实站点。假设某站把 Disallow: / 临时用于测试环境,灰度只放行了 20 个已知 URL,全量后发现部分栏目页从抓取日志里消失。
/ 之下且未被单独允许,原因是规则覆盖过宽,属于改写场景;这个对照表的作用是:先给例外归类,再决定动作。归类错误时,改写会把问题从一条规则搬到另一条规则。
在灰度通过后、全量发布前,把灰度样本从“少量 URL”换成“每个 URL 类别至少一个代表”,并对每个代表记录三件事:请求是否发出、返回状态、内容是否为目标页面。这个动作的结果会直接决定下一步:
需要说明的是,抓取限制不等于索引移除,被 Disallow 的 URL 仍可能以其他方式出现在结果中;站点地图提交也不保证收录。灰度只能证明抓取行为的一部分,不能替代对索引状态的单独观察。
把灰度结论写成“某类别在特定爬虫下符合预期”,而不是“灰度通过”。前者能支撑全量决策,后者会在例外出现时无法追溯。全量发布后若再出现例外,先核对它属于哪个类别、是否在灰度样本内、是否与规则意图一致,再回到保留、改写或退出三个选项。灰度真正的价值不是提前发现所有问题,而是让你知道哪些问题还没被覆盖。