蜘蛛拿走一個頁面,要花三筆成本
把抓取想成一次有限的搬运。搜尋引擎每天给站点分配的請求量大致有數,每一次抓取都要付出代價。頁面越重,同样的抓取次數能覆盖的 URL 就越少,這是体积問题真正值得關注的地方。
- 传輸成本:服務器要吐出多少字节,压缩前和压缩後差多少。
- 解析成本:HTML 有多少节点、嵌套多少层,解析和後續處理要多久。
- 渲染成本:如果内容靠 JS 生成,還要排队执行脚本、發出子請求。
這三筆里,前两筆你能直接控制,第三筆通常最贵。
HTML 源碼:先確認正文有没有出現在里面
有些頁面源碼体积並不大,但正文是空的,全部内容等 JS 填充。蜘蛛第一次抓到的只是一個壳,要進入渲染队列再回来一趟,成本翻倍。這類頁面在列表頁、聚合頁上尤其常见。
另一類相反:源碼里塞了大量與正文無關的東西——内联的样式和脚本、base64 编碼的小图标、把整張參數表序列化成 JSON 放在頁面里。用戶看不到更多信息,但每個 URL 的下载量翻了几倍。
DOM 深度與节点數量
DOM 的深度和节点總數,影响的是解析與渲染阶段的耗时。常见現象是模板层层嵌套,一個列表項外面套了七八层 div,节点數轻松過萬。节点越多,渲染越慢,蜘蛛在這個頁面上停留的時間越長。
實操中,把無意义的包裹层去掉、用更扁平的标簽结构,效果往往比压缩几 KB 图片更明顯。
资源請求的连带代價
蜘蛛抓取 HTML 之外是否還會取图片、CSS、JS,各家引擎策略並不完全一样。能做的有几件:确保首屏關键内容不依赖某個必须下载成功才能顯示的脚本;图片放到 CDN 或獨立域名,减少主域名的並發压力;把不影响理解的装饰性资源往後放。
可以動手的几件事
- 查看頁面源碼,搜尋正文里的第一段话,看它在不在 HTML 里。不在,說明内容依赖 JS。
- 對比 HTML 原始大小與 gzip、Brotli 之後的大小,差距過小通常說明压缩没配好或内容太杂。
- 把内联的長脚本、長样式提到外部文件並設定缓存,减少每個頁面的重复传輸。
- 检查列表項、卡片這類重复结构的 DOM 层數,能减一层是一层。
- 用開發者工具看一次完整加载發出多少請求,數量偏多就该考虑合並或延後。
体积優化不是為了让蜘蛛“喜欢”你,而是让同样的抓取額度覆盖更多 URL,让服務器在抓取高峰时還有余力响應真實用戶。
別只盯首頁
首頁通常是最轻的那一頁。真正的問题在列表頁和詳情頁模板——它們數量最多、被抓最频繁。挑一個典型詳情頁量一下,比反复测首頁有意义得多。
如果站点是批量生成的,一個模板偏胖,就是成百上千個 URL 一起偏胖。先修模板,再看整体抓取量的變化。