网站收录

靠 JS 渲染出来的正文没进索引:原因排查与处理顺序

页面被收录了,但索引里的正文是空的,问题通常不在收录环节,而在抓取之后的渲染环节。本文说明原始 HTML 与渲染后 HTML 的差别、渲染失败的常见原因,并给出一套自查顺序和处理方向,适合依赖前端框架的站点在改版后核对索引内容。

网站收录

靠 JS 渲染出来的正文没进索引:原因排查与处理顺序

有时会遇到这种情况:某个 URL 已经出现在搜索结果里,标题也正确,但摘要和正文是空的,或者只剩导航和一行占位文字。点进去看页面是正常的,因为浏览器执行了 JavaScript。问题不在“有没有收录”这一步,而在抓取之后的渲染环节。

抓取到的版本和渲染后的版本,不是同一份

搜索引擎先按 URL 请求服务器,拿到原始 HTML。如果正文是页面加载后由 JS 写进 DOM 的,原始 HTML 里就只有空容器。之后这批 URL 会进入渲染队列,用无头浏览器再跑一遍,这时才可能看到完整内容。

关键在于,渲染是排队执行的,不是抓完立刻渲染。队列有优先级,页面越重、依赖越多,等待越久;渲染失败、超时或中途报错,索引里留下的就可能是那份原始 HTML 的版本。

几个常见原因

  • 正文完全由 JS 注入:不执行脚本的抓取看不到任何内容。
  • JS、CSS 或接口路径被 robots.txt 挡住:渲染需要自己去请求这些资源,被禁止抓取后就拿不到数据。
  • 内容要交互才出现:点标签页、展开折叠、滚动到一定位置才加载。
  • 请求依赖登录态或特定请求头:渲染请求通常不带用户会话。
  • 超时或资源过重:首屏脚本太大、串行请求太多,渲染在超时前没跑完。
  • 前端报错:接口结构变化、跨域限制、版本不匹配,页面渲染到一半停住。

自查顺序

  1. 用 URL 检查类工具对比“原始 HTML”和“渲染后的 HTML”,看正文是否出现在后者里。如果两边都空,问题在数据层,不在渲染层。
  2. 禁用 JS,或用 curl 直接请求该 URL,看返回的 HTML 里有没有正文。这一步最直观。
  3. 检查 robots.txt 是否误封了 JS、CSS、图片或接口路径,这是最常见的隐性原因。
  4. 检查接口返回是否依赖时间、地区、登录态或随机参数。
  5. 看渲染日志与页面性能:首屏脚本体积、外部请求数量、有没有长时间阻塞。

处理方向

核心内容尽量在服务端输出:标题、正文、价格、主要链接直接写在 HTML 里。交互增强的部分可以继续用 JS 做,但不应该由它决定页面“有没有内容”。

需要滚动或点击才加载的列表,尽量保留一组可抓取的分页 URL,而不是只有无限滚动。

noscript 里放一段提示,不能替代真正的服务端输出,抓取工具也不会把它当成正文的备选。

如果正文只有执行脚本后才存在,就别把“是否收录”当成唯一指标——索引里的内容是否完整,需要单独核对。

最后一句

收录只说明 URL 进了索引,不代表索引里的内容可用。对依赖前端框架的站点,建议把“渲染后的 HTML 是否包含正文”列为固定检查项,尤其在改版、换框架或调整接口之后。