搜尋抓取

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 控制在一個小比例内,蜘蛛才有余力繼續沿着内鏈和清單去發現新頁面。