蜘蛛来抓一個 URL,结果没抓成。這件事在日誌里往往只留下一行狀態碼,或者干脆什么都没有。但失敗的原因差別很大,蜘蛛後續的處理方式也不一样。搞清楚自己遇到的是哪一類失敗,比笼统地说“蜘蛛不来了”更有用。
先分清:是没连上,還是连上了没拿全
- 连接阶段失敗:DNS 解析不到、TCP 连不上、TLS 握手失敗。這類失敗蜘蛛连 HTTP 請求都没發出去。
- 請求阶段失敗:连上了,請求也發出去了,但服務器返回 5xx、429,或者長時間不响應。
- 响應阶段失敗:狀態碼看着正常,但响應体被截断、中途超时断開。
這三類的排查方向完全不同。第一種基本是域名解析、防火墙、證书的問题;第二種是服務器和應用的問题;第三種往往是網絡鏈路或服務端輸出被提前掐断。
DNS 與连接失敗:蜘蛛根本没進门
如果日誌里连一條记錄都没有,先別急着怀疑蜘蛛偷懒,很可能是它压根没连上。常见原因包括:分线路解析把某些地区的解析结果指到了不可用的 IP;CDN 或 WAF 把蜘蛛的 IP 段拦在了前面;防火墙對陌生来源直接丢包,连 TCP 连接都建不起来。
排查时可以先用第三方工具從不同地区解析域名,確認返回的 IP 是否都在正常工作。如果用了 CDN,注意看回源是否稳定,以及是否有针對爬虫 UA 的拦截規則被誤開。
證书與 TLS:一個很容易被忽略的坎
證书過期、證书鏈不完整、只支持過舊的 TLS 版本,都會让蜘蛛在握手阶段直接失敗。浏览器有时會宽容處理,比如让你手動点“繼續訪問”,但蜘蛛不會。證书一旦出問题,整站抓取都可能停摆,而不是只影响一個頁面。
這類問题的特点是“全站性”。如果某天抓取量突然掉到接近零,而服務器配置本身没動過,證书到期是很值得第一時間检查的項。
超时與首字节:慢到一定程度就等于失敗
蜘蛛對每個請求都有自己的等待上限。服務器如果一直不返回首字节,蜘蛛會在超时後放弃,而這次放弃通常不會留下一個漂亮的狀態碼。表現就是:頁面在浏览器里能打開,但日誌里的抓取记錄稀疏。
常见诱因是資料库慢查询、頁面里同步調用了外部接口,或者某些動態參數頁面触發了全表掃描。可以留意日誌里响應時間明顯偏長的那些 URL,是否集中在某几個模板或參數上。
5xx 與 429:告诉蜘蛛稍後再来
- 500、502、503 通常被理解為临时故障,蜘蛛會降低频率並在之後重试。短時間内大量 5xx 會明顯拖慢整站抓取节奏。
- 429 是明确的“太快了”,一般配合 Retry-After 使用效果更好。
- 如果某個目錄長期返回 5xx,蜘蛛可能在一段時間内减少對该目錄的訪問,恢复後需要時間重建。
蜘蛛會重试,但不是無限次
抓取失敗後,蜘蛛通常會做有限次數的重试,間隔逐步拉長。也就是说,一次短暂的抖動影响有限,但如果你的服務器在蜘蛛常来的时段長期不稳定,它會把“這個站不太可靠”的判断落到抓取节奏上——来得更少、更慢。
另外,重试本身也占资源。同样的抓取能力被用在重试上,真正能拿到的新内容就更少。
一個可操作的排查顺序
- 先看日誌里有没有记錄。没有记錄,往 DNS、網絡、WAF 方向查。
- 有记錄但狀態碼異常,按 5xx、429、超时分類統計,看集中在哪些 URL 和时段。
- 检查證书有效期與 TLS 配置,尤其是抓取量突然整体下滑时。
- 看响應時間分布,找出慢頁面,判断是模板問题還是資料問题。
- 確認限速策略是否過嚴,把正常抓取也一起挡住了。
抓取失敗不是一個二元狀態,而是一段過程。哪一步断的,决定了你该修哪里。
把這些分层看清楚之後,“蜘蛛不来”就不再是一句笼统的抱怨,而是可以逐項驗證的問题。