搜索抓取

页面越大抓得越少:字节数如何挤占蜘蛛的抓取节奏

抓取预算常被当成“条数”来算,其实传输字节同样占用资源。页面被内联图片、冗余数据、未压缩内容撑大后,蜘蛛在同样时间里能读完的 URL 会变少。本文从体积维度看抓取节奏,给出日志排查字段、服务器侧配置与模板调整的先后顺序。

搜索抓取

页面越大抓得越少:字节数如何挤占蜘蛛的抓取节奏

谈抓取预算时,多数人只看“条数”:蜘蛛今天来了几趟、抓走多少个 URL。但在一趟抓取里被消耗掉的资源,除了请求次数,还有传输的字节数和连接占用的时间。一个 3MB 的 HTML 页面和一个 30KB 的页面,在蜘蛛那边占用的抓取资源完全不是一个量级。

抓取成本其实有两个维度

把抓取想象成一条有带宽上限的管道会更容易理解:

  • 请求次数:一段时间内蜘蛛愿意发出的请求数量,通常和站点整体质量、响应速度有关。
  • 传输字节:每个响应体的大小。字节数越大,同样时间内能读完的 URL 越少。
  • 连接时长:从建立连接到读完响应的时间,包含服务器处理与传输耗时,慢响应会占住并发位。

三者相互挤占。页面越大、响应越慢,单位时间里能走完的抓取路径就越短,一些本可以被发现的 URL 会被排到更后面。

页面体积是被什么撑大的

  • 把图片、字体以内联 base64 的方式塞进 HTML。
  • 首屏不需要的脚本、样式全部内联,模板重复代码多。
  • 把整份接口数据以 JSON 形式嵌在页面里,其中大部分字段前端并不使用。
  • 没有开启 gzip 或 brotli 压缩,文本资源按原样传输。
  • 列表页一次性输出几百条条目,评论、问答默认展开全部内容。

这些做法单看每一项都不致命,叠加起来就很容易把一个本该几十 KB 的页面推到几 MB。

体积变大之后,抓取路径上的变化

  1. 同一个抓取窗口内完成的 URL 数量下降,深层页面被发现的周期变长。
  2. 传输时间拉长,超时和中断概率上升;一旦连接中断,页面后半部分的链接就来不及被读到。
  3. 列表页、分页页因为单页太重,翻页序列更容易停在前面几页。
  4. 站点出口带宽被单次抓取占用更多,正常用户的访问也可能受影响。

链接放的位置,决定它会不会被读到

HTML 是从上往下解析的。重要栏目、新增内容的入口链接放在靠前的位置,即便一次抓取中途被打断,这部分线索也已经被记录。反过来,把核心导航压在一层层模板和一堆内联脚本之后,读到的概率就低一些。这和站点整体内链结构是同一件事:把有限的抓取资源,优先引向真正需要被发现的页面。

服务器侧可以配合的几件事

  • 开启 gzip 或 brotli 压缩,文本类资源通常能压到原来的两到三成。
  • 确认首字节时间稳定,静态资源走缓存或 CDN,避免动态生成拖慢响应。
  • 首屏之外的内容改为按需加载,但保留真实的链接与地址,不要用占位符替换。
  • 列表页做分页或分批加载,每页条目控制在合理范围。

一个可执行的调整顺序

  1. 先从服务器日志里按响应字节数和响应时间排序,找出最重的那些 URL。
  2. 检查这些页面的压缩是否生效,这一步成本最低、见效最直接。
  3. 再动模板:内联数据、重复结构、无用脚本,能拆就拆。
  4. 最后调整链接布局与分页策略,把重要入口前移。
页面体积不是越小越好,而是要让每一 KB 都花在蜘蛛需要读到的东西上:可抓取的链接、正文内容、必要的结构化信息。首屏塞满装饰性资源,代价就是抓取节奏被拖慢。

这些调整不会立刻改变抓取结果,也不保证任何 URL 一定被收录,但它们减少的是实实在在的传输与时间成本。当抓取通道变宽,蜘蛛在同样的时间里能走完的路径自然更多,新 URL 被发现的等待窗口也会更短。