AI 爬虫能读取由 JavaScript 渲染的内容吗?
往往不能。Googlebot 会稍后渲染 JavaScript,但多数 AI 爬虫未说明会这么做,Google 也指出并非所有机器人都能运行它。若文字在脚本运行后才出现,AI 爬虫可能只拿到空白页。请用服务器端渲染或静态页面,在初始 HTML 中提供主要内容。
单页应用和客户端框架随处可见,在浏览器里看起来都很正常。但只读取服务器所发送 HTML 的爬虫看到的却是另一番景象:一个 <div id="root"></div>、几个脚本标签,文字很少甚至没有。对 AI 回答来说,这样的页面没有可引用的内容。
本页内容
AI 爬虫为什么会错过 JavaScript 内容?
运行 JavaScript 的成本很高。爬虫必须下载脚本,在浏览器引擎中执行,并等待数据加载。Google 在搜索中会这样做:它先抓取,把页面排入渲染队列,并在资源允许时使用无头 Chromium 渲染。即便如此,Google 仍推荐服务器端渲染或预渲染,因为这对用户和爬虫都更快,并指出并非所有机器人都能运行 JavaScript。
OpenAI、Anthropic 和 Perplexity 在其爬虫文档中没有说明它们的代理会执行 JavaScript。Apple 表示 Applebot 可能会在浏览器中渲染页面。在没有明确说法的情况下,对 AI 爬虫稳妥的假设是:它们只读取最初的 HTML。
如何检查爬虫收到了什么?
要看原始 HTML,而不是渲染后的页面。浏览器开发者工具显示的是脚本运行后的 DOM,这不是爬虫拿到的内容。使用查看源代码,或在命令行中保存原始 HTML 并搜索:
curl -s -o page.html \
-A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot" \
https://example.com/page
# Is a sentence from your main text in the raw HTML?
grep -c "a sentence from your main content" page.html
结果为 0 表示这句话不在服务器发送的 HTML 中,因此不运行脚本的爬虫找不到它。快速看一眼文件就能了解其余情况:服务器端渲染的文章,其完整文本就在里面;客户端空壳则只有一个空的根元素和一串脚本。
哪些页面风险最大?
- 用 React、Vue、Angular 或 Svelte 构建、所有内容都在浏览器中渲染的单页应用。
- 加载后才从 API 获取主要文字的页面,例如产品详情、价格或评价。
- 位于标签页、折叠面板或“加载更多”区域中、只有点击时才会请求的内容。
- 位于爬虫无法通过的登录、付费墙或同意墙之后的页面。
- 仅通过 JavaScript 设置
noindex或规范(canonical)URL 的页面。Google 警告说,当它在原始 HTML 中看到noindex时,可能会完全跳过渲染。
如何修复只靠 JavaScript 的内容?
解决办法是在第一次响应中就发送重要内容。选择你的技术栈所允许的最轻量的方案:
- 服务器端渲染(SSR):Next.js、Nuxt、SvelteKit 和 Angular SSR 等框架在服务器上渲染页面,并在浏览器中进行水合(hydrate)。
- 静态生成或预渲染:对于很少变化的页面,例如文章、文档和落地页,在部署时构建 HTML。
- 渐进增强:把文字、标题、链接、价格和 JSON-LD 放进 HTML,只用 JavaScript 实现交互。
- 把重要内容内联:如果标签页隐藏了内容,就把全部内容放进 HTML,用 CSS 或脚本切换显示,而不是在点击时再去获取。
你不必一次性改造整个应用。从你希望被引用的页面开始:文章、文档、产品页和定价页。账户区域和仪表盘可以保持在客户端,因为它们本来就在登录之后。
避免根据 user agent 向爬虫提供与用户不同的页面。为所有人渲染同样的 HTML,更易于维护,也能避免任何关于伪装(cloaking)的疑虑。
登录、同意和付费墙页面也会拦住 AI 爬虫吗?
会。爬虫不会登录,不会点击 cookie 横幅,也不会通过验证。Anthropic 表示其机器人不会尝试绕过验证码。如果同意管理工具在 HTML 中用全屏浮层替换了页面,或把首次访问者重定向到同意页面,爬虫得到的就是它们,而不是你的内容。
确保公开页面无论同意状态如何,都在 HTML 中渲染其内容,横幅应作为浮层而不是替代品。让你希望被引用的页面位于登录墙之外,并检查爬虫没有被重定向到登录页面。
AISeeWhy 如何检测只靠 JavaScript 的页面?
AISeeWhy 在不运行脚本的情况下,读取每个爬虫收到的最初 HTML。当页面几乎没有可见文字,却有框架根元素和脚本时,它会报告一条 P1 发现,指出内容需要 JavaScript。它还会标出把爬虫带到与浏览器所得页面不同位置的重定向。
常见问题
Googlebot 会渲染 JavaScript 吗?
会。Google 抓取 HTML,把页面排入渲染队列,并在资源允许时使用无头 Chromium 渲染。Google 仍然推荐服务器端渲染或预渲染。
ChatGPT、Claude 和 Perplexity 的爬虫会运行 JavaScript 吗?
它们的厂商在爬虫文档中没有这样说。在厂商另有说明之前,应假定爬虫读取的是最初的 HTML,并确保你的内容就在其中。
为机器人提供动态渲染是个好主意吗?
它可以作为权宜之计,但会增加需要维护的第二条渲染路径。服务器端渲染或静态 HTML 向所有人提供相同的内容,是更简单的长期方案。
由 JavaScript 添加的 JSON-LD 算数吗?
Google 在渲染后可以读取它,但不运行脚本的爬虫看不到。请把 JSON-LD 放在最初的 HTML 中。
参考资料
- Google Search Central:JavaScript SEO 基础
- Apple:关于 Applebot
- OpenAI:OpenAI 爬虫概览
- Anthropic:Anthropic 是否会抓取网络数据?网站所有者如何屏蔽该爬虫?
- Perplexity:Perplexity 爬虫