讨论抓取时,很多人把注意力放在連結、Sitemap 和更新频率上,却忽略了一個更基础的問题:蜘蛛抓取一個 URL 本身要付出多少成本。抓取资源不是無限的,單頁越重,在同样的抓取容量下能覆盖的 URL 就越少。這不是玄学,而是排队與配額分配的自然结果。
一次抓取包含哪些成本
從蜘蛛的视角看,抓取一個 URL 大致要经歷几個环节:
- 连接與响應等待:DNS、建连、服務器處理時間;
- 下载 HTML:字节數越多,占用的带宽和時間越長;
- 解析並构建 DOM:节点越多,解析和後續處理越慢;
- 资源與渲染:若進入渲染队列,還要拉取 CSS、JS 等资源;
- 排队與去重:抓取结果要進入後續流程,重頁面占用的环节更多。
其中任何一环變贵,單位時間内能抓完的 URL 數量就會下降。
HTML 体积通常從哪来
1. 未压缩或压缩不彻底的响應
開啟 gzip 或 brotli 能明顯减少传輸字节,這一步几乎是必做項。但压缩只降低传輸成本,解压之後的解析成本依然存在,所以不能把压缩当成瘦身的全部。
2. DOM 节点過多
几千個节点和几萬個节点,代價完全不是一個量級。常见膨胀来源包括:所有栏目共用一套厚重模板、列表頁一次輸出上千條记錄、把不相關模块统统塞進同一個頁面。
3. 隐藏但仍然存在的内容
折叠面板、預設隐藏的選項卡、彈窗、首屏用不到的样式和脚本,如果寫死在 HTML 里,蜘蛛一样要下载和解析。對用戶不可见,對抓取並不免費。
4. 内联脚本與样式
少量内联可以减少請求,但几十 KB 甚至上百 KB 的内联内容會让 HTML 明顯變重,而且每次抓取都要重复下载,無法依赖外部文件的缓存。
重頁面带来的具体影响
- 抓取覆盖面下降:同样的抓取容量,被重頁面消耗掉的部分更多,長尾 URL 被安排抓取的机會變小。
- 抓取深度受限:蜘蛛沿連結前進时會逐层消耗资源,路径上的頁面越重,能走到的层級越浅。
- 對响應波動更敏感:体积大又遇上服務器慢,容易触發降速,進而影响整站的抓取节奏。
减负时要做對什么
- 先看字节數,再看节点數:服務器日誌或抓取日誌中的响應大小能直接暴露問题,優先處理排在前面的模板。
- 分頁優于超長列表:一頁輸出几十條比一頁輸出几千條更利于抓取路径展開,連結分布也更均匀。
- 懒加载不等于隐藏内容:需要被發現的内容要有可直接訪問的連結地址,不能只靠滚動时才發起的請求。
- 別為了瘦身牺牲可抓取性:把導航改成纯 JS 渲染、把正文改成异步加载,可能省了字节,却让蜘蛛拿不到内容,得不偿失。
判断标准很简單:這段内容對用戶和蜘蛛是否都必要?如果只是模板顺手带上的,删掉通常两头都受益。
怎么自查頁面是不是偏重
- 抽取几個主要模板,记錄 HTML 的传輸大小和解压後大小;
- 對比同一站点内轻量頁面與重量級頁面的抓取频次差异;
- 检查移動端模板是否額外加载了大量桌面端用不到的内容;
- 观察服務器响應時間是否稳定,避免体积與慢响應叠加出現。
小结
頁面体积不會直接决定收錄结果,但它會實打實地影响抓取效率。把模板做轻、把列表分頁、把隐藏内容清理干净,相当于给整站腾出更多抓取空間。這類改動不需要大動作,却往往能在抓取日誌里看到比較明顯的變化。