重试之前,先把失敗原因归好類
蜘蛛来過了但目标頁没被抓到,和蜘蛛压根没来,是两件事。前者通常能從日誌里找到狀態碼、响應時間、User-Agent;後者往往只有入口頁的訪問记錄,甚至什么都没有。重试策略只對前者有意义,對後者要解决的是“URL 有没有被蜘蛛發現”。
把日誌按狀態碼分段統計一遍,再决定要不要喂第二轮,比凭感觉整批重放省力得多。
值得再喂一次的几種情况
- 入口頁自身 5xx:蜘蛛来的时候入口頁正好在重啟、證书過期或者後端超时,這類失敗和 URL 质量無關,修好之後值得原样重放。
- 429 / 503 限流:說明蜘蛛愿意来,只是被服務器的並發限制挡住了,降並發、放宽限速後再喂。
- 连接超时或重置:要区分连接超时和讀取超时。连接超时多半是網絡或防火墙問题,讀取超时往往是入口頁生成太慢。
- DNS 或證书临时故障:修好之後重放一次成本很低,通常值得。
- 跳轉鏈路中間的某一跳失效:替換掉失效的那一环,让鏈路重新串起来。
不太值得重试的情况
- 稳定的 404、410:頁面确實不存在,反复喂只會消耗抓取次數。
- 被 robots 明确拒绝的路径:除非你改了規則,否則重试多少次结果一样。
- 參數组合近乎無限的地址:先做規范化去重,別把同一套内容生成成千上萬個變体。
- 目标頁本身是空壳:蜘蛛抓到了也拿不到内容,問题在頁面而不是在池子。
- 被 WAF 長期拦截:要改的是規則,不是重试次數。
重试的节奏:小步、單變量、留观察期
整批原样重放是最容易白忙的做法。更稳的方式是把失敗 URL 按原因分组,每组抽一小批做重试,一次只改一個變量——換入口頁、換出口 IP、降並發、精简跳轉鏈路,改哪样就只看哪样的结果。
重试之後留出至少一到两天的观察窗口,再看同一批 URL 的日誌有没有變化。当天喂、当天看,噪音往往比信号多。
重试的意义是排除故障,而不是把“同一個地址多喂几遍”当作提升收錄的手段。前者可控,後者不可控。
每次重试前先记下三件事
- 這批 URL 的来源與批次编号,方便和之前的日誌對上。
- 入口頁当时的响應狀態與耗时,判断是不是入口頁的問题。
- 重试时改動的變量是什么,只改一個,方便回看。
一個简單的排查顺序
先看狀態碼,判断是服務端問题、限流問题還是頁面本身的問题;再看入口頁,確認蜘蛛是不是真的能顺着鏈路走到目标頁;最後才怀疑资源质量,比如 IP 是否被大量滥用、域名是否有歷史問题。跳過前两步直接換池子,多半只是把同一個問题搬到新地方。
把失敗重试当成日常运维的一部分,定期清理永遠喂不動的地址,把抓取机會留给還有希望的 URL,池子的效率會慢慢体現出来。