搜索抓取

搜索蜘蛛抓取:页面体积过大与抓取截断造成的正文及内链缺失排查

页面能正常打开,不代表蜘蛛能完整读完。本文从响应体体积入手,梳理抓取截断的常见症状、体积来源与收敛顺序,帮助你把正文、内链和结构化数据放回可被抓取的位置,减少因 HTML 过大造成的发现缺口。

搜索抓取

搜索蜘蛛抓取:页面体积过大与抓取截断造成的正文及内链缺失排查

抓取截断:一个容易被忽略的入口损耗

排查抓取问题时,大家习惯先看状态码、robots、Sitemap 和跳转,却很少关注单个响应体的体积。搜索引擎抓取页面时对 HTML 有大小上限,不同引擎的数值不一样,计算口径通常是最初返回的、未压缩的 HTML 字节数。以公开说明为例,主流引擎对 HTML 的单次抓取上限多在 2MB 以内,超出部分往往不会进入后续解析与链接提取。页面在浏览器里看起来完整,但后半段正文和底部内链实际上没有被处理。

这类问题不会报错,也没有明显状态码异常,只能通过对比发现:索引里的正文比页面上少一截,底部导航区的新链接迟迟不被发现,结构化数据缺失。

先确认是不是体积造成的

  1. 用命令行拉取原始 HTML 并统计未压缩字节数,例如 curl -s -H 'Accept-Encoding: identity' 页面地址 | wc -c,这个值更接近蜘蛛实际拿到的体积。
  2. 同时记录压缩后的传输体积,区分“传输大”和“解析体积大”,两者不是一回事。
  3. 把 HTML 存成文件,标出正文结束位置、第一批内链位置、结构化数据所在行,看它们分别落在多少 KB 处。
  4. 在抓取日志里观察同一批页面的响应大小分布,找出明显偏大的模板或栏目。
  5. 如果被截断的内容恰好包含分页链接或列表项,就能解释“深层页面长期不被发现”的现象。

体积通常堆在哪里

  • 内联的大段 CSS 与 JavaScript,尤其是把整站样式表塞进 head 的模板。
  • 以 base64 形式内嵌的图片、字体和整组 SVG 图标。
  • 模板注释、调试输出、被注释掉的旧版块和重复的导航、页脚 HTML。
  • 长列表一次性渲染全部条目,条目越多,正文越靠后。
  • 富文本编辑器带出的冗余标签、行内样式和空白字符。

其中前两项最容易在改版或引入前端框架后迅速膨胀,且不容易被日常检查发现。

截断之后的连锁反应

抓取截断不只是“少读一段字”。内链如果集中在页面底部,被截断后这些链接就不会进入待抓取队列,久而久之形成孤岛;分页链接如果排在列表末尾,深层列表页的发现速度会明显下降;结构化数据、面包屑和 canonical 如果写在靠后位置,也可能一并缺失。换句话说,体积问题会伪装成内链问题和索引问题。

收敛体积的处理顺序

  1. 先把 CSS 和 JavaScript 外链化,并做压缩与合并,避免每个页面重复携带。
  2. 去掉无用注释、调试信息和重复的模板片段,清理空白字符。
  3. 图片、字体、图标改为独立 URL 引用,不使用内嵌数据。
  4. 长列表分页,每页条目数控制在合理范围,让正文尽早出现。
  5. 把关键内链、面包屑、结构化数据前置到正文附近,不要依赖页脚。
  6. 开启 gzip 或 brotli 压缩传输层,降低带宽占用,但它改变的是传输体积,不会提高解析上限。
  7. 对确实难以瘦身的页面,用 Sitemap 或独立入口补充链接,减少对内链的依赖。

改完之后怎么核对

核对时看三个量:单页未压缩体积的分布、抓取日志中响应大小的变化、底部内链被发现的速度。如果体积降下来后,原本依赖页脚链接的页面开始出现在抓取记录里,说明方向正确。也可以抽查几个页面,对比源站 HTML 与索引正文的长度差异。

不要用隐藏链接或堆积大量无关内链的方式去“补偿”被截断的部分,这既解决不了体积问题,也会带来新的质量风险。把内容本身放在前部,才是更稳的做法。

小结

抓取截断属于典型的“页面正常但抓取不全”的问题。排查顺序建议是:先量未压缩 HTML 体积,再定位体积来源,然后按外链化、清理冗余、分页拆分、入口前置的顺序收敛,最后用日志和索引结果回看效果。体积降下来,内链和正文的发现才谈得上稳定。