先分清“抓取失敗”是哪一種失敗
搜尋蜘蛛訪問入口頁时,失敗並不是單一狀態。常见的可以分為几類,處理方向完全不同:
- 解析阶段:DNS 查不到域名、解析超时,或解析到的 IP 無法连通。
- 连接阶段:TCP 连接被拒绝、连接超时、连接被重置(RST)。
- 安全握手阶段:TLS 證书過期、證书鏈不完整、协议版本不被支持。
- HTTP 阶段:返回 5xx、返回 429、响應头缺失或响應不符合协议。
- 讀取阶段:响應头正常返回,但正文長時間不結束,触發超时。
這几類在蜘蛛日誌里可能都表現為“没有抓到”,但後續影响差別很大。解析類和连接類問题通常會让抓取频率較快下降,而偶發的讀取超时往往只是單次失敗。
重试一般存在,但規則不由你决定
主流搜尋引擎的抓取系統基本都有失敗重试逻辑,只是次數、間隔和触發條件属于各自内部策略,没有對外公開的固定值。從日誌中能观察到的共性大致是:
- 短時間内的偶發失敗,例如一次超时,多半會在後續被重试。
- 连續失敗通常會拉長重试間隔,而不是越失敗来得越勤。
- 解析失敗、證书错誤這類問题,重试往往不會很快發生,因為成本高、成功率低。
- 5xx 和 429 的语义不同:前者代表服務器故障,後者代表主動限流,蜘蛛的退让方式也不一样。
不要假设“每次失敗都會被重试”。把入口頁做成稳定返回,比研究重试次數更有效。
從日誌里观察重试行為
- 先按蜘蛛来源 IP 分组,而不是只按 URL 分组,這样才能看到同一個蜘蛛的连續動作。
- 看同一 IP 對同一 URL 的請求時間間隔:如果從几秒變成几分钟、几小时,說明抓取节奏在退让。
- 對照服務器狀態碼日誌,確認失敗是發生在自己這一侧,還是發生在網絡鏈路上。
- 记錄失敗集中出現的时段,看是否與流量高峰、备份任務、CDN 回源或防火墙策略變更重合。
- 如果同一天里同一蜘蛛對同一 URL 反复出現,說明重试存在;如果之後几天完全没有出現,通常意味着抓取優先級被下調。
服務器端更值得先排查的几項
- 连接數限制:Web 服務器或防火墙對單 IP 並發连接做了限制,蜘蛛多開几條连接就被拒。
- 回源鏈路:CDN 回源超时設定過短,源站稍慢就返回 5xx。
- IPv6:域名同时解析到 IPv4 和 IPv6,但 IPv6 鏈路不通,部分抓取會直接失敗。
- 證书與协议:證书鏈不完整、只支持老舊 TLS 版本,都會在握手阶段失敗。
- 防火墙與風控:把搜尋引擎的 IP 段誤判為異常流量,触發拦截或驗證頁。
一個常见誤区
有些人看到日誌里蜘蛛反复来訪,就認為“蜘蛛很喜欢這個入口頁”,甚至频繁更換服務器或 IP 来制造更多訪問。實际上,反复出現的請求里很可能包含失敗重试。判断抓取是否健康,應该看成功返回 200 的比例和被抓取覆盖的 URL 數量,而不是看請求總數的多少。請求很多但大量 5xx,對入口頁的抓取只會越来越不利。
另外,調整任何參數後都要留一段观察期。抓取节奏的變化通常滞後于服務器狀態的變化,当天改完当天见效的情况很少见。