常见问题

robots.txt 里的 Crawl-delay,能控制搜索蜘蛛抓入口页的速度吗

很多人在蜘蛛池入口页的 robots.txt 里加 Crawl-delay 来限速,但主流搜索蜘蛛并不都读这个字段。本文说明它的适用范围、真正影响抓取节奏的因素,以及 429 / Retry-After、入口页数量控制等更可靠的替代做法,并给出用日志验证效果的具体思路。

常见问题

robots.txt 里的 Crawl-delay,能控制搜索蜘蛛抓入口页的速度吗

给蜘蛛池入口页做限速时,很多人第一反应是在 robots.txt 里加一行 Crawl-delay,希望搜索蜘蛛慢一点、稳一点。这一行到底有没有用,取决于对面是谁,也取决于你想解决的是什么问题。

Crawl-delay 是什么,谁会遵守

Crawl-delay 不是 robots.txt 的正式标准,而是早期被部分搜索引擎引入的扩展指令,用来告诉爬虫两次请求之间至少间隔多少秒。写法通常是在 robots.txt 里加一行 Crawl-delay: 秒数

实际情况是:

  • Google 明确不读取 Crawl-delay。它对抓取节奏的控制来自自己的抓取预算和服务器响应反馈,这个值写得再大也不会改变它的行为。
  • Bing 更倾向于使用站长后台里的抓取控制设置,robots.txt 中 Crawl-delay 的支持情况并不稳定。
  • Yandex 等少数爬虫会读取并遵守这个字段。
  • 各类第三方爬虫、采集器的行为完全看实现,遵守与否无法预期。

所以如果你的蜘蛛池主要面对 Google,靠 Crawl-delay 限速基本等于没写。

真正决定抓取节奏的是什么

搜索蜘蛛决定“多久来一次、一次抓多少”,依据主要是这几件事:

  1. 站点整体的抓取价值与更新频率;
  2. 服务器对爬虫请求的响应速度和稳定性;
  3. 历史抓取中是否出现大量超时、5xx、连接重置;
  4. 入口页与目标页的结构是否清晰、链接是否稳定。

换句话说,速度不是靠一行配置喊出来的,而是靠响应质量养出来的。你希望它慢一点,往往是因为服务器扛不住,那就应该从服务器侧解决,而不是指望爬虫自觉。

想主动限速,更可靠的做法

用 429 / 503 加 Retry-After

当入口页所在服务器压力过大时,可以返回 429 或 503,并带上 Retry-After 响应头,告诉爬虫多久之后再来。主流搜索引擎对这种信号是有反应的,会相应降低该目录或站点的抓取速率。注意这是短期手段,长期返回 5xx 会拉低整体抓取量。

调整入口页的数量与分布

如果入口页成千上万、内容高度雷同,抓取压力自然会堆积。与其限速,不如先减少低价值入口页,把抓取预算集中到少数更新稳定、链接有效的页面上。

保证响应时间稳定

把入口页的 TTFB 控制在几百毫秒内,避免臃肿的 HTML 和同步外部请求,抓取节奏通常会自然变稳。

限速的目标不是让蜘蛛不来,而是让它来的时候不把服务器打垮。这两件事的解法完全不同。

几个常见误区

  • 写了 Crawl-delay 就以为生效。先确认来的是哪家蜘蛛,再判断这个字段有没有意义。
  • 数值写得越大越好。对遵守的爬虫来说,写 60 秒意味着它可能真的很少来,发现和抓取都会变慢;对不遵守的爬虫来说,写多少都没用。
  • robots.txt 语法写错。字段拼写、大小写、冒号后的空格都会影响解析,写错等于没有。
  • 用 Disallow 入口页来“限速”。禁止抓取和限制频率是两回事,Disallow 会让蜘蛛直接不去解析页面里的链接,目标 URL 更难被发现。

怎么验证有没有效果

看日志最直接:按小时统计搜索蜘蛛对入口页的请求次数、并发数、平均请求间隔,以及 2xx / 3xx / 429 / 5xx 的比例。改动前后各观察一到两周,比凭感觉判断可靠得多。如果请求间隔没有变化,而对面又是 Google,那基本可以确认它没有读你的 Crawl-delay。

结论:Crawl-delay 可以作为兜底配置写上,但不要指望它控制 Google 的抓取节奏。真正的限速手段在服务器侧——稳定的响应、合理的入口页数量,以及必要时的 429 与 Retry-After。