网站收录

JS 渲染的页面没进索引:先看原始 HTML 里到底有没有内容

页面靠 JavaScript 渲染时,索引对不上往往不是蜘蛛完全不执行脚本,而是原始 HTML 与渲染后 DOM 之间存在差距。本文给出一套核对顺序:关掉 JS 自检、比对渲染前后结果、查日志确认渲染是否真的发生、排查接口与资源阻塞,并说明哪些内容适合前置到原始 HTML。

网站收录

JS 渲染的页面没进索引:先看原始 HTML 里到底有没有内容

页面用前端框架渲染,在浏览器里看一切正常,但搜索索引里要么找不到这个地址,要么标题和摘要都是模板里的默认值。遇到这种情况,常见的解释是「蜘蛛不执行 JavaScript」。这个说法只说对了一半。更准确的描述是:蜘蛛处理页面分成原始 HTML 和渲染后 DOM 两个阶段,两个阶段之间的差距,决定了这条 URL 最终能不能进索引。

抓取和索引之间,差的可能是一整次渲染

蜘蛛第一次请求拿到的,通常是最初返回的那份 HTML 源码。如果标题、主内容、正文内链都要等脚本执行之后才出现,那么这次请求在它眼里就是一个空壳。空壳不一定会被直接丢掉,它可能进入渲染队列等待二次处理,也可能因为信号太弱被搁置。索引里最终留下什么,取决于渲染这一步有没有顺利完成。

所以「抓到了」和「收录了」中间还隔着一层。站点日志里有访问记录,只能说明抓取发生过,不能说明它读到了你希望它读到的内容。

先做一次不执行脚本的自检

成本最低的核对方式,是把页面的 JavaScript 关掉再看一遍。

  • 在浏览器里禁用 JS 后重新加载,看还剩多少可读内容;
  • 查看「查看网页源代码」,而不是开发者工具里的 Elements 面板;
  • 用不执行脚本的方式请求一次,对比返回的 HTML 与你看到的是否一致;
  • 确认标题、主段落、正文内链是否已经出现在这次返回里;
  • 检查结构化数据是写在 HTML 中,还是靠脚本注入的。

如果关掉 JS 之后页面几乎空白,那收录问题大概率就出在这里,而不是别的地方。

怎么判断蜘蛛有没有真的渲染

渲染是要额外消耗资源的,不一定会对每个地址都做。可以从几个侧面观察:

  • 日志里渲染请求往往来自另一批 IP 或带不同的 UA 标识,出现频次明显低于普通抓取;
  • 站长平台的网址检查工具通常会分别展示原始 HTML 和渲染后的结果,直接对比即可;
  • 如果渲染队列迟迟没有来,索引里留下的自然只有原始 HTML 那点信息。

渲染环节常见的几个卡点

内容依赖交互才出现

点击、滚动、切换标签页之后才加载的内容,渲染阶段未必会触发。把关键内容放在默认状态、首屏位置,稳妥得多。

接口请求被规则挡住

页面本身允许抓取,但它调用的接口被 robots 规则或防火墙拦截,渲染出来依然是空的。排查时要连着接口路径一起看,别只盯着页面地址。

超时与资源阻塞

第三方脚本、埋点、字体加载慢,渲染可能在内容出现之前就结束了。核心内容尽量不依赖外部资源,越早进入 DOM 越好。

一个可执行的核对顺序

  1. 关掉 JS,确认原始 HTML 里有没有标题和主内容;
  2. 比对渲染前后两份结果,看差距有多大;
  3. 查日志,确认渲染请求有没有发生、频率如何;
  4. 检查渲染所依赖的接口与静态资源是否可访问;
  5. 把必须进索引的内容前置到原始 HTML,再观察索引状态的变化。

不一定要整套上服务端渲染

很多页面只是「主内容在脚本里」这一个问题。把标题、摘要、正文主体、关键内链放在服务端输出的 HTML 中,其余交互留给前端,往往就够用了。全部改成服务端渲染,改造量更大,也未必是当前最需要做的事。

收录核对的重点不是争论蜘蛛的渲染能力,而是找出原始 HTML 里缺了哪一块。补齐那一块,通常比反复解释「它能执行 JS」更有用。