蜘蛛池的入口页承担的是“被发现、被爬取、被传递”三件事,页面体积直接关系到蜘蛛愿意在一页上花多少时间。体积偏大时,下载和解析的耗时会上升,在同样的抓取预算下能走到的页面就变少;体积过小、正文单薄,又会让页面缺少可抽取的信息。下面从几个可以量化的角度聊聊入口页的体积控制。
页面体积到底影响什么
蜘蛛抓取一个页面大致要经历解析域名、建立连接、下载响应、解析 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 大小、节点数量和链接密度,不会直接带来收录或排名上的变化,但能让蜘蛛在有限的抓取次数里走得更远,这也是蜘蛛池长期运营中比较实在的一项基础工作。