搜尋抓取

同样是抓取失敗:5xx、503、429 在蜘蛛眼里不是一回事

服務器返回错誤时,蜘蛛的反應並不一样:500、502、504 會让它降低抓取频率,503 是明确的"可以晚点再来",429 則代表限流。本文梳理几類常见错誤碼的差异、日誌排查顺序,以及為什么服務器稳定性本身就是抓取路径的一部分。

搜尋抓取

同样是抓取失敗:5xx、503、429 在蜘蛛眼里不是一回事

抓取日誌里出現错誤碼时,很多人第一反應是"是不是蜘蛛不喜欢我的站"。其實同样是抓取失敗,在蜘蛛看来差別很大:有的只是這一次没拿到,過一會儿會再来;有的說明整個主机正在出問题,蜘蛛會主動降低訪問频率,甚至暂时把這段路径排到後面。搞清楚這些差別,才能判断该马上處理,還是過几分钟再看。

先分两類:临时抖動和持續故障

判断依據主要有三個:狀態碼本身、错誤持續的時間和影响范围、以及服務器给出的附加信息,比如 Retry-After 响應头。個別 URL 偶發 500,通常是某段代碼或某個查询超时;整站大面积 5xx,往往意味着這台主机目前不稳定。范围不同,蜘蛛後續的調整也不同。

500、502、504:站点侧的問题,蜘蛛會向外退

500 一般表示服務端脚本出错,502 和 504 多出現在反向代理、網關或後端超时。這類错誤的共同点是問题在站点這邊,而且往往不止影响一個頁面。蜘蛛连續遇到 5xx 时,常见做法是降低该主机上的並發和抓取频率,把资源挪去別的站点,過一段時間再回来试探。

需要注意的是,5xx 不會让已经索引的 URL 立刻消失,但反复失敗會让蜘蛛對這段路径的信心下降——原本每天来几次的目錄,可能變成几天才来一次。恢复之後也不一定马上回到原来的节奏,通常要有一段正常响應的時間来慢慢回来。

503:這是明确告诉蜘蛛"現在別来"

503 的语义是服務暂时不可用,适合用在計划内维護、临时下线、高峰期限流這些场景。如果维護有明确的結束時間,可以在响應头里带上 Retry-After,寫清楚多久之後再试。蜘蛛看到這個信号,一般會推迟重訪,而不是当成永久失效。

反過来说,如果服務器長期返回 503,蜘蛛會逐渐把它当成一種不稳定的常態,抓取频率同样會降下来。所以 503 适合短時間用,不适合当作長期的"挡蜘蛛"方案。

429:限流信号,別让它變成常態

429 表示請求過多。有些站点在高峰期用它限制一切来源的請求,蜘蛛也在其中。偶尔出現可以理解,但如果蜘蛛几乎每次来訪都撞上 429,它會明顯放慢节奏。更麻烦的是,限流往往發生在抓取最密集的时段,也就是蜘蛛最需要拿到内容的时候。

比起一刀切地限流,更常见的做法是给不同類型的請求設定不同阈值,或者只限制動態、耗资源的路径,让静態頁面和主要入口保持可訪問。

403、401 與连接层失敗

403 表示拒绝訪問,蜘蛛無法判断是内容不存在還是被挡在门外;被挡的次數多了,来訪通常會减少。401 則是要求身份認證。连接层的失敗——DNS 解析不了、连接被重置、首字节時間過長——不會留下一個漂亮的狀態碼,但同样會被計入抓取失敗的統計里。這類問题常在服務器负载高、防火墙拦截或證书異常时冒出来。

出現错誤後,可以按這個顺序看

  1. 確認范围:是單個 URL、某個目錄,還是整站。用日誌按路径分组,別只看總數。
  2. 看時間分布:是某几分钟的突發,還是持續了几個小时甚至几天。
  3. 看响應头:有没有 Retry-After,是否被 CDN、WAF 或负载均衡改寫過。
  4. 看静態资源:图片、CSS、JS 大批 5xx 时,頁面即使返回 200,蜘蛛拿到的也是不完整的頁面。
  5. 確認恢复:修好之後繼續盯同一段路径的狀態碼,別只看首頁就收工。
頁面返回 200,不代表這次抓取就是成功的。渲染所需的资源成批失敗时,蜘蛛看到的内容可能和用戶看到的相差很遠。

把稳定性当成抓取路径的一部分

抓取路径不只是連結怎么连,還包括蜘蛛每一次請求能不能顺利拿到東西。同样的内鏈结构,放在一台响應稳定的服務器上,和放在多台机器频繁抖動的环境里,最终被走完的頁面數量可能差很多。與其反复調整清單和連結,不如先把 5xx 和连接失敗压到一個很低的水平,再去處理结构和深度的問题。

最後提醒一句:狀態碼是给机器看的信号,寫法要贴合语义。把该返回 404 的頁面返回 200,把限流寫成 404,都會让蜘蛛對站点做出错誤判断,之後的抓取安排也就更难预期。