搜尋抓取

抓取失敗重试的間隔與上限:日誌里反复尝试的 URL 怎么處理

日誌里同一個 URL 反复出現,往往不是蜘蛛在重复抓取,而是 5xx、超时、429 或拦截頁触發了重试。本文按响應類型、重试間隔、重试上限三层来做核對,並列出服務器侧需要检查的並發、超时、错誤頁返回碼與日誌字段,帮助定位反复失敗的地址,把抓取节奏拉回正常。

搜尋抓取

抓取失敗重试的間隔與上限:日誌里反复尝试的 URL 怎么處理

為什么同一個 URL 會在日誌里出現很多次

抓取日誌里出現重复訪問,未必是蜘蛛在“反复抓取同一頁”。常见原因有三類:一是頁面返回 5xx 或請求超时,蜘蛛按自己的节奏重试;二是源站响應太慢,连接被中断,蜘蛛没拿到完整内容;三是站点對蜘蛛做了限速或拦截,返回 429 或驗證頁,蜘蛛過一段時間再来。把這三類分開,後面的處理方向才不會跑偏。

哪些响應會触發重试

  • 5xx 服務端错誤:最常见。資料库连接超时、應用進程打满、網關错誤都會返回 500/502/503,蜘蛛通常會在間隔一段時間後重试。
  • 請求超时與连接重置:日誌里表現為没有狀態碼、字节數很小或為 0,或者连接被 reset。這類记錄容易被誤判為“已经抓取過”。
  • 429 與限速頁:返回 429 时,重试間隔通常會被拉長;如果站点長期返回 429,整体抓取频次會下降。
  • 驗證碼與 WAF 拦截頁:返回 200 但内容是拦截頁,蜘蛛可能把它当成正文,也可能在後續再试,行為因實現而异。

重试間隔在日誌里的形態

把同一個 URL 的訪問時間排成一列,看相邻時間差。狀態稳定的站点通常能看到比較規律的間隔,比如几分钟、几小时、一天。如果時間差忽長忽短,並且集中在几分钟内反复出現,通常說明源站在同一時間段不稳定,而不是蜘蛛“變凶了”。

另一個可看的维度是同一天的分布:失敗集中在某個小时,多半和该时段的备份任務、定时脚本、批量導入有關。把日誌時間窗和运维任務表對一下,往往能直接找到原因。

重试有没有上限

有,但没有公開的固定數字。能观察到的現象是:同一個 URL 连續失敗若干次後,訪問間隔會明顯拉長,甚至一段時間内不再出現。這期間即使你修好了服務端,蜘蛛也不會立刻回来。所以站点長時間不可用之後,需要靠 Sitemap 更新和内鏈入口把 URL 重新带回抓取队列,而不是等它自己恢复。

修好服務端只是第一步,让蜘蛛重新愿意来是第二步。

服務器侧要核對的几件事

  1. 並發上限:確認源站能承受多少並發连接,限速不要低到让蜘蛛频繁超时。
  2. 超时時間:網關、應用、資料库的超时层层叠加,最终耗时可能超過蜘蛛的等待時間。
  3. 错誤頁返回碼:出错的頁面應返回 5xx 或 503,而不是返回 200 的空壳頁,否則容易被当成正常内容收錄。
  4. 503 與 Retry-After:計划内维護可以返回 503 並给出重试時間,比直接拒绝更友好。
  5. 日誌字段完整性:狀態碼、响應時間、字节數、UA 都要记錄,否則無法判断是超时、截断還是空响應。

一個简單的核對顺序

先按 URL 分组統計訪問次數,筛出訪問次數明顯偏高的地址;再看這些地址的狀態碼分布,確認是 5xx、超时還是 429;接着把失敗時間窗和服務器监控、运维任務對齐;最後检查這些 URL 是不是集中在同一批模板或同一台机器上。多數情况下,問题會落在某几個接口、某張列表頁或某個資料源上,而不是全站。

處理完之後不要只盯着“訪問次數有没有下降”,還要看成功抓取的頁面數量有没有回升。次數下降但成功率没變,可能只是蜘蛛降低了整体频次,這對站点並不是好事。另外,站長平台里的抓取频次設定只是建议值,不保證一定生效,最终還是要以日誌為准。