灰度只覆盖一小部分URL时,例外路径往往恰好不在样本里;等全量发布,这些路径才第一次被爬虫按新规则处理,冲突随之出现。要判断这是灰度设计缺陷还是全量配置错误,先看例外是否在灰度名单之外就已存在。
常见情形是:灰度阶段只挑选了内容页和栏目页,robots.txt、站点地图和跳转规则都按新结构生成,监控里没有异常。全量发布后,旧的详情页、带参数的筛选页或已停用的合作落地页开始出现抓取记录,其中一部分还带着新的站内链接。
这不一定说明灰度失败。灰度样本通常偏向“有代表性的正常页面”,而例外恰恰是那些不在正常集合里的页面:它们可能来自旧系统残留、外部链接、历史站点地图,或者只在特定参数组合下才生成。灰度没有覆盖这些入口,自然看不到冲突。
第一种解释是样本选择问题。灰度只验证了主路径,例外路径从未进入测试范围。全量后,爬虫通过旧链接、参数组合或未清理的站点地图发现了它们,于是按新规则重新处理。这种情况下,灰度结论本身没有错,只是适用范围被误当成全量结论。
第二种解释是规则冲突。新规则在全量环境里与旧规则、旧跳转或旧站点地图同时生效,导致同一类URL收到互相矛盾的信号。例如新站点地图仍列出旧页面,而robots.txt又试图限制抓取;或者旧页面做了跳转,但跳转目标又被新的抓取限制挡住。灰度环境如果只启用了新规则、没有保留旧规则,就测不出这种冲突。
两种解释的区别在于:前者是“没测到”,后者是“测到了也不会通过”。如果例外路径在灰度名单之外,且灰度环境没有旧规则残留,就更偏向第一种;如果灰度环境同时存在新旧规则,却因为样本没命中冲突URL而显示正常,就更偏向第二种。
可以按下面几步收集能区分两种解释的证据。动作本身不复杂,关键是记录每一步的结果,再决定下一步查什么。
这些证据的作用不同:名单比对回答“测没测到”,旧入口排查回答“例外从哪来”,灰度补测回答“规则本身是否成立”,规则冲突核对回答“是不是全量环境特有”。如果补测后异常复现,下一步应优先修规则;如果补测不复现,下一步应清理旧入口或扩大灰度覆盖面。
假设某站要下线一批旧合作落地页,但保留其中仍有咨询价值的少数页面。灰度阶段只选了内容页做测试,robots.txt限制旧路径抓取,站点地图只保留新页面,灰度期没有异常。
全量发布后,旧合作方仍链接到已下线页面,部分页面还带参数生成新URL。爬虫通过这些外部链接和参数组合发现了它们,于是开始抓取。此时如果只看抓取量上升,容易误判为规则失效;但更合理的解释是:灰度名单没有覆盖外部入口和参数组合,例外在全量后才第一次暴露。
处理动作可以是:先保留仍有价值的页面并给它们独立规则,再对确认下线的页面做跳转或移除处理,同时更新旧站点地图和旧入口。做完这一步后,再观察抓取记录是否集中到保留页面;如果仍然分散到已下线路径,说明旧入口还没清理干净,下一步应继续排查外部链接和参数生成逻辑,而不是直接收紧全站抓取限制。
两种做法都成立,但条件不同。如果旧系统、旧合作关系和参数组合数量有限,且能提前枚举,灰度就应把例外路径纳入样本,至少覆盖每一类入口各一条。这样做的代价是灰度周期变长,但能提前暴露规则冲突。
如果例外数量大、来源分散,无法在灰度阶段全部枚举,就更适合在全量后靠抓取记录和入口排查兜底,同时保留快速回退规则的能力。此时灰度只验证主路径是否可用,不承担发现全部例外的责任。关键是把“灰度通过”限定为主路径通过,而不是全量安全。
无论选哪种,都要注意:robots.txt的抓取限制不等于可靠的索引移除,站点地图不保证收录,不同搜索引擎对同一规则的支持情况需要分别核查。灰度结论只能说明被测试的那部分URL在当时的规则下没有暴露问题,不能自动推广到全量。