聊抓取时,大家习惯先看蜘蛛来没来、有没有被 robots 拦住,但另一项成本常被忽略:蜘蛛打开一个页面之后,要为它付出多少解析代价。同样返回 200 状态码,一个几十 KB、结构清爽的页面,和一个体积巨大、DOM 塞了上万节点的页面,抓取效率可能差出好几倍。这会直接影响蜘蛛在一个时间段内能带走多少 URL。
页面体积:蜘蛛的时间同样有限
蜘蛛下载页面要占用带宽和时间。页面越大,单次抓取耗时越长,遇到网络波动时中途中断的概率也越高;抓取队列被慢页面拖住,新 URL 的发现自然会被推后。
常见的页面“虚胖”来源有几类:
- 把整个列表页的全量数据以内联 JSON 写进 HTML,而蜘蛛只需要链接和标题;
- 图片、字体、图标用 base64 直接嵌在 HTML 或 CSS 里,文档体积成倍增长;
- 把全站共用的 CSS、JS 全部内联到每个页面;
- 页面上堆了不少与主体内容无关的模块。
这些内容对用户未必没用,但蜘蛛真正需要的是可跟随的链接和正文文本。把数据接口化、资源独立化,页面主体就能瘦下来。
DOM 深度与节点数量:影响链接的发现顺序
HTML 解析成 DOM 之后,蜘蛛要从中提取链接和文本。节点越多、嵌套越深,解析越慢;更关键的是,处在深层嵌套里的链接,往往排在提取队列的靠后位置。
如果全站导航、相关推荐这些入口链接都被包在多层容器里,或者依赖组件在客户端渲染后才出现,那么这些链接要么晚被发现,要么根本进不了视野。
- 把重要链接放在源码靠前的位置,而不是靠 CSS 让它“视觉上在上方”;
- 减少无意义的包裹层,导航和列表尽量使用语义化标签;
- 关键入口不要只存在于需要交互才展开的组件里。
懒加载、无限滚动与“加载更多”
这三者都会把链接发现推迟到用户行为之后。
- 图片懒加载影响相对小,因为图片不是 URL 发现的主要来源,但要保证内容图片仍用真正的 img 标签,而不是全靠背景图或脚本插入;
- 无限滚动和“加载更多”,如果后续内容只通过接口返回、不进入 HTML,蜘蛛通常跟不到;
- 列表页尽量保留带页码的可点击链接,作为蜘蛛继续往下走的补充路径。
服务器侧也在同一笔账里
页面大意味着传输时间长,首字节之后还要慢慢下载;并发抓取多的时候,服务器 CPU 和带宽压力也会同步上升,响应变慢又反过来影响抓取节奏。压缩(gzip/brotli)、静态资源缓存、CDN 对用户和蜘蛛都有效,属于性价比很高的调整。
怎么自查
- 随机抽 5 到 10 个代表性页面,查看 HTML 文档本身的大小,把图片和视频排除在外;
- 统计 DOM 节点数量,找出异常膨胀的页面类型;
- 关闭 JS 后查看源码,数一数导航和列表里还剩多少链接;
- 对照服务器日志,看这些页面的抓取频率和平均响应时间,是否明显低于站点其他部分。
抓取效率往往不是靠堆入口堆出来的,而是每个页面都轻一点、结构浅一点、链接露得早一点,慢慢累积出来的结果。