搜索抓取

页面体积与 DOM 深度:蜘蛛抓取时容易被忽略的两项成本

抓取不只是能不能访问的问题。页面体积、DOM 深度、懒加载方式都会影响蜘蛛的抓取效率和链接发现顺序。本文梳理哪些常见写法会让页面变重,以及如何通过压缩、精简结构和保留可爬取链接,让有限的抓取机会用在真正的内容上。

搜索抓取

页面体积与 DOM 深度:蜘蛛抓取时容易被忽略的两项成本

聊抓取时,大家习惯先看蜘蛛来没来、有没有被 robots 拦住,但另一项成本常被忽略:蜘蛛打开一个页面之后,要为它付出多少解析代价。同样返回 200 状态码,一个几十 KB、结构清爽的页面,和一个体积巨大、DOM 塞了上万节点的页面,抓取效率可能差出好几倍。这会直接影响蜘蛛在一个时间段内能带走多少 URL。

页面体积:蜘蛛的时间同样有限

蜘蛛下载页面要占用带宽和时间。页面越大,单次抓取耗时越长,遇到网络波动时中途中断的概率也越高;抓取队列被慢页面拖住,新 URL 的发现自然会被推后。

常见的页面“虚胖”来源有几类:

  • 把整个列表页的全量数据以内联 JSON 写进 HTML,而蜘蛛只需要链接和标题;
  • 图片、字体、图标用 base64 直接嵌在 HTML 或 CSS 里,文档体积成倍增长;
  • 把全站共用的 CSS、JS 全部内联到每个页面;
  • 页面上堆了不少与主体内容无关的模块。

这些内容对用户未必没用,但蜘蛛真正需要的是可跟随的链接和正文文本。把数据接口化、资源独立化,页面主体就能瘦下来。

DOM 深度与节点数量:影响链接的发现顺序

HTML 解析成 DOM 之后,蜘蛛要从中提取链接和文本。节点越多、嵌套越深,解析越慢;更关键的是,处在深层嵌套里的链接,往往排在提取队列的靠后位置。

如果全站导航、相关推荐这些入口链接都被包在多层容器里,或者依赖组件在客户端渲染后才出现,那么这些链接要么晚被发现,要么根本进不了视野。

  • 把重要链接放在源码靠前的位置,而不是靠 CSS 让它“视觉上在上方”;
  • 减少无意义的包裹层,导航和列表尽量使用语义化标签;
  • 关键入口不要只存在于需要交互才展开的组件里。

懒加载、无限滚动与“加载更多”

这三者都会把链接发现推迟到用户行为之后。

  • 图片懒加载影响相对小,因为图片不是 URL 发现的主要来源,但要保证内容图片仍用真正的 img 标签,而不是全靠背景图或脚本插入;
  • 无限滚动和“加载更多”,如果后续内容只通过接口返回、不进入 HTML,蜘蛛通常跟不到;
  • 列表页尽量保留带页码的可点击链接,作为蜘蛛继续往下走的补充路径。

服务器侧也在同一笔账里

页面大意味着传输时间长,首字节之后还要慢慢下载;并发抓取多的时候,服务器 CPU 和带宽压力也会同步上升,响应变慢又反过来影响抓取节奏。压缩(gzip/brotli)、静态资源缓存、CDN 对用户和蜘蛛都有效,属于性价比很高的调整。

怎么自查

  1. 随机抽 5 到 10 个代表性页面,查看 HTML 文档本身的大小,把图片和视频排除在外;
  2. 统计 DOM 节点数量,找出异常膨胀的页面类型;
  3. 关闭 JS 后查看源码,数一数导航和列表里还剩多少链接;
  4. 对照服务器日志,看这些页面的抓取频率和平均响应时间,是否明显低于站点其他部分。
抓取效率往往不是靠堆入口堆出来的,而是每个页面都轻一点、结构浅一点、链接露得早一点,慢慢累积出来的结果。