搜索抓取

页面体积与蜘蛛抓取:HTML 越重,能走的路越少

蜘蛛每抓一次都要完整下载页面,体积和 DOM 复杂度直接决定单位时间里能覆盖多少 URL。本文讲清 HTML 变重的常见来源、DOM 深度对链接提取的影响、懒加载的风险,以及压缩、缓存、分页这些能落地的取舍,把抓取这条路修顺一点。

搜索抓取

页面体积与蜘蛛抓取:HTML 越重,能走的路越少

抓取从下载开始,体积就是成本

蜘蛛抓一个 URL,第一步是把响应体完整读下来。页面越大,下载耗时越长,占用的连接时间越久。对单个页面来说,几十 KB 和几百 KB 的差别可能只是一次抓取快慢;但放到全站几万、几十万个 URL 上,这个差别会直接体现在单位时间内蜘蛛能走过的页面数量上。

所以页面体积不只是体验问题,它同时决定了蜘蛛一趟能覆盖多少地址。

HTML 是怎么变重的

  • 把大段结构化数据、样式、脚本内联进 HTML,而不是放在独立文件里;
  • 模板里输出的隐藏区块、弹窗、多套导航,用户看不到但蜘蛛要解析;
  • 列表页一次渲染几百条记录,而用户通常只滚动到前几十条;
  • 注释、调试代码、重复的 class 名,长期积累下来没人清理。

这些内容多数对蜘蛛理解页面没有帮助,却要被下载、解析,并占用后续处理环节。

DOM 深度与链接可发现性

蜘蛛要从 HTML 里提取链接。链接埋得越深——包在多层嵌套的容器、需要展开的组件、点了才出现的菜单里——被稳定提取的概率就越低。DOM 层级过深还有一个副作用:正文和导航链接混在一起,蜘蛛更难判断哪些链接值得继续跟。

比较稳妥的做法是让主导航、分类入口、面包屑在 HTML 里以朴素形式出现,不依赖交互才加载。

懒加载与依赖 JS 的内容

图片懒加载对抓取影响不大,但把链接或正文放在脚本执行后才插入的组件里,就存在风险。渲染能力是有限的,也不是每一次抓取都会等脚本跑完。内容层面的建议很简单:关键链接和主体文本服务端直出,交互增强放在后面。

服务端能做的几个取舍

  1. 压缩传输:开启 gzip 或 brotli,能砍掉相当一部分传输体积;
  2. 列表拆分:限制单页条数,用分页把长列表切开;
  3. 缓存与响应时间:把渲染结果缓存起来,减少蜘蛛等待;
  4. 去冗余:定期清理模板里已经没人用的区块和样式。

用日志验证,而不是凭感觉

改动之后,看服务器日志里蜘蛛的来访次数、平均响应时间,以及请求被浪费在参数页或无意义页面上的比例。体积变小、响应变快,通常表现为同一时间段内蜘蛛走过更多 URL。但这不等于一定会收录或带来排名,它只是把抓取这条路修得顺一点。

蜘蛛的时间是有限的。让它少花在下载和解析上,才有机会多走几个页面。