為什么同一個 URL 會在日誌里出現很多次
抓取日誌里出現重复訪問,未必是蜘蛛在“反复抓取同一頁”。常见原因有三類:一是頁面返回 5xx 或請求超时,蜘蛛按自己的节奏重试;二是源站响應太慢,连接被中断,蜘蛛没拿到完整内容;三是站点對蜘蛛做了限速或拦截,返回 429 或驗證頁,蜘蛛過一段時間再来。把這三類分開,後面的處理方向才不會跑偏。
哪些响應會触發重试
- 5xx 服務端错誤:最常见。資料库连接超时、應用進程打满、網關错誤都會返回 500/502/503,蜘蛛通常會在間隔一段時間後重试。
- 請求超时與连接重置:日誌里表現為没有狀態碼、字节數很小或為 0,或者连接被 reset。這類记錄容易被誤判為“已经抓取過”。
- 429 與限速頁:返回 429 时,重试間隔通常會被拉長;如果站点長期返回 429,整体抓取频次會下降。
- 驗證碼與 WAF 拦截頁:返回 200 但内容是拦截頁,蜘蛛可能把它当成正文,也可能在後續再试,行為因實現而异。
重试間隔在日誌里的形態
把同一個 URL 的訪問時間排成一列,看相邻時間差。狀態稳定的站点通常能看到比較規律的間隔,比如几分钟、几小时、一天。如果時間差忽長忽短,並且集中在几分钟内反复出現,通常說明源站在同一時間段不稳定,而不是蜘蛛“變凶了”。
另一個可看的维度是同一天的分布:失敗集中在某個小时,多半和该时段的备份任務、定时脚本、批量導入有關。把日誌時間窗和运维任務表對一下,往往能直接找到原因。
重试有没有上限
有,但没有公開的固定數字。能观察到的現象是:同一個 URL 连續失敗若干次後,訪問間隔會明顯拉長,甚至一段時間内不再出現。這期間即使你修好了服務端,蜘蛛也不會立刻回来。所以站点長時間不可用之後,需要靠 Sitemap 更新和内鏈入口把 URL 重新带回抓取队列,而不是等它自己恢复。
修好服務端只是第一步,让蜘蛛重新愿意来是第二步。
服務器侧要核對的几件事
- 並發上限:確認源站能承受多少並發连接,限速不要低到让蜘蛛频繁超时。
- 超时時間:網關、應用、資料库的超时层层叠加,最终耗时可能超過蜘蛛的等待時間。
- 错誤頁返回碼:出错的頁面應返回 5xx 或 503,而不是返回 200 的空壳頁,否則容易被当成正常内容收錄。
- 503 與 Retry-After:計划内维護可以返回 503 並给出重试時間,比直接拒绝更友好。
- 日誌字段完整性:狀態碼、响應時間、字节數、UA 都要记錄,否則無法判断是超时、截断還是空响應。
一個简單的核對顺序
先按 URL 分组統計訪問次數,筛出訪問次數明顯偏高的地址;再看這些地址的狀態碼分布,確認是 5xx、超时還是 429;接着把失敗時間窗和服務器监控、运维任務對齐;最後检查這些 URL 是不是集中在同一批模板或同一台机器上。多數情况下,問题會落在某几個接口、某張列表頁或某個資料源上,而不是全站。
處理完之後不要只盯着“訪問次數有没有下降”,還要看成功抓取的頁面數量有没有回升。次數下降但成功率没變,可能只是蜘蛛降低了整体频次,這對站点並不是好事。另外,站長平台里的抓取频次設定只是建议值,不保證一定生效,最终還是要以日誌為准。