搜索抓取

429 和 Crawl-delay:主动限速之后,蜘蛛会怎么调整抓取节奏

蜘蛛抓得太猛会压垮服务器,于是不少站点选择限速。但限速用什么状态码返回、限到什么程度,会直接影响蜘蛛后续的抓取节奏。本文说清 429、503 与 Crawl-delay 的差别,以及限速之后蜘蛛可能出现的行为变化和几个常见误区。

搜索抓取

429 和 Crawl-delay:主动限速之后,蜘蛛会怎么调整抓取节奏

有些站点担心抓取压力,会主动限制蜘蛛的请求速率。这本身是合理做法,但限制的方式和返回值不一样,蜘蛛后续安排抓取的方式也会跟着变。

限速不等于拒绝

限速的核心意思是「现在太密了,慢一点」,而不是「这个 URL 不要了」。蜘蛛对这两种信号的解读完全不同:前者会让它推迟抓取,后者可能让它把页面从待抓列表里划掉。所以限速时返回什么状态码,值得先确认清楚。

429 与 503 的差别

  • 429 Too Many Requests:服务器还在正常工作,只是当前请求超过了允许的速率。这是限速最贴切的表达。
  • 503 Service Unavailable:服务暂时不可用,通常指后端过载、维护或依赖故障,语义比 429 更重。
  • 403 Forbidden:表示拒绝访问。用它来限速,容易让蜘蛛把请求理解成「禁止抓取」。

如果是限速,优先用 429,并尽量带上 Retry-After 头,告诉蜘蛛多久之后可以再来。有这个头,蜘蛛不必自己猜;没有,它只能按经验往后退,节奏会更保守。

Crawl-delay 能做什么,不能做什么

Crawl-delay 写在 robots.txt 里,形式上是请求间隔的秒数。它的局限主要有两点:一是并非所有蜘蛛都完全遵守;二是主流搜索引擎在自家站长平台里另有抓取速率设置,那个设置的实际权重往往更高。

所以 Crawl-delay 更适合当作辅助手段。如果服务器确实吃紧,与其只写一行 Crawl-delay,不如同时观察日志和抓取统计,看真实请求量落在什么区间。

限速之后,蜘蛛可能的行为

  • 降低对该主机的请求频率,一段时间内的抓取总量可能下降。
  • 如果 429 或 5xx 长期大量出现,抓取节奏会更保守,恢复需要时间。
  • 已经发现的 URL 一般仍会排队等待,只是抓取被推迟,而不是立刻消失。
  • 抓取日志里会积累失败记录,失败率上升也会反过来影响蜘蛛对站点可用性的判断。

限到什么程度比较合适

  1. 先看服务器实际能扛住多少并发,再回推允许的请求速率,而不是凭感觉设一个数字。
  2. 用日志或站长平台的抓取统计,找出请求集中的时段,重点在这些时段做限制。
  3. 优先限制对动态、重查询类 URL 的抓取,静态资源可以放得宽一些。
  4. 限速规则尽量按目录或参数区分,避免全局一刀切,把正常页面的抓取也一起压下去。

几个容易踩的坑

  • 用 WAF 或 CDN 直接给蜘蛛返回 403,蜘蛛没法区分这是策略还是故障。
  • 按 IP 段整段屏蔽,可能连正常的抓取请求一起挡掉。
  • 限速响应不带 Retry-After,蜘蛛只能自己估算退避时间。
  • 把限速错误当成 404 返回,会让蜘蛛以为页面已经不存在。

一份简单的检查清单

  • 服务器在压力升高时,是返回 429,还是直接超时或 5xx?
  • 限速响应里是否带了 Retry-After?
  • 429、503、403 三种情况是否区分清楚,没有混用?
  • 是否有一条针对爬虫的独立限速策略,而不是和普通用户共用?
  • 连续观察一段时间,抓取量和失败率的变化是否在预期之内?
限速的目标是让抓取更平稳,而不是把蜘蛛推得更远。把状态码写对、把退避时间说清,比单纯压请求量更有效。