搜尋抓取

蜘蛛抓取失敗的几種结果:哪些會重试,哪些直接放弃

抓取失敗並不都是一回事。连接超时、5xx、429 通常會被重试,404、410、robots 禁止則基本不會再来。本文按失敗發生的层級拆解蜘蛛的重试逻辑,並给出日誌排查與修正驗證的具体做法,帮助区分“蜘蛛没来”和“来了但没抓成”。

搜尋抓取

蜘蛛抓取失敗的几種结果:哪些會重试,哪些直接放弃

看服務器日誌的时候,很多人的關注点是“蜘蛛今天来了多少次”。但更有價值的問法是:那些没抓成功的請求,蜘蛛後来還来不来?同样是抓取失敗,结果差別很大——有的它几分钟後再来,有的它几個月都不再看一眼,還有的它干脆把這個地址從待抓列表里划掉。

先分清失敗發生在哪一层

把失敗先归類,判断起来會清楚很多:

  • 连接层:DNS 解析不出来、TCP 连不上、TLS 握手失敗、连接被重置或超时。這一层失敗时,蜘蛛连 HTTP 狀態碼都没拿到。
  • 协议层:拿到了狀態碼,但狀態碼本身表示異常,比如 5xx、429。
  • 内容层:返回 200,但内容為空、全是模板,或者跟用戶看到的不一样。

這三层對應的處理逻辑不一样,混在一起看日誌容易得出错誤结论。

大概率會重试的情况

如果失敗是临时性的,蜘蛛通常會再来:

  • 连接超时、连接被重置:一般视作網絡波動,會在一段時間後重排。
  • 5xx 服務端错誤:會被当作站点暂时不可用。
  • 429 請求過多:如果同时给出了 Retry-After,蜘蛛往往會按這個時間等。

需要注意的是,重试不是無限次、也不是固定間隔。连續失敗几次之後,間隔通常會被拉長,同一批 URL 的抓取节奏也會整体放慢。換句话说,短暂抖動代價不大,持續抖動會让整個站点的抓取频率往下掉。

基本不會再来的情况

下面這些属于“明确表態”,蜘蛛一般不會反复尝试:

  1. 404 和 410:内容不存在。410 的语义更明确,處理上通常更快。
  2. robots.txt 里禁止抓取的路径:蜘蛛不會去试探。
  3. 長期返回 403 的地址:除非站点侧有明顯變化,否則它没有理由再回来。
  4. 域名已经無法解析:连入口都没有了。

夹在中間的几種情况

實际排查里最麻烦的往往不是上面两類,而是灰色地带:

  • 软 404:狀態碼是 200,但頁面其實是空的,或者提示“内容已刪除”。這類頁面會一直被当成正常頁面,既占抓取額度,又可能被索引。
  • 403 與驗證碼:有时是防火墙誤伤,蜘蛛看到的和真實用戶看到的不一样。如果抓取端被拦,站点自己很难察觉,只能從日誌里识別。
  • 間歇性 5xx:偶發一两次影响有限,但如果每次抓取都撞上,蜘蛛對站点的整体评價會變差。

站点侧可以做的几件事

  1. 把日誌按狀態碼分组統計,看的是比例而不是绝對數量。5xx 占比哪怕只有百分之一二,也值得查。
  2. 错誤頁一定要返回正确的狀態碼。用 200 伪装错誤是最容易被忽略的問题。
  3. 维護窗口尽量给出明确的不可用狀態,而不是让請求大量超时。
  4. 對于确實下线的頁面,用 410 或 301 给出明确去向,別让它挂着 200。
  5. 把抓取日誌和服務器监控對照着看,区分“蜘蛛没来”和“蜘蛛来了但没抓成”。
抓取失敗本身不可怕,可怕的是失敗得含糊:狀態碼说不清原因,蜘蛛就只能靠猜,而它猜的结果通常是不再来。

怎么驗證修正有没有起作用

改完之後不要只看一两天。可以用一個简單的方法:挑一组之前频繁失敗的 URL,在日誌里追踪它們後續的狀態碼變化和最後一次被抓時間。如果狀態碼回归正常,而且抓取間隔逐渐缩短,說明修正生效;如果狀態碼正常了但蜘蛛依然不来,那問题多半不在服務器,而在這些 URL 本身的内容價值或内鏈位置上。