站点运营

站点运营:前端渲染与首屏内容自查,别让蜘蛛只抓到一片空白

改版到前端框架后,页面在浏览器里看着正常,抓下来的源码却只有空壳。本文讲如何用原始抓取、关闭 JS、抓取测试工具判断页面是服务端渲染还是客户端渲染,并给出覆盖标题、正文、分页链接、首屏图片与 robots 拦截的自查清单,把内容更顺畅地送到抓取程序面前。

站点运营

站点运营:前端渲染与首屏内容自查,别让蜘蛛只抓到一片空白

不少站点改版到前端框架之后,页面在浏览器里看起来一切正常,但把 HTML 源码拉出来,正文、标题、链接全都不在,只有一个空的挂载节点和几行脚本。对访客没有影响,对依赖 HTML 抓取的程序来说,这个页面基本就是一张空白纸。这篇文章说的就是怎么自查这件事。

为什么渲染方式会影响抓取

抓取大致分两步:先拿到 HTML 源码,再决定要不要排队执行页面里的 JavaScript,拿到渲染后的内容。第二步成本高、有延迟,而且不同引擎的执行能力、队列长度、超时时间都不一样。如果页面完全依赖客户端渲染,关键内容在一段时间内可能只以空壳的形式被看到。

这不是收录与否的保证问题,而是内容送达难度的问题。页面能少一层依赖,就少一层不确定性。

怎么判断自己的页面属于哪种情况

最简单的方法不是打开开发者工具看 Elements 面板,那里显示的是渲染后的结果,看不出问题所在。

  • 在浏览器里右键查看网页源代码,搜索正文里的一个关键词,看它在不在。
  • 用命令行抓一次,例如 curl 页面地址,把输出保存下来再搜索关键词。
  • 把 JavaScript 关掉再打开页面,观察首屏是否还有主要内容。
  • 用搜索引擎提供的抓取测试工具,对比原始 HTML 与渲染后 HTML 的差异。

常见的几种空白表现

  • 正文全部由接口返回后插入,源码里只有加载占位。
  • title、description、canonical、h1 由脚本运行时写入,源码里是默认值或者干脆没有。
  • 列表页用无限滚动,翻页不是真正的链接,第二页之后的内容很难被逐层跟随。
  • 首屏图片用了懒加载,真实地址写在 data-src 上,src 是占位图,抓取时拿不到图片。
  • 路由使用 hash 形式,多篇不同内容共用同一个可抓取地址。
  • 内链是按钮加点击事件,页面上看得见点得动,但没有可跟随的链接。

一份可以照着做的自查清单

  1. 对一个典型详情页执行原始抓取,确认正文首段、小标题是否存在于源码中。
  2. 分别检查首页、栏目页、详情页三类模板,不要只测一个页面。
  3. 确认 title、h1、canonical 在源码里就已经是最终值,而不是脚本补上的。
  4. 检查分页与列表入口是否为可点击、可跟随的链接,而不是纯 JS 事件。
  5. 检查首屏图片的真实地址是否直接出现在 img 标签的 src 中。
  6. 确认 robots.txt 没有拦截承载内容的 JS、CSS 文件,否则渲染本身就会失败。
  7. 检查接口请求是否依赖登录态或特殊请求头,抓取时是否返回空数据。
  8. 检查渲染后页面的内容与 canonical、结构化数据是否一致,避免出现两套内容。

处理顺序建议

如果自查发现问题,不必一次性大改,可以按投入产出排序:

  1. 先把首屏关键内容服务端输出,比如标题、正文前几段、主要链接,这一步收益最大。
  2. 把详情页、列表页的分页链接改回真实链接,保证能逐层被跟随。
  3. 页面路由尽量使用普通路径,避免把内容藏在 hash 后面。
  4. 短期做不到服务端渲染,可以考虑预渲染或静态生成,先把已发布内容渲染成 HTML。
  5. 动态渲染只作为过渡方案,注意给用户和抓取程序的内容要保持一致。
给抓取程序看的内容和给用户看的内容必须一致。为爬虫单独准备一套简化页面,短期也许有效,但一旦被识别为伪装,代价远大于收益。

把它放进上线流程

渲染方式的问题往往在改版时集中出现:以前是模板直出,重构后变成前端渲染,页面看起来更现代了,内容却变得难抓。建议在发布清单里加一条:新模板上线前,用原始抓取的方式检查一遍源码,确认关键内容、链接、标题都在里面。这一条检查花不了几分钟,但能省掉后面几周反复排查的时间。