看服務器日誌的时候,很多人的關注点是“蜘蛛今天来了多少次”。但更有價值的問法是:那些没抓成功的請求,蜘蛛後来還来不来?同样是抓取失敗,结果差別很大——有的它几分钟後再来,有的它几個月都不再看一眼,還有的它干脆把這個地址從待抓列表里划掉。
先分清失敗發生在哪一层
把失敗先归類,判断起来會清楚很多:
- 连接层:DNS 解析不出来、TCP 连不上、TLS 握手失敗、连接被重置或超时。這一层失敗时,蜘蛛连 HTTP 狀態碼都没拿到。
- 协议层:拿到了狀態碼,但狀態碼本身表示異常,比如 5xx、429。
- 内容层:返回 200,但内容為空、全是模板,或者跟用戶看到的不一样。
這三层對應的處理逻辑不一样,混在一起看日誌容易得出错誤结论。
大概率會重试的情况
如果失敗是临时性的,蜘蛛通常會再来:
- 连接超时、连接被重置:一般视作網絡波動,會在一段時間後重排。
- 5xx 服務端错誤:會被当作站点暂时不可用。
- 429 請求過多:如果同时给出了 Retry-After,蜘蛛往往會按這個時間等。
需要注意的是,重试不是無限次、也不是固定間隔。连續失敗几次之後,間隔通常會被拉長,同一批 URL 的抓取节奏也會整体放慢。換句话说,短暂抖動代價不大,持續抖動會让整個站点的抓取频率往下掉。
基本不會再来的情况
下面這些属于“明确表態”,蜘蛛一般不會反复尝试:
- 404 和 410:内容不存在。410 的语义更明确,處理上通常更快。
- robots.txt 里禁止抓取的路径:蜘蛛不會去试探。
- 長期返回 403 的地址:除非站点侧有明顯變化,否則它没有理由再回来。
- 域名已经無法解析:连入口都没有了。
夹在中間的几種情况
實际排查里最麻烦的往往不是上面两類,而是灰色地带:
- 软 404:狀態碼是 200,但頁面其實是空的,或者提示“内容已刪除”。這類頁面會一直被当成正常頁面,既占抓取額度,又可能被索引。
- 403 與驗證碼:有时是防火墙誤伤,蜘蛛看到的和真實用戶看到的不一样。如果抓取端被拦,站点自己很难察觉,只能從日誌里识別。
- 間歇性 5xx:偶發一两次影响有限,但如果每次抓取都撞上,蜘蛛對站点的整体评價會變差。
站点侧可以做的几件事
- 把日誌按狀態碼分组統計,看的是比例而不是绝對數量。5xx 占比哪怕只有百分之一二,也值得查。
- 错誤頁一定要返回正确的狀態碼。用 200 伪装错誤是最容易被忽略的問题。
- 维護窗口尽量给出明确的不可用狀態,而不是让請求大量超时。
- 對于确實下线的頁面,用 410 或 301 给出明确去向,別让它挂着 200。
- 把抓取日誌和服務器监控對照着看,区分“蜘蛛没来”和“蜘蛛来了但没抓成”。
抓取失敗本身不可怕,可怕的是失敗得含糊:狀態碼说不清原因,蜘蛛就只能靠猜,而它猜的结果通常是不再来。
怎么驗證修正有没有起作用
改完之後不要只看一两天。可以用一個简單的方法:挑一组之前频繁失敗的 URL,在日誌里追踪它們後續的狀態碼變化和最後一次被抓時間。如果狀態碼回归正常,而且抓取間隔逐渐缩短,說明修正生效;如果狀態碼正常了但蜘蛛依然不来,那問题多半不在服務器,而在這些 URL 本身的内容價值或内鏈位置上。