蜘蛛抓取时遇到 5xx,和遇到 404 是两回事。404 说的是這個地址确實没有内容,是一個内容层面的结论;5xx 说的是服務器這一次没把請求接住,是一個环境层面的临时狀態。蜘蛛對這两種信号的反應完全不同,處理方式自然也不该一样。
两種信号,两套反應
對蜘蛛来说,404 和 410 是相對确定的答案,抓取队列會逐步减少對這類地址的訪問;而 500、502、503、504 更像是“現在不方便”,蜘蛛倾向于過一段時間再来。正因為如此,把服務器故障当成頁面刪除来處理,反而容易誤伤。
- 404 / 410:确定性结果,地址會被慢慢淡出抓取队列。
- 500 / 502 / 503 / 504:临时性结果,蜘蛛會保留重试的意愿。
- 403:有时介于两者之間,持續出現會被理解為不欢迎訪問,抓取节奏同样會放缓。
判断错的代價是不對称的:把临时故障当永久刪除,可能丢掉本可以恢复的頁面;把永久刪除当临时故障,只是多浪費几次抓取。
退避:蜘蛛的耐心是有上限的
如果同一個目錄在短時間内连續返回错誤,蜘蛛通常不會一直按原节奏试探,而是降低该目錄、有时甚至是整個站点的抓取频次。這個下調是渐進的,恢复也不是一键完成的,它會根據之後一段時間的响應情况慢慢回升。
常见的表現
- 單位時間内的抓取請求數下降,訪問間隔拉長。
- 已经抓過的頁面,重抓時間被推後。
- 新發現的 URL 排队更久,發現到抓取之間的时差變大。
這些變化通常不會立刻体現在报表里,需要看一段時間内的日誌趋势,而不是盯着某一天的抓取總量下结论。
超时與连接中断同样算失敗
有些請求並不是返回了 5xx,而是压根没走完:连接被重置、响應只传了一半、首字节等待時間過長導致蜘蛛提前断開。對蜘蛛来说,這些和 5xx 属于同一類体驗——它没能完整拿到頁面。
可以检查的几個点
- 首字节時間是否偏長,動態頁面里有没有慢查询在拖後腿。
- 是否存在突發流量把請求排队,導致正常抓取被挤在後面。
- CDN 回源鏈路是否稳定,回源失敗會不會直接暴露成 5xx。
- 資料库连接池、後端依赖服務是否有間歇性抖動。
這些問题往往不是全天性的,而是集中在某個时段。對照日誌里蜘蛛訪問的時間分布,更容易定位。
恢复期该怎么做
故障排除之後,最容易犯的错是急着“补回来”。大量提交新 URL、频繁刷新 Sitemap,並不會让蜘蛛立刻恢复原来的节奏,反而可能加重服務器刚刚恢复时的负担。
- 先確認狀態碼连續稳定一段時間,再考虑推動新的抓取。
- 如果需要提交,分批進行,观察每次提交後的日誌反應。
- 重点看恢复後蜘蛛的返回時間分布,而不是只看它有没有来。
- 错誤頁面要返回正确的狀態碼,不要用 200 包着一個“出错了”的頁面,這會让蜘蛛把故障頁当成正常内容存下来。
日常预防比事後补救省力
抓取的底座是服務器能不能稳定地把頁面交出去。健康检查、静態頁缓存、異常时的降級頁面、业務高峰與抓取高峰的错開,這些看起来和“抓取優化”距离很遠,實际影响却最直接。一個能稳定返回 200 的站点,不需要太多技巧就能维持正常的抓取节奏;一個经常抖動的站点,再多的结构優化也會被反复拖慢。