搜尋抓取

服務器报错之後:蜘蛛的退避、重试與恢复节奏

蜘蛛抓取时遇到 5xx,和遇到 404 是两回事。前者是环境层面的临时狀態,後者是内容层面的确定结论。本文讲清服務器不稳定时蜘蛛會怎么放慢抓取、延長重试間隔,以及恢复期该避免哪些操作,帮助你在故障之後让抓取节奏平稳回到正轨。

搜尋抓取

服務器报错之後:蜘蛛的退避、重试與恢复节奏

蜘蛛抓取时遇到 5xx,和遇到 404 是两回事。404 说的是這個地址确實没有内容,是一個内容层面的结论;5xx 说的是服務器這一次没把請求接住,是一個环境层面的临时狀態。蜘蛛對這两種信号的反應完全不同,處理方式自然也不该一样。

两種信号,两套反應

對蜘蛛来说,404 和 410 是相對确定的答案,抓取队列會逐步减少對這類地址的訪問;而 500、502、503、504 更像是“現在不方便”,蜘蛛倾向于過一段時間再来。正因為如此,把服務器故障当成頁面刪除来處理,反而容易誤伤。

  • 404 / 410:确定性结果,地址會被慢慢淡出抓取队列。
  • 500 / 502 / 503 / 504:临时性结果,蜘蛛會保留重试的意愿。
  • 403:有时介于两者之間,持續出現會被理解為不欢迎訪問,抓取节奏同样會放缓。
判断错的代價是不對称的:把临时故障当永久刪除,可能丢掉本可以恢复的頁面;把永久刪除当临时故障,只是多浪費几次抓取。

退避:蜘蛛的耐心是有上限的

如果同一個目錄在短時間内连續返回错誤,蜘蛛通常不會一直按原节奏试探,而是降低该目錄、有时甚至是整個站点的抓取频次。這個下調是渐進的,恢复也不是一键完成的,它會根據之後一段時間的响應情况慢慢回升。

常见的表現

  • 單位時間内的抓取請求數下降,訪問間隔拉長。
  • 已经抓過的頁面,重抓時間被推後。
  • 新發現的 URL 排队更久,發現到抓取之間的时差變大。

這些變化通常不會立刻体現在报表里,需要看一段時間内的日誌趋势,而不是盯着某一天的抓取總量下结论。

超时與连接中断同样算失敗

有些請求並不是返回了 5xx,而是压根没走完:连接被重置、响應只传了一半、首字节等待時間過長導致蜘蛛提前断開。對蜘蛛来说,這些和 5xx 属于同一類体驗——它没能完整拿到頁面。

可以检查的几個点

  1. 首字节時間是否偏長,動態頁面里有没有慢查询在拖後腿。
  2. 是否存在突發流量把請求排队,導致正常抓取被挤在後面。
  3. CDN 回源鏈路是否稳定,回源失敗會不會直接暴露成 5xx。
  4. 資料库连接池、後端依赖服務是否有間歇性抖動。

這些問题往往不是全天性的,而是集中在某個时段。對照日誌里蜘蛛訪問的時間分布,更容易定位。

恢复期该怎么做

故障排除之後,最容易犯的错是急着“补回来”。大量提交新 URL、频繁刷新 Sitemap,並不會让蜘蛛立刻恢复原来的节奏,反而可能加重服務器刚刚恢复时的负担。

  • 先確認狀態碼连續稳定一段時間,再考虑推動新的抓取。
  • 如果需要提交,分批進行,观察每次提交後的日誌反應。
  • 重点看恢复後蜘蛛的返回時間分布,而不是只看它有没有来。
  • 错誤頁面要返回正确的狀態碼,不要用 200 包着一個“出错了”的頁面,這會让蜘蛛把故障頁当成正常内容存下来。

日常预防比事後补救省力

抓取的底座是服務器能不能稳定地把頁面交出去。健康检查、静態頁缓存、異常时的降級頁面、业務高峰與抓取高峰的错開,這些看起来和“抓取優化”距离很遠,實际影响却最直接。一個能稳定返回 200 的站点,不需要太多技巧就能维持正常的抓取节奏;一個经常抖動的站点,再多的结构優化也會被反复拖慢。