网站收录

JS 渲染的页面,蜘蛛拿到的 HTML 里到底有没有正文

页面用浏览器打开一切正常,抓取到的源码却只有空壳?本文说明抓取与渲染的区别,如何用查看源代码和抓取工具自查内容是否在 HTML 里,资源被屏蔽导致的渲染失败,以及哪些内容更适合改为服务端输出。

网站收录

JS 渲染的页面,蜘蛛拿到的 HTML 里到底有没有正文

很多站点在排查收录时会遇到一个奇怪的现象:页面用浏览器打开完全正常,标题、正文、图片都在,但在抓取工具或“查看网页源代码”里,只剩下一层空的框架和几行脚本。这种差异往往不是服务器出了问题,而是内容由 JavaScript 在浏览器里渲染出来的。

抓取和渲染,通常不是同一步完成

搜索引擎的抓取程序第一次请求一个 URL 时,拿到的是服务端直接返回的 HTML 源码。多数情况下,它会把这批原始 HTML 先入库,再排队交给渲染服务,用类似浏览器的环境执行页面上的 JS,看最终呈现的内容是什么。

这意味着两点:第一,抓取请求成功,不等于内容已经被看到;第二,渲染是有成本、有延迟,也不保证对每个页面都执行的步骤。页面越多、权重越低、更新越不频繁,排队等待渲染的时间通常越长。

先判断你的页面是哪种渲染方式

  • 服务端渲染或静态生成:服务端返回的 HTML 里已经包含正文文字,JS 只是增强交互,这类页面在收录上最省心。
  • 纯客户端渲染:源码里通常只有一个空的容器和几段脚本,正文要等 JS 请求接口后再插入。
  • 混合渲染:头部信息、面包屑、部分正文在源码里,评论、推荐、价格等模块靠 JS 加载,这种情况不算最糟,但要确认关键内容属于哪一部分。

如何自查

  1. 用“查看网页源代码”(不是开发者工具里的 Elements 面板)搜索正文中的一句特征文字。
  2. 用抓取模拟工具或命令行请求,看返回的 HTML 里有没有同样的文字。
  3. 在浏览器里禁用 JavaScript 再打开页面,观察正文是否消失。

渲染延迟会以什么形式表现出来

如果正文依赖渲染,常见的表现是:URL 已经被抓取,但长期停在“已抓取,尚未编入索引”;或者索引里保存的是较早版本,更新迟迟不生效;再或者标题、摘要被系统从其他位置拼凑出来。这些问题看起来像内容质量或权重问题,实际原因却在渲染环节。

判断时可以先对比浏览器看到的页面和索引快照里的页面。如果快照明显“缺胳膊少腿”,优先查渲染,而不是急着改标题和正文。

一个经常被忽略的原因:资源被屏蔽

渲染需要加载页面的 JS 和 CSS 文件。如果 robots.txt 或服务器规则把这些静态资源拦住了,渲染服务拿不到脚本,执行出来的自然还是空页面。这种情况和主动禁止收录很像,但更难发现,因为页面本身没有任何 noindex 标记。

排查顺序建议如下:

  1. 确认 robots.txt 没有拦截 JS、CSS 所在目录。
  2. 确认这些资源没有返回 403、404 或需要登录才能访问。
  3. 确认 noindex 标签是写在 HTML 里,而不是靠 JS 动态插入。
  4. 如果正文确实依赖前端接口,检查接口对抓取请求是否返回了内容。

什么时候值得改成服务端渲染

不是所有页面都需要。判断标准可以简单一些:这段内容是不是你希望出现在搜索结果里的核心信息。文章正文、商品详情、常见问题答案属于核心内容,放在 HTML 里更稳妥;筛选控件、悬浮动画、次要推荐位可以继续交给 JS。

如果暂时不改架构,也可以先做几件事:把关键内容做成服务端输出的一部分;给重要 URL 保留稳定的内链入口,让它们更容易被发现;用 sitemap 明确告知页面存在。这些措施不能保证收录,但能减少因为“看不到内容”而被忽略的概率。

别把渲染问题和收录结果混为一谈

  • 渲染成功不等于一定被收录,页面质量、重复度、站点整体情况仍然有影响。
  • 被收录也不等于有排名,两者是不同阶段的结果。
  • JS 里生成的链接理论上可以被发现,但可靠性低于 HTML 里的普通链接,重要导航尽量用后者。

把渲染这一环确认清楚,再去讨论内容质量和索引状态,排查会顺畅很多。