先给结论:当修复动作让另一类异常同时出现,不要急着回滚,也不要同时改两处。正确做法是把“修复本身”和“依赖它的下游环节”分开验证:先确认修复是否真的生效,再确认下游异常是修复的副作用、还是原本就被掩盖的问题。判断依据不是异常是否消失,而是哪一步变化先发生、哪一步可以独立复现。
假设一个常见场景:站点发现百度爬虫抓取某批页面时返回异常,于是调整了服务端对爬虫请求的处理逻辑,比如统一了响应头、改了跳转规则或收紧了访问控制。改动后,原来报错的页面恢复正常,但另一类页面开始出现抓取失败、抓取量下滑或日志里出现新的状态码。
这时最危险的反应是立刻把改动撤掉,因为撤掉只能让新异常消失,却无法回答一个关键问题:新异常到底是被这次修复触发的,还是它一直存在、只是之前被旧异常挡住了。撤掉改动等于把两条线索一起抹掉。
第一种解释是依赖副作用:修复动作改变了某个上游条件,而这个条件被下游环节依赖。例如统一响应头时改动了内容类型,下游的缓存或重定向规则因此失效;或者收紧访问控制时误伤了同一来源的另一类合法请求。
第二种解释是问题被替换而非被解决:原来的异常让爬虫提前中断,掩盖了后续环节本来就存在的缺陷。修复让流程走得更远,才暴露出下一段的问题。这种情况下,新异常不是修复造成的,而是修复把流程推进到了新的位置。
两种解释对应完全不同的决策:如果是副作用,要缩小修复的影响面;如果是被掩盖的旧问题,修复方向是对的,应该继续往下排查,而不是回滚。
能区分二者的证据有三类,按可靠性排序:
需要提醒的是,抓取量下滑或某类状态码归零,本身不能单独证明修复正确或错误。它还可能来自调度周期、缓存刷新、请求合并或上游限流。把这些现象直接当成因果结论,很容易误判。
假设某站点修复了爬虫请求的跳转规则,之后列表页抓取恢复,但详情页抓取开始返回异常。可以这样拆:
第三步是关键动作:它把“修复”和“下游依赖”分开,结果直接决定下一步——如果两类页面都正常,说明修复可以保留,只需为详情页补一条兼容规则;如果详情页仍异常,说明问题不在跳转规则,而在详情页自身的处理逻辑,应继续往下一层查,而不是回滚列表页的修复。
具体执行时,建议按下面的顺序推进,避免边改边猜:
另外,robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录。这些手段会影响爬虫行为,但不能用来替代对依赖链的排查。修复后如果同时调整了这类文件,应把它们视为新的变量单独验证。
最终判断标准很简单:能让每一步的变化都可解释、可复现,才说明依赖链被真正拆开了,而不是被下一次改动重新掩盖。