在讨论抓取频次、索引延迟這類問题时,服務器响應時間经常被跳過。但蜘蛛的每一次抓取,都要先等服務器把首字节吐出来。這一段等待看不见、摸不着,却實實在在地消耗着抓取资源。做站点运营的人未必需要懂後端,但至少要能判断:慢,是慢在哪里。
先分清是網絡慢還是服務器慢
TTFB(首字节時間)里其實混了好几段:DNS 解析、TCP 连接、TLS 握手、服務端處理、首字节返回。只看一個總數容易誤判。可以用 curl 的 -w 參數把各阶段拆開,或者在浏览器開發者工具的 Network 面板里看 Timing 分解。
更實用的一步是区分缓存命中和未命中。首頁命中缓存时 30ms,未命中时 1.2s,這種差距說明問题在生成环节,而不是带宽。内容頁也是同理,第一次請求和第二次請求的差异,往往比平均值更有信息量。
响應時間怎么影响抓取
抓取预算可以粗略理解為時間與並發资源的组合。同一個域名下,蜘蛛能保持的连接數有限。如果每個請求要等两秒才拿到响應,單位時間内能完成的抓取數量就少;反之,响應快,同样的時間窗口里就能多走几個 URL。
把响應時間当作抓取路上的重力:它不一定會让你掉下去,但會让每一步都更重一些。
需要說明的是,慢並不會直接導致頁面不被收錄,它更多是拉長從發現 URL 到實际抓取之間的間隔。對新站或者更新频繁的站点,這個間隔會被放大。
几個值得盯住的观测点
- 首頁、栏目頁、内容頁各取一批 URL,分別看 TTFB 的中位數和 P95,不要只看平均值。
- 在服務端日誌里按蜘蛛 UA 過滤,看這些請求的响應時間分布,而不是看全站平均。
- 統計超时與 5xx 的比例,尤其注意是否有集中出現的时段。
- 確認抓取高峰是否恰好撞上站点的定时任務、备份或資料同步。
這几項做完,基本能判断是常態偏慢,還是某個時間段被拖垮。
常见的拖慢原因
- 查询没有走索引:列表頁、搜尋頁、相關推荐很容易触發全表掃描,頁面越复杂越明顯。
- 同步調用外部接口:模板里直接請求第三方接口取推荐、评论、天气,對方慢一秒,你的頁面就慢一秒。
- 每頁都做重活:全站統計、寫日誌到同一個文件、每次都重建缓存,這些操作放在請求鏈路里代價很高。
- 缓存键设計不当:把會话 ID、来源參數、時間戳带進缓存键,命中率會被压得很低,等于没有缓存。
調整顺序建议
- 先测量再動手。没有基线資料的優化,改完也不知道有没有效果。
- 優先补缓存,從首頁、栏目頁、热门内容頁開始,逐层向下。
- 把外部調用改成异步或加超时降級,接口挂了也不该拖住整頁。
- 给服務端處理设一個上限,超過就返回简化结果,而不是让請求一直挂着。
- 把响應時間纳入日常监控,出現異常时能定位到具体頁面類型。
別為蜘蛛單獨開一條通道
有人會给蜘蛛 UA 返回一個简化版頁面,或者跳過某些耗时逻辑。這種做法要谨慎:一方面容易造成蜘蛛看到的内容與用戶看到的不一致,另一方面也很容易被判定為作弊。更稳妥的思路是整体提速,让正常鏈路本身就足够快。
响應時間属于站点运营的基础項,不需要追求极致,但要保證绝大多數請求落在一個稳定、可预期的区間里。稳定比偶尔飞快更重要,因為蜘蛛看到的是長期的、平均的表現。