网站收录

靠 JavaScript 加载的内容没进索引:从原始 HTML 到渲染结果的核对顺序

页面在浏览器里看得到,抓取却像拿到了一份空壳,常见原因是正文、内链或 canonical 由 JavaScript 生成。这篇文章按原始 HTML、渲染方式、被屏蔽的资源、懒加载内容、URL 发现五步核对,帮你判断问题出在渲染链路的哪一段,以及哪些内容应该放回初始 HTML。

网站收录

靠 JavaScript 加载的内容没进索引:从原始 HTML 到渲染结果的核对顺序

页面在浏览器里打开一切正常,正文、图片、内链都在,但抓取工具拿到的却像一份空壳 HTML——标题有了,内容区是空的,导航链接也点不开。这类问题多半不是“收录慢”,而是内容压根没出现在搜索引擎能读到的那份文档里。下面按五步核对,找到卡住的环节。

先接受一个前提:你看到的页面和抓取到的页面可能不是同一份

现代搜索引擎会执行 JavaScript,但执行是有代价的:需要排队、需要下载脚本、需要调用接口,还有超时限制。这意味着“能渲染出来”和“稳定渲染出来”是两回事。有些页面在测试工具里渲染正常,在真实抓取时因为接口超时或资源被拦,渲染结果就是残缺的。所以第一步不是改代码,而是先确认差异到底有多大。

第一步:把原始 HTML 和渲染后结果分开看

大多数站长工具和 URL 检查功能都会给出两个视图:一个是服务器直接返回的原始 HTML,一个是执行脚本后的渲染结果。重点看三样东西:

  • 正文主体:原始 HTML 里有没有完整的文字内容,还是只有一个空的容器标签。
  • 站内链接:导航、面包屑、文章底部的相关阅读,是否是 JS 注入的。
  • canonical、hreflang、meta robots:这些信号如果只在渲染后才出现,容易与页面实际状态对不上。

如果这三样在原始 HTML 里都缺失,问题就不在收录环节,而在渲染链路。

第二步:分清页面的渲染方式,处理路径完全不同

服务端渲染(SSR)

HTML 由服务器生成后再返回。这是最稳的方式,抓取时不需要执行脚本就能拿到完整内容。如果这类页面仍然没被收录,方向应该转向 URL 规范、内容质量或抓取配额,而不是怀疑渲染。

动态渲染

对普通用户返回 JS 版本,对爬虫返回预渲染版本。要注意预渲染内容与用户看到的是否一致,以及预渲染服务是否稳定。一旦维护中断,爬虫拿到的可能就是空壳。

纯客户端渲染(CSR)

HTML 几乎是空的,靠脚本拉数据拼页面。风险最高:脚本执行失败、接口超时、渲染队列拥挤,任何一环出问题都会导致内容不可见。关键页面建议逐步改成 SSR,而不是长期依赖渲染碰运气。

第三步:核对渲染所需资源有没有被挡住

这是一处很容易被忽略的坑。robots.txt 里为了减少抓取,常有人顺手屏蔽脚本目录或接口路径,比如 /static/js/、/assets/、/api/。对普通用户没有影响,对渲染却是致命的:脚本拉不下来,接口调不通,页面自然渲染不出内容。

核对方法很简单:把 robots.txt 里的 Disallow 规则逐条对照渲染实际依赖的资源,看有没有误伤。同时确认这些资源没有返回 403 或 5xx。

第四步:判断内容是否藏在交互之后

折叠面板、选项卡、点击“展开全文”、无限滚动加载,这些交互在用户体验上是加分项,但内容可能不在初始渲染结果里。如果核心正文需要点击才能出现,收录结果里就可能只有标题和一小段引导语。

判断标准很直接:不点击、不滚动,页面里能读到多少有效信息?如果核心结论、关键数据、主要内链都需要操作才能看到,就值得把一部分内容挪回初始 HTML。

第五步:URL 的发现路径是否也依赖 JavaScript

抓取和收录是两个阶段,先要发现 URL。如果新页面的入口只存在于 JS 生成的列表里,爬虫未必能顺着找到。可以用禁用脚本的方式打开页面,看链接是否还留在 HTML 中。常见补法是在服务端输出的 HTML 里保留一层基础链接,比如分类页第一页、最新文章列表。

一份可以照着走的核对清单

  1. 对比原始 HTML 与渲染后结果,列出差异项。
  2. 确认页面属于 SSR、动态渲染还是 CSR。
  3. 逐条检查 robots.txt 是否屏蔽了脚本或接口资源。
  4. 关闭脚本后浏览页面,看核心内容与链接还剩多少。
  5. 检查折叠、选项卡、懒加载里的内容是否属于关键信息。
  6. 确认 canonical、meta robots 出现在原始 HTML 中。
  7. 用无 JS 环境验证站内链接是否可被发现。
把关键内容放进初始 HTML,通常是成本最低、收益最确定的一步。渲染方式可以慢慢重构,但正文、内链和收录类标签不该长期依赖脚本生成。

做完这五步,你大概率能定位到是资源被拦、渲染超时,还是内容本来就藏在交互里。剩下的工作就是把该回到 HTML 的部分挪回去,然后按正常节奏观察抓取和索引状态的变化。