搜尋抓取

服務器响應慢下来的时候,蜘蛛的抓取节奏會怎么變

讨论抓取时,大家更常看狀態碼、robots 和 Sitemap,很少看响應時間。本文拆解蜘蛛為何在意頁面响應速度:並發槽位被占用、超时中断、抓取速率下降,以及由此带来的抓取覆盖停滞。同时给出容易忽略的慢源、日誌自查方法和可落地的調整顺序。

搜尋抓取

服務器响應慢下来的时候,蜘蛛的抓取节奏會怎么變

讨论抓取的时候,大家更常看狀態碼、robots、Sitemap,很少看响應時間。但對蜘蛛来说,一個頁面“能不能打開”和“多久打開”是两件事,後者往往更直接影响它愿不愿意把時間花在你的站上。

蜘蛛對响應時間的敏感,来自它的工作方式

蜘蛛不是一個用戶,它同时管着很多站点、很多 URL。每個抓取請求要占用一個並發槽位,而槽位是有限的。当某個頁面响應很慢,這個槽位就被長時間占住,其他 URL 只能排队等。所以慢頁面的代價不只是那一個頁面,而是整段抓取時間被拉長。

另外,蜘蛛通常有自己的超时阈值。超過阈值還没拿到完整响應,這次抓取就可能被中断,日誌里留下一個不太好看的结果。它可能會稍後重试,但重试同样要花抓取预算。

慢在哪里,需要分清楚

用戶感知的“慢”和蜘蛛遇到的“慢”並不完全重合,拆開看會更清楚:

  • 连接阶段:DNS 解析慢、TLS 握手慢,常见于解析服務不稳定或證书鏈配置复杂。
  • 首字节時間(TTFB):服務器開始返回第一個字节之前的時間,多半是程序逻辑或資料库查询的問题。
  • 传輸阶段:頁面体积過大、未压缩、把大文件当正文返回,都會拖長传輸時間。
  • 渲染阶段:HTML 很快,但内容靠 JS 拼出来,蜘蛛需要進渲染队列,整体耗时再叠一层。

响應變慢之後,通常會看到什么現象

  • 抓取速率整体下降,日誌里同一時間段的蜘蛛請求數明顯變少。
  • “已發現未抓取”的 URL 數量增加,新頁面迟迟轮不到。
  • 抓取覆盖停止增長,但站点並没有报错,也没有被 robots 挡住。
  • 部分 URL 反复被抓,部分 URL 一直没動静,分布看起来很不均匀。

這些現象單獨看都不像服務器問题,容易被归到内容或内鏈上,结果改了半天頁面结构,問题還在。

几個容易被忽略的慢源

排查的时候,可以先從這几類地方看:

  1. 没有缓存的動態查询。尤其列表頁、标簽頁、搜尋结果頁,一次請求打一次資料库。
  2. 第三方脚本與統計代碼。頁面本身很快,但要等外部资源,整体响應被拖住。
  3. 图片和静態资源没做压缩,還缺了合理的缓存头,蜘蛛每次都要完整拉一遍。
  4. 日誌同步寫盘或頁面里調用了外部接口,高峰期把响應時間整体推高。
  5. 中間件里的限速、鉴權、防盗鏈逻辑,對蜘蛛也照样走了一遍。

怎么用日誌看清真實情况

服務器日誌里通常能看到响應時間、狀態碼和返回字节數。把這几個字段按 URL 分组統計,會看到一些平时不看的東西:哪些路径在平均响應上明顯偏慢,哪些 URL 返回 200 但字节數很小,哪些請求集中在同一秒里扎堆。

如果日誌里保留了 UA,還可以單獨看蜘蛛那一部分請求,观察它的請求間隔。間隔在變大、同一批 URL 的重訪時間在拉長,往往說明抓取节奏在放缓,而不是它忘了你的站。

能落地的調整顺序

不用一次改完,按影响面從大到小来排:

  • 先给動態頁面做缓存,哪怕只是短時間的頁面缓存,也能把 TTFB 压下来。
  • 静態资源交给 CDN,並設定合理的缓存過期時間。
  • 压缩传輸内容,图片按需生成尺寸,不要原图直出。
  • 减少頁面上不必要的重定向和阻塞型脚本。
  • 把不需要被抓取的慢接口,用 robots 或權限控制挡在抓取路径之外。
不要把“蜘蛛抓得慢”当成需要限速的理由。响應慢導致的抓取减少,本质上是你自己把通道變窄了;這时候再加 Crawl-delay,只會让恢复更慢。

稳定比單次快更重要

偶尔一次 200 毫秒、偶尔一次 8 秒,比稳定在 800 毫秒伤害更大。蜘蛛會根據長期的响應表現来安排對你的抓取,波動大的站点很难维持稳定的抓取节奏。把响應時間的波動压下来,比追求某一次跑分好看更實际。

做完這一轮,再回头看抓取覆盖、URL 發現和内鏈结构,判断會更准确:到底是路径没铺好,還是路虽然铺好了,但走得實在太慢。