搜索抓取

5xx 与 429:服务器拒绝服务时,蜘蛛的重试与降频

蜘蛛遇到 500、502、503、504、429 时的处理方式并不相同:有的会稍后重试,有的会让它主动放慢。本文梳理不同状态码对应的抓取端反应、重试与降频的边界,以及计划维护、限流、后端故障时该给出什么信号。

搜索抓取

5xx 与 429:服务器拒绝服务时,蜘蛛的重试与降频

蜘蛛来访时,服务器偶尔报错很正常。真正影响 URL 发现和后续抓取的,不是某一次 500,而是这类错误出现的频率、持续的时间,以及返回的状态码本身。

先分清:蜘蛛从状态码里读到了什么

同一个「页面打不开」,用不同状态码表达,抓取端的后续动作并不一样。

  • 500、502、503、504:通常被理解为临时性服务器问题,蜘蛛倾向于保留原有 URL 记录,过一段时间再来试。
  • 429:明确的速率限制信号,多数抓取工具会放慢速度,而不是立刻把这个 URL 判为无效。
  • 503 配合 Retry-After:可以告诉蜘蛛大概多久之后再来,适合有计划维护、灰度发布时使用。
  • 连接超时、TLS 握手失败:和状态码不同,这类情况连响应头都没传出去,蜘蛛只知道这次没连上。

需要避开的一个坑是:用 200 返回一个「系统繁忙」的 HTML 页面。这在蜘蛛眼里是正常内容,既不会重试,也不会当作临时故障处理,反而可能把原来的页面内容替换掉。

重试不是无限的

短时间的错误,蜘蛛一般会给几次机会。如果同一批 URL 连续多次返回 5xx,抓取端通常会有两种反应:降低对整站的抓取频率,或者暂停一段时间再来。恢复速度取决于错误持续时间——几分钟的抖动和持续几天的报错,处理方式完全不在一个量级。

还有一种情况容易被忽略:如果错误只发生在某个栏目或某台后端,蜘蛛看到的是「一部分 URL 稳定正常,另一部分长期不可用」。它最终调整的是分组层面的抓取节奏,而不是简单地整站降频。

实测中比较有效的一些做法

  • 计划内维护、发版、迁移期间,用 503 配合 Retry-After,而不是直接摘掉机器让连接失败。
  • 限流规则里给常见搜索引擎的 UA 留出单独配额,避免爬虫和真实用户同时被限,导致大面积 429。
  • 检查负载均衡和后端健康检查是否过于敏感,短时间内把正常节点判为不可用。
  • 数据库慢查询、缓存击穿常常是 5xx 的源头,修这两类问题比事后调整抓取参数更有效。
  • 在访问日志里把蜘蛛流量单独统计,观察其中的 5xx 比例和响应时间分布,而不是只看整站均值。

如何判断问题是否需要处理

可以按三个维度观察:错误集中在哪些 URL 分组、错误持续了多长时间、同一 URL 的后续访问是否恢复成功。如果某个分组连续几天在蜘蛛访问中保持较高的错误率,就值得从服务端入手排查;如果只是零星分布、第二天就恢复正常,通常不需要额外干预。

状态码是给抓取端看的信号,不是给监控面板看的。返回什么,决定了蜘蛛接下来是重试、放慢,还是不再回来。

长期看,稳定的响应比偶尔的优化技巧更能决定 URL 被发现的效率。把 5xx 控制在一个小比例内,蜘蛛才有余力继续沿着内链和清单去发现新页面。