搜尋抓取

HTML 体积與抓取吞吐:頁面越重,蜘蛛能跑的頁數越少

抓取配額有限时,單個頁面的字节數會直接影响蜘蛛單位時間内能抓多少頁。本文梳理内联样式脚本、base64 图片、頁面内灌 JSON 等常见增重寫法,给出压缩、外鏈化、精简 DOM 的可执行清單,並說明如何用日誌和 HTML 体积分布判断哪些模板在拖慢抓取。

搜尋抓取

HTML 体积與抓取吞吐:頁面越重,蜘蛛能跑的頁數越少

很多站点只關注“蜘蛛来没来”,却很少關注“蜘蛛来了之後,單位時間内能带走多少頁”。這两件事其實相關:如果單個頁面的 HTML 很重,同样的抓取窗口里,蜘蛛能走完的 URL 數量就會變少。

抓取吞吐,是被什么卡住的

蜘蛛同时能抓多少頁,受两邊约束:一邊是站点自身的容量與响應速度,一邊是它给站点分配的抓取配額。在配額相對固定的前提下,每個頁面消耗的成本包括:连接與等待時間、响應字节數、解析所需的計算量。字节數是最容易被忽略的一項。

一個普通内容頁,HTML 压缩後几十 KB 是常態。但如果内联了大量样式、脚本、base64 图片或整段 JSON 資料,單頁很容易膨胀到几百 KB 甚至上 MB。抓取带宽和解析能力都是有限的,這類頁面會把资源從“能多抓几頁”挤成“只能抓這一頁”。

哪些寫法會让 HTML 悄悄變重

  • 内联大段 CSS 或 JS:為了减少請求,把整包样式或组件库塞進 HTML,頁面越多,重复成本越高。
  • base64 图片與字体:把图片编碼進 HTML 或 CSS,体积通常比原文件大三成以上,而且無法單獨缓存。
  • 頁面里直接灌資料:把接口返回的完整 JSON 寫進 script 标簽,列表頁、商品頁尤其常见。
  • DOM 节点過多:层层嵌套的容器、大量隐藏节点,會明顯拉長解析時間。
  • 注释與冗余属性:老模板残留的注释、重复的 data 属性,累积起来也不小。

瘦身不是删内容,而是換位置

先分清两類東西:蜘蛛必须拿到的(正文、連結、结构化資料)和可以延後的(样式细节、非首屏组件、統計脚本)。優化方向是让前者尽早出現、尽量轻,让後者挪出 HTML 本身。

目标不是把頁面做得“看起来简單”,而是让關键内容在更少的字节里被完整讀到。

可以立刻做的几件事

  1. 開啟 gzip 或 brotli 压缩,HTML、CSS、JS、JSON 都能受益;注意不要對已经压缩過的图片重复压缩。
  2. 把内联样式與脚本外鏈化,HTML 里只保留首屏必需的關键 CSS。
  3. 图片用真實文件引用,不上 base64;列表頁缩略图控制尺寸。
  4. 接口資料不要整包塞進頁面,改為按需請求,或只輸出渲染必需的字段。
  5. 清理模板里長期不用的注释、埋点和隐藏节点。

抓取窗口里,還有几個相關變量

  • 响應時間:TTFB 越長,每次抓取的等待越多,吞吐自然下降。
  • 狀態碼與错誤率:大量 5xx 或超时會让蜘蛛降低抓取频率,等于變相减产。
  • 重复 URL:同一内容存在多個地址,等于把配額花在重复頁面上。
  • 連結位置:把導航、面包屑、正文連結放在 HTML 前部,解析早期就能拿到下一跳。

怎么判断自己是不是“重頁面”

不一定需要复杂工具:抓几類代表性頁面的原始 HTML(未渲染、压缩後),看体积分布;再對照服務器日誌里蜘蛛的抓取次數與响應時間,看是否某一類模板明顯拖慢。如果某類模板的字节數遠高于其他頁面,同时被抓频率偏低,通常值得優先處理。

最後提醒一句:頁面体积只是抓取效率的一個變量,不是排名因素。把它当作“让蜘蛛多跑几頁”的工程手段,比当作優化技巧更靠谱。