搜尋抓取

5xx、429 與超时:服務器端波動如何打断蜘蛛的抓取路径

蜘蛛能不能抓到頁面,不只看連結结构,還看服務器有没有把响應正常给出来。本文從 5xx、429、超时和连接中断几個角度,說明服務器端波動如何打断抓取路径、延迟 URL 發現,並给出用抓取日誌和服務端指标交叉定位問题的方法。

搜尋抓取

5xx、429 與超时:服務器端波動如何打断蜘蛛的抓取路径

聊抓取的时候,大部分讨论都围绕連結:内鏈够不够、Sitemap 全不全、路径深不深。但蜘蛛真正把頁面抓回去的前提,是服務器能把响應给出来。連結决定蜘蛛想去哪,服務器狀態决定它能不能到。很多站点 URL 發現慢、抓取量上不去,問题不在連結结构,而在响應质量。

一次抓取要過哪几道服務器關卡

從蜘蛛發出請求到拿到 HTML,中間要经過 DNS 解析、TCP 连接、TLS 握手、服務器處理、首字节返回(TTFB)和内容传輸。任何一环慢了或者断了,這次抓取就算失敗,或者被判為低质量。

  • DNS 與连接:解析慢、连接被拒,蜘蛛连门都進不去。
  • TTFB:服務器處理時間過長,蜘蛛的等待成本變高。
  • 传輸:HTML 体积過大、中途中断,頁面拿不全。
  • 並發:服務器拒绝過多连接,蜘蛛只能降低請求频率。

不同响應對抓取路径的實际影响

5xx:最需要警惕的一類

500、502、503、504 表示服務器端没能正常完成請求。蜘蛛遇到 5xx 通常會重试,但如果某個目錄下大量 URL 连續返回 5xx,蜘蛛會降低對整站的抓取频率,已经排在队列里的 URL 也可能被推後。更麻烦的是 URL 發現:新地址即使被内鏈指向或在 Sitemap 里提交,只要反复返回 5xx,它就會一直停留在待抓取狀態。

429 與 503 加 Retry-After:別把它当成通用限流開關

有些站長為了控制抓取压力,對蜘蛛统一返回 429。短期看請求量确實下来了,但長期如此,蜘蛛會認為站点持續不可用,抓取节奏被压得很低。限流更合适的做法是控制單 IP 並發、给動態内容做缓存、把慢查询優化掉,而不是對所有請求一刀切。

超时與连接重置

服務器處理時間長于蜘蛛的等待上限,請求會被判超时。表現上和 5xx 類似:這次抓取没有结果,蜘蛛也不知道這個 URL 到底存不存在,于是不敢把它标记為已發現,容易反复回来试探。连接被中途重置則更糟,蜘蛛可能拿到残缺 HTML,如果初始 HTML 里缺了連結,那部分 URL 就發現不了。

200 但内容不完整

還有一種隐性情况:狀態碼正常,但内容是空壳,關键連結靠 JS 渲染,或者服務器按 UA、按地域返回了不同版本。對蜘蛛来说這次抓取是成功的,但抓到的連結集和你预期不一致,URL 發現自然會出現遗漏。

抓取路径被打断後的连鎖反應

單次失敗看起来不起眼,但影响會沿着路径扩散:

  • 入口頁响應慢,蜘蛛在入口就消耗掉大部分耐心,深层頁排不上队。
  • 中間层頁面返回 5xx,蜘蛛走不到它下面的連結,更深层 URL 的發現被推迟甚至中断。
  • 服務器整体不稳定时,蜘蛛整体降速,Sitemap 里提交的 URL 也不會被優先處理。
  • 反复失敗會让一些 URL 長期停留在已發現未抓取狀態,站内看起来提交了,實际没被處理。

怎么定位:抓取日誌和服務端指标對着看

單獨看抓取日誌很难判断是連結問题還是服務器問题,需要和服務端指标交叉比對。

  • 日誌里的响應碼分布:如果 5xx 占比高,先修服務端,再谈内鏈。
  • 响應時間分位:平均 TTFB 看着還行,但 P95、P99 很高,說明偶發慢請求正在拖累抓取。
  • 蜘蛛 UA 的請求是否被限流、被 WAF 拦截、被 CDN 回源失敗。
  • 同一 URL 在日誌中反复出現且都是失敗狀態,說明蜘蛛在重试,但一直没成功。
  • 观察抓取高峰时段的 CPU、資料库连接數和慢查询數量。

可以落地的調整

  1. 優先保證入口頁、栏目頁的响應時間稳定,這些頁面决定蜘蛛能不能繼續往下走。
  2. 给耗时接口做缓存,减少動態渲染带来的 TTFB 波動。
  3. 對静態资源做長缓存和 CDN 分發,减少回源压力。
  4. 如果必须限流,用低频率的均匀限速,避免整段集中返回 429。
  5. 頁面体积控制在合理范围,避免蜘蛛下载到一半中断。
  6. 保持服務器時間准确,日誌時間對不上會让人誤判抓取节奏。
抓取路径由連結和服務器一起构成。連結再漂亮,服務器响應不给力,蜘蛛也走不到终点。排查抓取問题时,先確認服務端稳定,再看連結结构,顺序反了會浪費很多時間。

對 URL 發現来说,最實际的结论是:新地址被提交之後能不能被真正抓取,取决于服務器在那個时刻有没有把頁面正常交出去。稳定性不是優化項,它是抓取的前提。