搜索抓取

抓取不只看次数:HTML 体积与传输方式也在消耗蜘蛛的带宽

抓取容量通常按主机维度分配,衡量指标既有请求数,也有传输字节和并发连接。同样一段时间里,一个很重的 HTML 会让蜘蛛走过的 URL 变少。本文从体积、压缩、渲染资源和列表页结构几个角度,说明重量是如何悄悄吃掉抓取效率的,并给出可以自查的项目。

搜索抓取

抓取不只看次数:HTML 体积与传输方式也在消耗蜘蛛的带宽

聊抓取预算时,很多人的注意力都在“一天抓了多少次”上。但对搜索引擎来说,抓取容量通常按主机维度分配,衡量指标里既有请求数,也有传输字节和并发连接数。换句话说,一个 300KB 的 HTML 和一个 30KB 的 HTML,占用的抓取资源并不一样。在同样的时间窗口里,从重页面上能走过的 URL 更少。

抓取容量里,字节数也算一份

搜索引擎爬虫一般会为每个站点设定并发连接和带宽上限,避免抓取影响到服务器对外服务。这个上限是共享的:如果每个页面返回的响应体都很大,单位时间内能完成的请求数就会下降;如果响应体很小,蜘蛛可以用同样的容量走更多地址。

所以有时候出现的情况是:服务器响应很快,状态码也正常,但抓取量就是上不去。原因不在速度,而在每个页面“拖”走的字节太多。

HTML 里哪些重量是白费的

  • 整站导航和页脚在每个页面里重复内联,且带有大量样式属性,本身不提供新的链接价值,却反复出现。
  • 把首屏不需要的数据以 JSON 形式塞进页面,尤其是列表页把全量数据一次性渲染。
  • 把图片以 base64 直接写进 HTML,看起来少了一次请求,实际把整个文件变成了 HTML 的一部分。
  • 大段注释、未清理的空行和缩进、模板遗留的调试信息。
  • 一个列表页直接输出上千条链接,其中大部分是蜘蛛当前不需要走的分页和筛选入口。

这些内容对用户可能有用,但对蜘蛛来说,每多一个字节,都是抓取队列里的一次消耗。

压缩与传输:同一份 HTML,体积能差几倍

开启 gzip 或 brotli 之后,文本型 HTML 的体积通常能压缩到原来的两到三成。未开启压缩时,HTML 会以接近原始大小传输,抓取效率直接受影响。

还要注意压缩是否对各类爬虫一致。有些站点在 CDN 或反向代理层做了基于 User-Agent 的分流,导致蜘蛛拿到的响应没有压缩,而普通浏览器访问时是压缩过的。排查时可以对比两者返回的 Content-Encoding 响应头。

渲染抓取会额外拉取资源

当蜘蛛需要执行页面脚本来获取内容时,它会顺带请求 CSS、JS、字体和部分图片。这些资源不一定都计入抓取预算,但会占用渲染队列的时间和带宽。如果每个页面都要加载几百 KB 的脚本,渲染一次的成本会明显高于纯 HTML 页面。

对内容页来说,把正文直接输出在 HTML 里,比依赖脚本注入更省资源,也更稳定。

怎么查自己的页面是不是“重”

  1. 抽样几个模板页,比较未压缩 HTML 大小与压缩后的大小,看比值是否合理。
  2. 查看服务器日志中蜘蛛请求的响应字节数,如果日志有记录的话,按模板类型排序。
  3. 分别统计详情页、列表页、标签页的平均体积,找出最重的那一类。
  4. 检查是否每个页面都内联了同一份大块数据或同一套样式。
  5. 用关闭 JS 的方式看首屏,确认关键链接和正文是否已经在 HTML 中。

优化时的取舍

减小体积不等于删掉功能。目标是把蜘蛛真正需要的东西留下,把与抓取无关的重量挪走:能外部化的脚本和样式就外部化,能按需加载的数据就不要首屏全量输出,能压缩的响应就统一开启压缩。

抓取效率是算总账的。页面轻一点,蜘蛛在同样的时间里就能多走几步;这几步累加起来,往往比一次集中提交更管用。