抓取预算的另一半:時間
谈到抓取预算,多數人先想到頁面數量和内鏈结构,但蜘蛛在一個站点上能抓多少,還取决于每一次請求要花多少時間。同一段時間窗内,响應快的站点能完成更多次抓取;响應慢的站点,並發槽位被長時間占住,單位時間的抓取量就往下掉。
換句话说,服務器响應時間不是运维指标,它同时也是一個抓取侧的變量。它不會直接决定某個頁面是否被收錄,但會影响蜘蛛愿不愿意把有限的額度分给這個站。
一次抓取的時間花在哪
從蜘蛛的视角看,取回一個 URL 大致经過這些阶段:DNS 解析、TCP 與 TLS 握手、發送請求、等待服務器返回首字节(TTFB)、接收 HTML,然後再按需取 CSS、JS、图片等子资源。
- 连接阶段:通常毫秒級,且有复用與缓存,波動不大。
- TTFB:服務端排队、查库、渲染、等待外部接口,慢点基本都藏在這里。
- 传輸阶段:取决于 HTML 体积和压缩、CDN 回源情况。
- 子资源阶段:CSS/JS 越多越重,渲染型蜘蛛的成本越高。
真正容易失守的是 TTFB 和後两項。连接层只要證书、DNS、机房没出問题,一般是稳定值;TTFB 却會随着流量、缓存命中率、資料库狀態上下浮動。
服務器慢下来之後,會连鎖發生什么
- 單位時間抓取量下降:同样几分钟,快站能跑完几十個 URL,慢站可能只跑完几個,剩下的排队或被放弃。
- 抓取集中在少數入口:蜘蛛倾向先确保首頁、栏目頁這類高價值 URL,深處頁面更晚才被排到。
- 回訪間隔被拉長:当同一批 URL 反复耗时偏長,蜘蛛會降低對這部分的訪問频率。
- URL 發現變慢:新連結即使已经出現在頁面上,也要等上一轮抓取完成才有机會被排入队列。
- 超时被记為失敗:長期没有正常返回的地址,會慢慢從抓取队列里淡出。
這些變化往往不是一夜之間出現的,而是两三周里抓取量缓慢下滑,日誌上看起来只是“蜘蛛来得少了”。
几個容易被忽略的慢点
動態頁面没有缓存
列表頁、搜尋结果頁、标簽聚合頁常常每次請求都打一次資料库或聚合接口。蜘蛛訪問的 URL 组合比真實用戶多,這類頁面很容易成為 TTFB 的重灾区。
頁面里嵌了同步外部請求
服務端在渲染时同步調用第三方接口(匯率、库存、推荐),對方一抖動,整頁就跟着慢。蜘蛛不會区分這是你的問题還是對方的問题。
缓存穿透與冷啟動
蜘蛛訪問的很多时候是冷门 URL,缓存里没有,正好落在最慢的那條路径上。真實用戶常訪問的热頁面反而一直很快,容易被誤判為“站点没問题”。
抓取高峰踩上业務高峰
如果站点流量本身有明顯波峰,蜘蛛的抓取高峰與之重叠时,整体 TTFB 會一起被推高。
怎么定位:按模板分组,看分阶段耗时
- 先把 URL 按模板归類:首頁、栏目頁、詳情頁、列表分頁、标簽頁,分別抽样。
- 看每组的 TTFB 中位數和尾部分布,而不是只看平均值。尾部耗时才是拖慢抓取的那部分。
- 對照蜘蛛日誌中的抓取時間戳,观察同一地址两次抓取之間的間隔是否在變長。
- 把已知的慢查询、外部接口調用、未命中的缓存点列出来,逐一驗證。
- 優化後用同一组 URL 复查,確認改善發生在蜘蛛實际訪問的頁面上,而不只是首頁。
稳定比极限快更重要
一個 TTFB 稳定在 300ms 的站点,通常比平时 80ms、高峰期 3s 的站点更好抓。蜘蛛依赖的是可预测的节奏,剧烈的耗时波動會让它更谨慎地調整抓取速率。
抓取预算並不會因為一次優化而永久變大,它是站点長期响應表現的副产品。把常见模板的响應做進一個可预测的区間,比偶尔跑出一次极速更有意义。
如果暂时無法整体提速,至少先保證两点:静態资源和 HTML 可缓存,错誤路径(登入、搜尋、過滤參數)不要拖住正常頁面的响應。這两件事做完,蜘蛛在站内的抓取路径通常會更完整一些。