AI 爬虫能读取由 JavaScript 渲染的内容吗?

发布于

简短回答

往往不能。Googlebot 会稍后渲染 JavaScript,但多数 AI 爬虫未说明会这么做,Google 也指出并非所有机器人都能运行它。若文字在脚本运行后才出现,AI 爬虫可能只拿到空白页。请用服务器端渲染或静态页面,在初始 HTML 中提供主要内容。

单页应用和客户端框架随处可见,在浏览器里看起来都很正常。但只读取服务器所发送 HTML 的爬虫看到的却是另一番景象:一个 <div id="root"></div>、几个脚本标签,文字很少甚至没有。对 AI 回答来说,这样的页面没有可引用的内容。

本页内容
  1. AI 爬虫为什么会错过 JavaScript 内容?
  2. 如何检查爬虫收到了什么?
  3. 哪些页面风险最大?
  4. 如何修复只靠 JavaScript 的内容?
  5. 登录、同意和付费墙页面也会拦住 AI 爬虫吗?
  6. AISeeWhy 如何检测只靠 JavaScript 的页面?

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 中,因此不运行脚本的爬虫找不到它。快速看一眼文件就能了解其余情况:服务器端渲染的文章,其完整文本就在里面;客户端空壳则只有一个空的根元素和一串脚本。

哪些页面风险最大?

如何修复只靠 JavaScript 的内容?

解决办法是在第一次响应中就发送重要内容。选择你的技术栈所允许的最轻量的方案:

你不必一次性改造整个应用。从你希望被引用的页面开始:文章、文档、产品页和定价页。账户区域和仪表盘可以保持在客户端,因为它们本来就在登录之后。

避免根据 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 中。

参考资料

更多文章