搜尋抓取

蜘蛛把源站压满时:503、429 與 Retry-After 怎么用

源站被蜘蛛压满时,直接返回 500 或掐断连接都不是好办法。本文讲清 503、429 與 Retry-After 各自适合什么场景、如何按路径或 UA 做分流限速,以及這些狀態碼與抓取预算之間的關系,让抓取压力變得可控、语义變得清晰。

搜尋抓取

蜘蛛把源站压满时:503、429 與 Retry-After 怎么用

抓取压力上来的时候,源站最先感受到的是连接數和 CPU。有些站点一遇到蜘蛛密集訪問就直接返回 500,或者干脆把连接掐掉。结果往往是:蜘蛛没少来,只是白跑一趟,下一次来得更没規律。

其實 HTTP 狀態碼本身就是一套跟蜘蛛沟通的語言。用對了,它可以告诉蜘蛛現在別来、或者慢一点;用错了,反而會放大损耗。

先分清几種狀態碼在说什么

  • 200:内容正常。如果返回的是一個系統繁忙提示頁,蜘蛛會把它当成正常内容收走,等于把一個無意义頁面放進了索引。
  • 404 / 410:頁面确實不存在。410 比 404 更明确,蜘蛛通常更快把它從待抓队列里划掉。
  • 500:服務端内部错誤。蜘蛛會認為這是临时故障,過一阵再来,但長期大面积 500 會拖低它對站点的信任度。
  • 503:服務暂时不可用。這是最合适的、表達我現在真的扛不住的方式。
  • 429:請求太多。偏向于表達你請求频率超了,請放慢。

503 的正确用法:带上 Retry-After

單獨返回 503 只說明了不可用,没有說明多久之後可以来。加上 Retry-After 响應头,语义才完整:

HTTP/1.1 503 Service Unavailable,响應头中包含 Retry-After: 3600

這個值可以是秒數,也可以是一個 HTTP 日期,意思是這個時間之後再试。對搜尋引擎蜘蛛来说,這比断连和超时友好得多:它至少知道该等多久,而不是靠猜。

有几個邊界要注意:

  • Retry-After 不要给得過長。几小时量級可以接受,動辄几天容易让蜘蛛把整個站点的抓取频率調低。
  • 不要長期全站 503。持續返回 503 的站点,蜘蛛會逐步减少抓取,恢复之後也需要一段時間才把频率加回来。
  • 能按路径分就按路径分。评论提交、站内搜尋接口、下單流程這些不需要被抓的路径返回 503,正文頁面保持 200,比全站一起挡更划算。

429 更适合做细粒度限速

如果说 503 是整体關门,429 更像是你這一路走得太快。按 UA 或按来源 IP 做限速时,超出的請求返回 429,再配上 Retry-After,比直接返回 403 更清楚:403 意味着你没资格,429 意味着稍等再来,後者不會让蜘蛛誤判頁面的可訪問性。

實践中可以這样分层:正常抓取放行,短時間内超過阈值的返回 429 加一個較短的 Retry-After,源站整体压力過大时再切到 503。层次分明,蜘蛛也容易讀懂。

和抓取预算的關系

抓取预算不是一份固定配額,蜘蛛會根據抓到的内容有没有價值、站点响應是否稳定来動態調整。一個延迟忽高忽低、时不时冒出 5xx 的站点,即便 URL 數量很多,也很难拿到高频抓取。反過来,响應稳定、狀態碼语义清晰的站点,蜘蛛更愿意多花時間。

所以限速的目的不是把蜘蛛赶走,而是让每一次抓取都有结果。請求被 503 挡回去,和請求超时被掐断,看起来都是没抓到,但對蜘蛛留下的印象完全不同。

落地时容易踩的几個坑

  1. 用 200 返回错誤頁。蜘蛛會当成正常頁面反复来抓,白白消耗预算。
  2. 返回 503 却不给 Retry-After。蜘蛛只能按預設策略重试,节奏未必是你想要的。
  3. 把 500 当限速手段。500 代表我出故障了,長期使用會拖低整站抓取稳定性的评價。
  4. 防護規則誤伤正常蜘蛛。限速生效後,最好在日誌里按 UA 抽样看一遍,確認被拦的是高频異常請求。
  5. 恢复之後什么都不做。流量回稳後,可以用 Sitemap 或者站内入口重新把重点 URL 推到蜘蛛面前,別指望它立刻自己找上门。

小结

源站能不能稳定响應,是抓取路径里最基础的一环。狀態碼用對了,等于在蜘蛛和你之間留了一條明确的沟通通道:忙的时候说清楚忙多久,不忙的时候保持干净利落的 200。剩下的 URL 發現和内鏈结构,才有條件發挥作用。