讨论抓取的时候,大家更常看狀態碼、robots、Sitemap,很少看响應時間。但對蜘蛛来说,一個頁面“能不能打開”和“多久打開”是两件事,後者往往更直接影响它愿不愿意把時間花在你的站上。
蜘蛛對响應時間的敏感,来自它的工作方式
蜘蛛不是一個用戶,它同时管着很多站点、很多 URL。每個抓取請求要占用一個並發槽位,而槽位是有限的。当某個頁面响應很慢,這個槽位就被長時間占住,其他 URL 只能排队等。所以慢頁面的代價不只是那一個頁面,而是整段抓取時間被拉長。
另外,蜘蛛通常有自己的超时阈值。超過阈值還没拿到完整响應,這次抓取就可能被中断,日誌里留下一個不太好看的结果。它可能會稍後重试,但重试同样要花抓取预算。
慢在哪里,需要分清楚
用戶感知的“慢”和蜘蛛遇到的“慢”並不完全重合,拆開看會更清楚:
- 连接阶段:DNS 解析慢、TLS 握手慢,常见于解析服務不稳定或證书鏈配置复杂。
- 首字节時間(TTFB):服務器開始返回第一個字节之前的時間,多半是程序逻辑或資料库查询的問题。
- 传輸阶段:頁面体积過大、未压缩、把大文件当正文返回,都會拖長传輸時間。
- 渲染阶段:HTML 很快,但内容靠 JS 拼出来,蜘蛛需要進渲染队列,整体耗时再叠一层。
响應變慢之後,通常會看到什么現象
- 抓取速率整体下降,日誌里同一時間段的蜘蛛請求數明顯變少。
- “已發現未抓取”的 URL 數量增加,新頁面迟迟轮不到。
- 抓取覆盖停止增長,但站点並没有报错,也没有被 robots 挡住。
- 部分 URL 反复被抓,部分 URL 一直没動静,分布看起来很不均匀。
這些現象單獨看都不像服務器問题,容易被归到内容或内鏈上,结果改了半天頁面结构,問题還在。
几個容易被忽略的慢源
排查的时候,可以先從這几類地方看:
- 没有缓存的動態查询。尤其列表頁、标簽頁、搜尋结果頁,一次請求打一次資料库。
- 第三方脚本與統計代碼。頁面本身很快,但要等外部资源,整体响應被拖住。
- 图片和静態资源没做压缩,還缺了合理的缓存头,蜘蛛每次都要完整拉一遍。
- 日誌同步寫盘或頁面里調用了外部接口,高峰期把响應時間整体推高。
- 中間件里的限速、鉴權、防盗鏈逻辑,對蜘蛛也照样走了一遍。
怎么用日誌看清真實情况
服務器日誌里通常能看到响應時間、狀態碼和返回字节數。把這几個字段按 URL 分组統計,會看到一些平时不看的東西:哪些路径在平均响應上明顯偏慢,哪些 URL 返回 200 但字节數很小,哪些請求集中在同一秒里扎堆。
如果日誌里保留了 UA,還可以單獨看蜘蛛那一部分請求,观察它的請求間隔。間隔在變大、同一批 URL 的重訪時間在拉長,往往說明抓取节奏在放缓,而不是它忘了你的站。
能落地的調整顺序
不用一次改完,按影响面從大到小来排:
- 先给動態頁面做缓存,哪怕只是短時間的頁面缓存,也能把 TTFB 压下来。
- 静態资源交给 CDN,並設定合理的缓存過期時間。
- 压缩传輸内容,图片按需生成尺寸,不要原图直出。
- 减少頁面上不必要的重定向和阻塞型脚本。
- 把不需要被抓取的慢接口,用 robots 或權限控制挡在抓取路径之外。
不要把“蜘蛛抓得慢”当成需要限速的理由。响應慢導致的抓取减少,本质上是你自己把通道變窄了;這时候再加 Crawl-delay,只會让恢复更慢。
稳定比單次快更重要
偶尔一次 200 毫秒、偶尔一次 8 秒,比稳定在 800 毫秒伤害更大。蜘蛛會根據長期的响應表現来安排對你的抓取,波動大的站点很难维持稳定的抓取节奏。把响應時間的波動压下来,比追求某一次跑分好看更實际。
做完這一轮,再回头看抓取覆盖、URL 發現和内鏈结构,判断會更准确:到底是路径没铺好,還是路虽然铺好了,但走得實在太慢。