AI 爬虫实际看到的内容:真实审计中的渲染一致性
We fetch every homepage two times — plain HTTP and full browser — and compare field by field. When the comparison completes, it fails far more often than it passes.
我们执行的每一次审计都会捕获主页两次. 第一次捕获是原始 HTML 在纯 HTTP 上——页面正如从未运行 JavaScript 的抓取器接收的那样。 第二次通过真实浏览器执行脚本并等待 DOM 稳定后捕获. 然后引擎逐字段比较两种表示:标题、H1、规范链接、元描述、JSON-LD 和正文文本量。 在 49 站点中,审计时间为 5 至 August 15, 2026,比较在 20 上作出裁决——引擎跳过它,而不是在两次捕获不直接可比时猜测. 其中 20,恰好 2 通过了. 其余 18 个站点为浏览器提供一页,为任何读取 HTML 为已交付内容的用户提供更薄的版本。 方法论:来自我们当前检查集的每个域的最新完成审计快照,五月 5 – August 15, 2026,已匿名化。 双捕获比较完成于 20 的 49 站点;其余站点无法获得可比的渲染捕获,因此检查报告未作裁决而非猜测。 20 是一个小样本——将失败比例视为方向性。 样本为自选——仅包含已执行审计的站点所有者——并倾向于小型和中型站点。
检查会两次抓取您的页面,并比较只有浏览器能构建的差异
渲染一致性是一种机械比较,值得精确说明其测量内容,因为失败具有特定形态. 从两次捕获——原始 HTML 与浏览器渲染的 DOM——引擎提取相同的 6 项并进行比较:
| 标题 | 与原始和渲染的差异,或在 JavaScript 运行前缺失 |
| H1 标题 | 完整 H1 集合不同,或原始 HTML 中不存在 H1 |
| 规范 URL | 由 JavaScript 注入或更改 |
| Meta 描述 | 由 JavaScript 注入或更改 |
| JSON-LD 类型 | 仅在渲染后存在的结构化数据 |
| 正文文本量 | 原始 HTML 占渲染单词数的不到 30% |
判决逻辑将 2 情况 分开. 当值仅在捕获之间不同——一个由 JavaScript 重写的标题,一个在水合后文本变化的 H1——检查会发出警告。 当关键 SEO 字段仅在渲染后存在——没有标题、规范、元描述、H1 或 JSON-LD 在原始 HTML 中,但在渲染后的 DOM 中存在——或当原始正文文本低于页面真实内容渲染单词数的 30% 时,检查失败,对正文文本情况的严重性为关键。 比较首先解码 HTML 实体,因此美容编码差异永远不会计入;只有真正的内容缺口才会计入。 引擎也拒绝猜测. 如果普通获取和浏览器解析到不同的最终 URL——例如语言重定向——捕获描述不同的资源,比较会被跳过而不是报告为缺陷.
AI 爬虫读取原始侧面,它们不再是小众受众
多年来,原始 HTML 与渲染 DOM 之间的差距是可承受的,因为 Google 为你关闭了它:Googlebot 将页面排队进行后续渲染索引。 我们在我们的 JavaScript SEO 审计指南 中涵盖了这些机制——以及它们的延迟和失败模式。 本文是其 AI 搜索伴侣,因为在 2026 中填充服务器日志的爬虫行为不同.
2026 年 5 月对数亿机器人事件的分析由 Limy 发现,AI 爬虫几乎全部直接抓取 HTML。 这些抓取器不会像 Google 的渲染管道那样运行你的脚本:GPTBot、ClaudeBot、PerplexityBot,以及 AI 助手背后的检索抓取器读取第一条响应后就继续。 当助手决定你的页面是否回答问题——我们在生成式 AI 搜索指南中绘制的选择过程——它读取的是原始捕获,而不是渲染后的版本.
这重新定义了渲染对等失败的成本。一个客户端页面以前被“索引更慢”。现在,对于越来越多的读者来说,一个内容通过 JavaScript 到达的页面只是空的:一个 <div id="root">, 一个脚本标签,以及40个备用文本词语,代替你整个推销。我们样本中的18个失效站点对用户和Google可读,但对越来越多的人询问系统而非搜索的系统来说基本不可读。`
在比较未给出裁决的 29 站点也不在明朗之中——渲染捕获无法完成或比较的主页,其在自动化阅读器下的行为尚未验证. 2 的干净通过为它们赢得了.
在生成 HTML 的地方修复它
修复方案是服务器端渲染或预渲染——内容在第一条 HTTP 响应中出现。 这意味着什么取决于你的框架类别. Meta-框架内置 SSR — Next.js、Nuxt、SvelteKit、Angular。 这些默认在服务器上渲染;此处的失败几乎总是有人切换了设置。 审计 opt-out:
- Next.js App Router:在服务器组件中保留页面级内容. 在
useEffect内部的"use client"组件中获取的内容永远达不到原始 HTML。从页面导出metadata,以便标题和描述在第一条响应中发送。 - Nuxt:
ssr: true是nuxt.config.ts的默认值 — 确认没有人设置ssr: false。 - SvelteKit:在
+layout.js或+page.js中查找export const ssr = false;在布局层级,它会把整个站点变成空壳。 - Angular:
ng add @angular/ssr在现代版本中启用服务器渲染。
仅客户端 SPA — React 搭配 Vite,或旧版 CRA 构建。 没有服务器可渲染,所以添加一个或在构建时预渲染。 对于变化很少的内容,构建时预渲染(Vike,或每条路由的静态导出)会将真实的 HTML 写入你的部署产物。 对于内容繁重的网站,将公共路由迁移到元框架是持久的答案;在源站前使用预渲染代理是权宜之计. 静态生成器和经典平台 — Astro、Hugo、Eleventy、WordPress、Shopify。 这些默认发出完整的 HTML,很少失败检查。 需要审计的例外:由标签管理器注入的内容或结构化数据. 通过 Google 标签管理器添加的 JSON-LD 仅在 JavaScript 运行后存在 — 原始侧的每个抓取器都看到没有结构化数据的页面。 将其移入服务器模板. 无论使用哪种技术栈,首个响应应携带标题、元描述、规范链接、H1、页面主要内容以及 JSON-LD。交互性可稍后实现;意义无法改变。
在 2 分钟内使用 curl 验证。
你可以在终端运行此检查的核心。像 AI 爬虫一样获取页面,并统计返回内容:
curl -s https://example.com/ | grep -ci "<h1"curl -s https://example.com/ | grep -c 'application/ld+json'curl -s https://example.com/ | wc -w
然后在浏览器中打开相同的 URL,打开 DevTools,并与渲染文档比较:H1 是否在两者中都存在? JSON-LD 块是在 curl 输出中还是仅在 Elements 面板中? curl 词数是否与屏幕上可读的范围相同,还是仅为其小部分? 原始词数远低于渲染词数正是我们的引擎标记的比例. 我们的审核在每次运行时自动完成此比较——两次捕获、所有 6 个字段,列出精确的不匹配——并且 免费报告 显示每个字段处于缺口的哪一侧。 通过渲染一致性的站点并未回避 JavaScript。 它们生成自己的 HTML,每位读者都能看到——而在 20 个样本中 18 个完成比较的站点发现 AI 爬虫与用户看到的页面不同,这一单一架构选择决定了谁被阅读。
查看您的网站排名
获取一份免费的 AI 驱动的 SEO 报告,包含可操作的发现和优先修复建议,帮助提升您的网站。
不需要注册。.