GEO 技术:内容可抓取性与 JavaScript 渲染实战指南
一句话结论:在 GEO 时代,"Google 能索引"不等于 "AI 能抓取"。如果你的核心内容依赖客户端 JavaScript 渲染,AI 爬虫看到的只是一具空壳——这不是延迟索引的问题,而是内容在 AI 世界中"从未存在"的问题。
一、认知断层:AI 爬虫与搜索引擎爬虫的根本差异
大多数技术团队对"可抓取性"的认知仍停留在 SEO 时代:Googlebot 能执行 JavaScript,只要等一段时间,页面终将被索引。但 GEO 面对的是一组全新的爬虫生态——GPTBot、ClaudeBot、PerplexityBot、DeepSeekBot 等 AI 爬虫,它们的设计哲学与搜索引擎爬虫存在本质差异。
搜索引擎爬虫(如 Googlebot)的核心目标是"发现与索引",因此 Google 投入了海量算力建设渲染队列,允许 JavaScript 执行后再抓取内容。而 AI 爬虫的核心目标是"大规模语料采集",追求极致的抓取效率。Vercel 的监测数据显示,主流 AI 爬虫的合计请求量已达每月 13 亿次,但没有任何一个 AI 爬虫具备 JavaScript 执行能力——对 5 亿多次 GPTBot 抓取的分析中,零次 JavaScript 执行记录。
这意味着什么?CSR(客户端渲染)页面在 AI 爬虫眼中,初始 HTML 里只有一个空的 <div id="root"></div> 和一串 script 标签。产品描述、价格、用户评价——这些靠 JS 异步加载的核心内容,AI 爬虫完全看不到。这不是"索引慢",而是"内容不存在"。
二、SSR vs CSR:AI 爬虫视角的对比诊断
从 AI 爬虫的视角看,三种渲染策略的差异可以用一张表说清楚:
| 维度 | CSR(客户端渲染) | SSR(服务端渲染) | SSG(静态生成) |
|---|---|---|---|
| HTML 首次响应 | 几乎为空 | 完整内容 | 完整内容(预构建) |
| AI 爬虫可见性 | 不可见 | 完全可见 | 完全可见 |
| 索引速度 | 无法索引 | 即时 | 即时 |
| 服务器成本 | 低 | 较高 | 低 |
| 适用场景 | 内部工具、强交互应用 | 内容站、电商、营销页 | 企业官网、博客 |
关键洞察:SSR 和 SSG 对 AI 爬虫没有本质区别——两者都在服务端把内容写入了 HTML。真正的分水岭是 CSR。很多团队误以为用了 Next.js 或 Nuxt.js 就自动获得了 SSR 优势,但实际上,如果数据请求写在 useEffect 或客户端生命周期中,框架只是在服务端渲染了一个空壳,内容仍然依赖客户端加载。
三、动态内容渲染测试:三步诊断法(实战)
不要猜测你的页面对 AI 爬虫是否友好,要测试。以下是我在多个项目中验证过的三步诊断法:
第一步:裸 HTML 测试(模拟 AI 爬虫视角)
用 curl 或 wget 模拟无 JavaScript 环境的请求,这是 AI 爬虫看到的内容:
curl -A "GPTBot/1.0" https://your-domain.com/product-page
检查返回的 HTML 中是否包含核心内容:标题、正文、产品信息、价格、FAQ 等。如果返回的 HTML 中这些关键字段缺失或只有占位符,说明 AI 爬虫无法抓取。
进阶做法:对比"浏览器看到的源码"和"curl 拿到的源码"。如果两者差异巨大,说明页面高度依赖 CSR,GEO 风险极高。
第二步:User-Agent 分层测试
AI 爬虫和搜索引擎爬虫使用不同的 User-Agent。你需要分别测试:
- Googlebot: Mozilla/5.0 (compatible; Googlebot/2.1)
- GPTBot: Mozilla/5.0 (compatible; GPTBot/1.0)
- ClaudeBot: Mozilla/5.0 (compatible; ClaudeBot/1.0)
- DeepSeekBot: DeepSeekBot/1.0
分别用这些 User-Agent 请求同一页面,对比返回内容。如果 Googlebot 能拿到完整内容而 GPTBot 只能拿到空壳,说明你的渲染策略对 AI 爬虫不友好。
第三步:结构化数据完整性检查
AI 爬虫不仅抓取纯文本,还会提取结构化数据。检查你的页面是否满足:
- 核心内容在 HTML 源码中直接可见,不依赖 JS 执行
- Schema.org 标记(JSON-LD)直接嵌入 HTML,而非通过 JS 动态注入
- title、meta name="description" 在服务端直接输出
- 关键数据(价格、库存、评分)在首次 HTML 响应中已存在
四、预渲染策略选型与落地(实战)
如果你的站点已经是 CSR 架构,全部重构为 SSR 成本过高,预渲染(Prerendering)是最务实的过渡方案。但预渲染不是"一键解决",需要根据场景选型。
方案一:构建时预渲染(SSG 化)
适用场景:内容更新频率低、页面数量可控(如企业官网、产品详情页)。
做法:在构建阶段用 Headless Chrome(Puppeteer/Playwright)遍历所有路由,生成静态 HTML。Next.js 的 output: 'export'、Nuxt 的 nuxt generate、Vue 的 prerender-spa-plugin 都属于此类。
- 优势:零运行时成本,CDN 可直接分发。
- 局限:不适合频繁更新的内容(如实时库存、动态价格)。
方案二:服务端按需预渲染(Prerender.io / Rendertron)
适用场景:老站改造、无法重构前端架构、需要兼顾 CSR 用户体验和 AI 爬虫抓取。
做法:在 CDN 或反向代理层拦截请求,判断 User-Agent。如果是 AI 爬虫或搜索引擎爬虫,将请求转发到预渲染服务,由 Headless Chrome 实时渲染页面并返回静态 HTML;如果是普通用户,返回原始 CSR 资源。
Nginx 配置示例(简化版):
location / {
set $prerender 0;
if ($http_user_agent ~* "GPTBot|ClaudeBot|PerplexityBot|DeepSeekBot|Googlebot") {
set $prerender 1;
}
if ($prerender = 1) {
rewrite ^/(.*)$ /render/https://your-domain.com/$1 break;
proxy_pass http://prerender-service:3000;
}
try_files $uri $uri/ /index.html;
}关键注意点:
- 预渲染服务的缓存策略需要与内容更新频率匹配,避免 AI 爬虫拿到过期内容
- 对需要登录态的页面,预渲染服务无法处理,这类页面应直接改为 SSR
- 预渲染增加了请求链路,需监控响应时间,避免超时导致 AI 爬虫放弃抓取
方案三:增量静态再生(ISR)
适用场景:高流量内容站、电商目录页,需要平衡实时性和性能。
做法:首次请求时 SSR 渲染并缓存,后续请求直接返回缓存的静态 HTML,同时后台异步更新。Next.js 的 ISR、Nuxt 的 isr 选项均支持。
- 优势:兼顾 SSR 的实时性和 SSG 的性能。
- 局限:首次更新有延迟(取决于 revalidate 时间)。
五、案例:xxx 电商平台的 GEO 可见性改造
xxx 电商平台(月活 300 万,SKU 超过 50 万)在 2025 年底发现,其品牌在 ChatGPT、Perplexity 等 AI 搜索中的引用率几乎为零。技术团队排查后发现,平台采用纯 React CSR 架构,商品详情页的核心信息(价格、规格、用户评价)全部通过客户端 API 请求加载。
诊断过程:
- 用 curl 模拟 GPTBot 抓取商品页,返回的 HTML 中只有 <div id="app"></div> 和加载动画,正文内容完全缺失。
- 检查 Search Console,发现 Google 收录正常——因为 Googlebot 执行了 JavaScript。这印证了"Google 能索引 ≠ AI 能抓取"。
- 对 Top 1000 高流量商品页进行批量测试,发现 100% 的页面存在 AI 爬虫不可见问题。
改造方案(分三阶段):
第一阶段(2 周):预渲染过渡
- 对商品详情页、分类页接入 Prerender.io 服务
- Nginx 层配置 User-Agent 判断,AI 爬虫和搜索引擎爬虫走预渲染链路
- 设置 4 小时缓存,平衡实时性和性能
第二阶段(4 周):核心页面 SSR 化
- 将商品详情页迁移至 Next.js App Router,使用 Server Components 直出核心内容
- 价格、库存等实时数据通过服务端 API 获取并嵌入 HTML
- 用户评价等非核心内容仍走客户端加载,但首屏必须包含摘要
第三阶段(持续):结构化数据补强
- 为所有商品页注入 JSON-LD 的 Product Schema
- 添加 FAQPage Schema 覆盖常见购买问题
- 建立自动化测试流水线,每次发版前用 AI Bot User-Agent 验证关键页面
结果:
- 改造后 3 个月,品牌在 ChatGPT 购物类查询中的引用率从 0% 提升至 12%
- Perplexity 的商品对比回答中,xxx 平台的产品信息出现频率提升 8 倍
- 商品页在 Google 的排名未受负面影响,部分长尾词排名反而上升(因为结构化数据更完整)
六、FAQ:JavaScript 渲染与 GEO 的常见问题
Q1:我们用了 Next.js,是不是就自动解决了 AI 爬虫抓取问题?
不一定。Next.js 支持 SSR,但也支持 CSR。如果你用 useEffect 获取数据、用客户端路由加载内容,AI 爬虫仍然看不到。必须确保关键内容通过 Server Components 或 getServerSideProps 在服务端完成渲染。
Q2:预渲染和 SSR 哪个更适合老站改造?
预渲染更适合作为过渡方案——它不需要改动前端代码,只需在 CDN/代理层配置。但长期看,原生 SSR 或 SSG 更干净、性能更好、维护成本更低。建议路线图:预渲染(立即见效)→ ISR/SSR(中期重构)→ SSG(长期稳定内容)。
Q3:动态内容(如实时价格、库存)怎么兼顾 AI 抓取和实时性?
核心策略:"服务端直出基础信息,客户端补充实时差异"。例如,服务端渲染时输出价格区间和"有货/无货"状态,客户端再通过 API 加载精确价格。这样 AI 爬虫能抓取到有效信息,用户也能看到实时数据。
Q4:AI 爬虫的抓取频率如何?需要像 SEO 一样做 crawl budget 优化吗?
目前 AI 爬虫的抓取频率远低于搜索引擎爬虫,且更聚焦于高权重页面。建议优先确保首页、核心分类页、Top 商品页/文章页对 AI 爬虫完全可见,而非追求全站覆盖。随着 AI 搜索流量增长,crawl budget 优化将成为 GEO 的新课题。
七、总结与行动清单
JavaScript 渲染策略在 GEO 时代不再是纯技术选型问题,而是"内容是否存在"的战略问题。Googlebot 的 JavaScript 执行能力给了团队一种虚假的安全感——"反正最终能索引"——但 AI 爬虫没有这种耐心。
行动清单:
- 本周内:用 curl 模拟 GPTBot/ClaudeBot 抓取你的 Top 10 页面,检查 HTML 内容完整性
- 本月内:建立 User-Agent 分层测试机制,纳入发版前的自动化检查
- 本季度内:对核心流量页面完成 SSR 化或预渲染改造
- 持续:监控 AI 爬虫日志,追踪 GPTBot、ClaudeBot 的抓取行为和响应状态码
记住:在 AI 搜索时代,"看不见"等于"不存在"。你的内容再优质,如果躺在 JavaScript 里等待执行,对 AI 爬虫而言就是一片空白。