搜尋抓取

429 與 5xx 之後:蜘蛛退避期間,站点该做哪些事

蜘蛛的抓取节奏,很大程度上由服務器给它的回應决定。429 和 5xx 属于临时性信号,會让蜘蛛主動降低频率、拉長間隔。本文梳理退避期間常见的處理誤区、临时狀態碼的正确寫法,以及恢复抓取时可以先做哪几件事。

搜尋抓取

429 與 5xx 之後:蜘蛛退避期間,站点该做哪些事

蜘蛛要不要繼續抓你的站,很大程度上不取决于你提交了多少 URL,而取决于上一次它来的时候,服務器给了什么回應。一次 429、一次 503,或者一串 5xx,都會让抓取計划發生變化。理解這段“退避期”里發生了什么,才能知道恢复时该從哪里下手。

同一個站,不同狀態碼的含义不同

蜘蛛不會為每個狀態碼做同样的判断,大致會分成几類處理:

  • 200:正常拿到内容,按既定节奏繼續。
  • 301/302:跟着跳,但跳的次數多了會消耗耐心和抓取预算。
  • 404/410:這個地址大概率不再来。
  • 429 / 503:服務器在说“現在別来這么快”,属于临时性信号。
  • 500 等其他 5xx:服務器自己出了問题,同样偏临时,但连續出現會明顯降低来訪频率。

区別在于:404 是對某個 URL 的否定,而 429 和 5xx 是對“整批抓取”的否定。影响范围不一样,恢复方式也不一样。

429 與 503:慢下来,而不是停下来

這两個狀態碼通常意味着服務器或防護层在限流。蜘蛛一般會降低並發、拉長两次請求之間的間隔,隔一段時間再试探。這個過程中,本来排在後面的 URL 會被推得更後,新 URL 的發現速度也會跟着變慢。

如果服務端能带上 Retry-After 头,给出明确的等待秒數或時間点,蜘蛛的试探會更有規律,比反复撞墙省事得多。

5xx:短期抖動還是長期故障

偶尔一次 5xx,影响有限;如果同一批 URL 连續几天都返回 5xx,抓取频率下降几乎是必然的,而且恢复往往不是一两天的事。這时候要先解决的是服務器本身,而不是想办法让蜘蛛多来几次。

退避期間常见的几個坑

  • 把错誤頁做成 200:维護頁、限流頁如果返回 200,蜘蛛會当成正常内容记下来,後面清理成本更高。
  • 重试風暴:應用层、CDN、網關各自重试,叠加後回源压力比原来還大。
  • 只盯抓取次數:次數下降可能只是退避的结果,真正要看的是 5xx 比例和平均响應時間。
  • 忽略非蜘蛛流量:日誌里把监控、健康检查和蜘蛛混在一起看,很容易得出错誤结论。
  • 恢复後一次性放量:配置一改就把限流全部打開,常常触發第二轮退避。

恢复抓取时可以按這個顺序走

  1. 先從訪問日誌里切出蜘蛛的請求,按小时統計狀態碼分布與响應時間。
  2. 確認 429/5xx 集中在哪個环节:資料库、缓存、带宽,還是限流規則本身。
  3. 把临时性狀態碼用對:确實在维護就用 503 加 Retry-After,不要用 200 或 404 糊弄。
  4. 修复後先小范围放量,观察一段時間,再逐步放開並發與速率。
  5. 同步清理這段時間产生的大批量無效 URL,避免它們繼續占用恢复後的抓取能力。

怎么判断已经恢复

不需要等抓取量回到從前才算恢复。更有意义的观察点包括:蜘蛛請求里 200 的比例是否回升、平均响應時間是否稳定、5xx 是否接近零、同一批 URL 的重复抓取間隔是否在缩短。這几個指标平稳下来,說明抓取节奏正在回到正常轨道。

抓取的恢复通常是渐進的,而不是開關式的。與其琢磨怎么让蜘蛛马上多来,不如先保證它每次来都能顺利拿到想要的東西。