蜘蛛池的入口頁承担的是“被發現、被爬取、被传递”三件事,頁面体积直接關系到蜘蛛愿意在一頁上花多少時間。体积偏大时,下载和解析的耗时會上升,在同样的抓取预算下能走到的頁面就變少;体积過小、正文單薄,又會让頁面缺少可抽取的信息。下面從几個可以量化的角度聊聊入口頁的体积控制。
頁面体积到底影响什么
蜘蛛抓取一個頁面大致要经歷解析域名、建立连接、下载响應、解析 HTML、抽取連結几個阶段。其中下载阶段受体积與压缩方式影响,解析阶段受 DOM 节点數量影响。体积大並不會让蜘蛛直接“拒绝”你的頁面,但會让單頁的抓取成本變高,在抓取總量有限的情况下,單位時間里能覆盖的 URL 數量就會下降。
HTML 体积的三個常见来源
内联样式與内联脚本
把整站 CSS、JS 直接内联到每個入口頁,是最容易把 HTML 撑大的做法。同一條样式規則在几千個入口頁里重复出現,压缩工具能省掉一部分,但省不掉解析成本。
重复的導航與列表块
入口頁往往挂着導航、侧栏、推荐位、相關阅讀等多個模块。這些模块本身有價值,但如果每個模块都輸出几十條連結,HTML 体积和連結數量會一起上涨。
服務端直接輸出的大段資料
把頁面上用不到的 JSON 資料、配置項、埋点參數一並寫進 HTML,是另一種常见膨胀。這類内容對蜘蛛没有意义,只是白占体积。
參考区間:多少算偏大
- 压缩前的 HTML 建议控制在 100KB 以内,超過 200KB 就该考虑做减法;
- 经 gzip 或 brotli 压缩後的传輸体积,尽量控制在 30KB 以内;
- DOM 节点總數建议在 1500 個以内,超過 3000 时解析開销會明顯上升;
- 單個入口頁的 a 标簽數量,建议控制在 100 到 150 個以内。
這些數字是经驗參考,不是硬门槛。不同蜘蛛的解析實現、超时設定並不一样,真正重要的是和自己站内的其他頁面横向對比,找出明顯偏大的那一批。
DOM 节点與連結密度
节点數量越多,构建 DOM 树的内存和時間開销越大。連結數量則關系到頁面的“注意力分配”:一個入口頁上的可点連結越多,每條連結在頁面结构里分到的位置就越靠後、越不顯眼。
與其在一個入口頁上堆一百個連結,不如把真正需要被發現的二三十個連結放在更靠近正文的位置,其余的收進分頁或二級列表。
連結密度也可以粗略估算:用 a 标簽數量除以正文文本長度。如果正文只有几百字却有上百個連結,頁面更接近連結列表而不是内容頁,蜘蛛抽取时容易把注意力放在導航上。
压缩與传輸
開啟 gzip 或 brotli 能顯著降低传輸体积,但不改變解析体积。也就是说,压缩解决的是下载阶段的問题,DOM 节点和連結數量的問题仍然要靠结构調整。可以先用 curl -H "Accept-Encoding: gzip" -sI 查看响應头和传輸体积,再與服務端原始文件大小對比,確認压缩是否真正生效。
一份自查清單
- 抽查若干入口頁,记錄压缩前後的 HTML 字节數,找出明顯偏大的样本;
- 检查是否存在整站样式、脚本内联到每一頁的情况;
- 統計 a 标簽數量,確認導航和推荐位没有無节制展開;
- 用開發者工具或脚本統計 DOM 节点總數,定位节点最多的模块;
- 检查是否有前端渲染後才填充内容的空容器,這類结构對原始 HTML 抓取没有帮助;
- 確認压缩中間件在所有入口頁路径上都生效,没有被静態托管或 CDN 绕過。
小结
入口頁体积的優化思路,是让每個頁面在“能被顺利下载解析”和“有足够内容可抽取”之間取得平衡。控制 HTML 大小、节点數量和連結密度,不會直接带来收錄或排名上的變化,但能让蜘蛛在有限的抓取次數里走得更遠,這也是蜘蛛池長期运营中比較實在的一項基础工作。