搜索抓取

服务器说“不”的时候:429、503 与 403 会怎样改变蜘蛛的抓取节奏

抓取量下降不一定是因为内容或内链出了问题,服务器返回的状态码本身就在给蜘蛛传递调度信号。本文梳理 429、503、403、404、410 以及软 404 和连接层失败的区别,说明哪些状态码适合做临时限流,哪些会被当成长期拒绝,以及如何把状态码当成可以观察的运维指标。

搜索抓取

服务器说“不”的时候:429、503 与 403 会怎样改变蜘蛛的抓取节奏

状态码本身就是调度信号

很多站点在排查抓取量变化时,先看内容质量、内链结构和 Sitemap,却忽略了服务器返回的状态码。对蜘蛛来说,状态码不是一句客套话,而是关于「现在能不能抓、以后还要不要来」的判断依据。同一台服务器,返回 200 和返回 503,会走向完全不同的抓取安排。

理解这些信号的前提是:蜘蛛的抓取资源有限,它会根据历史响应情况决定对某个站点的访问频率。状态码的语义越明确,它做判断就越干脆;语义越模糊,它越倾向于保守,也就是少来。

429:明确的限流信号

429 Too Many Requests 表示请求过多,是最容易被正确理解的拒绝方式。蜘蛛收到 429 后,通常会降低对当前主机的并发与频率,并在稍后重试。如果响应中带有 Retry-After 头,重试的时机更有依据。

适合使用 429 的场景:短时间的流量高峰、批量任务占用带宽、需要给数据库留出恢复时间。相比直接把请求挂到超时,主动返回 429 更清晰,也更容易在恢复后把抓取量带回来。

503:暂时不可用,但不要长期挂着

503 Service Unavailable 的语义是服务暂时不可用,常用于维护窗口、后端崩溃、依赖不可达。蜘蛛一般会把这个 URL 标记为稍后再试,短期内不会当作页面消失。

需要注意的是「暂时」的时长。连续多天返回 503,蜘蛛会逐步降低抓取频率,恢复之后也需要一段时间才能回到原来的水平。如果维护计划很短,返回 503 加 Retry-After 是合理的;如果站点长期处于 503,本质上等于让蜘蛛慢慢忘记这里。

临时故障用 429 或 503,长期屏蔽用 403 或 401,页面消失用 404 或 410。把这三类混着用,蜘蛛就难以判断你的真实意图。

403 与 401:容易被误用的长期屏蔽

403 Forbidden 与 401 Unauthorized 表达的是「不允许访问」。蜘蛛收到之后,通常不会反复尝试,而是降低对该站点的抓取意愿。问题在于,很多 403 并不是有意设置的:WAF 规则误伤、地域限制、UA 黑名单、防盗链配置,都可能让正常抓取被拒。

如果你只是想在高峰期减缓压力,却返回了 403,蜘蛛很可能把它理解为长期拒绝,恢复后抓取量也不会立刻回来。类似地,把登录墙后的页面直接返回 401,对公开内容部分也是一种误伤。

404 与 410:URL 的正常退场

页面确实下线时,404 和 410 都是合理选择。两者都会让 URL 逐步离开抓取队列,410 的语义更确定,通常退场更快;404 可能被反复确认几次,但最终结果一致。

需要注意的是,不要让本该 404 的 URL 返回 200。批量下线的旧页面、已合并的参数页、废弃的分类页,如果仍然返回 200,就会被当作有效页面持续抓取,占用本可以留给新内容的预算。

软 404 与 200 的空页面

软 404 指的是返回 200,但页面内容为空、报错或提示「该内容不存在」。对蜘蛛来说,这仍然是一次成功的抓取,只是拿到的东西没有价值。它不会像真 404 那样把 URL 移出队列,反而可能因为内容变化而反复回访。

常见的软 404 来源包括:空搜索结果页、无库存商品页、被清空的标签页、模板渲染失败但状态码仍为 200 的页面。这类 URL 越多,抓取预算被无效消耗的比例就越高,新 URL 的发现速度也会受影响。

连接层的失败:超时、重置与截断

有些请求根本没走到状态码这一步:连接超时、TCP 重置、TLS 握手失败、响应被中途截断。这些情况在日志里表现为抓取失败,蜘蛛会尝试重试,但如果失败持续出现,它会主动降低访问频率,避免给服务器加压。

与状态码相比,连接层失败的信号更模糊,排查也更麻烦。它可能来自防火墙、负载均衡、源站进程数不足,也可能来自某个边缘节点的异常。只看状态码统计,很容易漏掉这部分。

把状态码当成运维指标

  • 按主机统计各状态码的比例,尤其是 5xx 与 429 的日变化。
  • 区分「人为设置的拒绝」与「故障导致的拒绝」,前者可控,后者需要尽快定位。
  • 检查是否存在 200 但内容为空的 URL 集合,评估它们占用的抓取量。
  • 维护窗口尽量使用 503 加 Retry-After,并控制在较短时长内。
  • 发现抓取量下降时,先看状态码趋势,再去看内容和内链。

状态码的作用不是讨好蜘蛛,而是让服务器和抓取调度之间的沟通更准确。语义清晰,恢复就快;语义混乱,恢复往往比故障本身更慢。