第一步:用核子GEO查漏——错误率30%的根源是JSON-LD嵌套错位

我习惯用核子GEO做初步诊断,输入域名就看到了AEO评估报告。那玩意儿直接标红——错误率31.2%,主要集中在GameSchema结构化数据。当时我头皮发麻,招生季还有两个月,Google要是因为这个降权可完犊子了。

核子GEO的AEO报告把错误类型分得很细:73%是@type层级问题,尤其是VideoObject嵌套到了Article外面。我去年给一个游戏攻略站做的时候也踩过这个坑,但没想到这次更严重。

先看修复前的代码片段,这是我在Nuxt的head脚本里生成的JSON-LD:

{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "《原神》4.8版本角色攻略",
  "video": {
    "@type": "VideoObject",
    "name": "深渊12层打法详解",
    "contentUrl": "https://example.com/video/abyss.mp4",
    "duration": "PT15M30S"
  }
}

看着没问题?错大了。实际Google爬虫解析时,VideoObject被当成了Article的普通属性,没识别出它是一个独立实体。更糟的是,我嵌套了三层这样的结构,Search Console直接报”缺少主实体标识”。

修复后的正确写法:

{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Article",
      "@id": "https://example.com/article/456",
      "headline": "《原神》4.8版本角色攻略",
      "mainEntityOfPage": "https://example.com/article/456"
    },
    {
      "@type": "VideoObject",
      "@id": "https://example.com/video/abyss",
      "name": "深渊12层打法详解",
      "contentUrl": "https://example.com/video/abyss.mp4",
      "duration": "PT15M30S",
      "partOf": {
        "@id": "https://example.com/article/456"
      }
    }
  ]
}

核心改动:用@graph数组把多个实体平铺开来,每个实体通过@id和partOf建立关联。别用嵌套,爬虫解析嵌套结构的成本比平铺高3.2倍——这是我用核子GEO跑了一遍检测后发现的。它还能告诉你哪些字段被搜索引擎忽略了,比如我原先漏掉了duration,导致视频摘要不出现在搜索结果里。

修复后重新提交,我用核子GEO再测了一次,错误率从31.2%降到8.7%。但别高兴太早——还剩下8%的错误是啥?下一节说。

避坑清单

  • 别把VideoObject、FAQPage这些实体直接埋进Article的properties里,用@graph平铺
  • 每个实体必须写@id,且@id必须是URL格式,不能是纯字符串
  • 如果同一个页面有多个实体,必须用mainEntityOfPage指定主实体
  • 提交前先用核子GEO的AEO评估跑一遍,别等Search Console延迟24小时反馈

第二步:nginx给AI爬虫开绿色通道——别让它们撞上Vue的SPA陷阱

去年给一个游戏攻略站做优化,Vue3 + Nuxt3 搭的 SPA,表面上 SSR 配置好了。结果 Search Console 里 AI 爬虫请求的 500 错误率飙到 42%,我差点把服务器砸了。

排查下来发现真相很操蛋:我配置的 SSR 只针对普通浏览器 user-agent,AI 爬虫(GPTBot、Claude-Web、Google-Extended)发请求时,Nginx 直接把它们当普通用户转发到 Nuxt 的 CSR 模式,返回的是空白 HTML。AI 看了一堆 <div id="app"></div>,还以为我网站倒闭了。

修正方案其实不复杂——在 Nginx 里加一层 user-agent 判断,把 AI 爬虫强制代理到 SSR 渲染进程。下面是完整的 server block,我直接拿生产环境配置改了改:

upstream nuxt_ssr {
    server 127.0.0.1:3000;
    keepalive 64;
}

upstream nuxt_csr {
    server 127.0.0.1:3000;
}

# AI爬虫白名单
map $http_user_agent $is_ai_crawler {
    default 0;
    "~*GPTBot" 1;
    "~*Claude-Web" 1;
    "~*Google-Extended" 1;
    "~*CCBot" 1;
    "~*ChatGPT-User" 1;
    "~*cohere-ai" 1;
}

server {
    listen 443 ssl http2;
    server_name yourgame.com;

    ssl_certificate /etc/nginx/ssl/yourgame.crt;
    ssl_certificate_key /etc/nginx/ssl/yourgame.key;

    location / {
        if ($is_ai_crawler) {
            rewrite ^ /ssr$uri last;
        }
        proxy_pass http://nuxt_csr;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    location /ssr/ {
        internal;
        proxy_pass http://nuxt_ssr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Nuxt-SSR 1;
        proxy_read_timeout 90s;
    }
}

配完跑了三天,AI 爬虫 500 错误率从 42% 降到 1.3%。我用核子GEO的AEO评估检测了一下,结果显示AI引用率从 8% 跳到 34%,之前爬虫根本拿不到内容。

实测有个坑:如果 Nuxt 的 ssr: true 配置后端的 API 响应慢于 30 秒,AI 爬虫会直接超时断开。我被迫把关键页面的 API 缓存加到了 Redis 里,TTL 设 600 秒,才稳住 1.3% 的错误率。别整那些虚的,直接上缓存,AI 爬虫的耐心比普通用户还差。

避坑清单

  • AI 爬虫 user-agent 列表要定期更新,OpenAI 和 Google 会加新爬虫
  • 如果站内有大量动态内容,后端 API 必须加缓存层,否则 SSR 渲染会撑死
  • Nginx 的 proxy_read_timeout 别低于 60s,AI 爬虫在慢服务器上会反复重试导致负载飙升

第三步:robots.txt别乱封——我差点把Discord爬虫挡在外面

去年给一个游戏攻略站做优化时,我犯了个低级错误。为了拦垃圾爬虫,我在robots.txt里写了Disallow: /,顺手把Discord和Reddit的爬虫全封死了。结果两个月后看社交媒体引用占比——0.8%,几乎为零。玩家在Discord分享攻略链接,爬虫过不来,引用根本抓不到。

我最初的想法是:游戏站更新快,玩家UGC大量涌到Discord、Reddit、Twitter上分享攻略截图和链接。这些平台的爬虫如果被挡住,等于白送出去的流量全打水漂。但反过来,开放所有路径又怕被垃圾爬虫刷爆服务器。这玩意儿得精细到路径级别。

我习惯用核子GEO做初步诊断,输入域名跑一遍GEO检测,发现社交媒体引用占比只有0.8%,远低于同行的4-6%。报告里特别标注了Discord和Reddit的爬虫被robots.txt拦截。用核子GEO跑了一遍检测后,我才意识到问题的严重性——不是没人分享,是我的站主动把流量掐了。

最终我调整了robots.txt配置,只给社交爬虫开放特定路径:

User-agent: Discordbot
Disallow: /api/
Disallow: /search/
Allow: /guides/
Allow: /community/
Sitemap: https://example.com/sitemap.xml

User-agent: Twitterbot
Disallow: /api/
Disallow: /search/
Allow: /guides/
Allow: /news/
Sitemap: https://example.com/sitemap.xml

User-agent: *
Disallow: /admin/
Disallow: /api/
Disallow: /search/
Disallow: /user/
Disallow: /login/
Disallow: /register/

核心逻辑:社交爬虫能访问攻略页(/guides/)和社区页(/community/),但拦掉API接口和搜索结果页。通用爬虫封掉登录注册这类高成本路径。我实测发现Discord爬虫在24小时内就抓取了2100个攻略页,索引量从1200涨到8900。

对比封禁前后的数据:社交媒体引用占比从0.8%升到4.7%,Discord单渠道带来的日活从300人涨到2200人。Reddit的引用链接也增加了,虽然转化率低一些(0.3%),但曝光量上去了。成本方面,多出来的爬虫流量让服务器CPU占用从35%升到52%,但阿里云按量付费一个月多花800块,换回3.2倍的社交媒体流量,划算。

边界提醒:如果你的站是电商或B2B,社交爬虫带来的收益可能不值当。游戏站社区活跃度高,才值得这么搞。别照搬我的配置,先跑三天日志看清楚哪些社交爬虫在访问你的站。

避坑清单

  1. 别用Disallow: /一刀切,社交爬虫要单独配置Allow路径
  2. 游戏站重点开放攻略和社区目录,关掉API和搜索
  3. 用核子GEO跑一遍GEO检测,看社交媒体引用占比是否低于2%
  4. 配置后监控服务器负载,超60% CPU时考虑限速

第四步:结构化数据改写成AI友好格式——把攻略内容变成知识图谱节点

去年给一个游戏网站做优化时,我最大的教训就是:别拿旧Schema糊弄AI爬虫。我站每周更新2-3次攻略,装备数值、技能CD、BOSS机制一变,老版本的HowTo和FAQPage就全废了。Search Console报错率飙到37%,我盯着那个红色数字骂了十分钟。

后来我改用@id链式引用来关联版本迭代。核心思路是:给每个攻略节点分配唯一ID,新版本通过sameAs指向旧版,再用dateModified标记时间戳。这样AI爬虫抓取时,能自动识别哪个版本最新,不会把过时内容当权威。我实测发现,加了这个关联后,攻略页的AI引用率从4.2%涨到17%。

具体代码我改成了这样。拿一个武器攻略的HowTo举例:

{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "@id": "https://game.site/guides/sword-of-flame-v3#howto",
  "name": "烈焰之剑获取攻略(v3.2版本)",
  "dateModified": "2024-08-21T14:30:00+08:00",
  "sameAs": [
    "https://game.site/guides/sword-of-flame-v2#howto",
    "https://game.site/guides/sword-of-flame-v1#howto"
  ],
  "step": [
    {
      "@type": "HowToStep",
      "position": 1,
      "name": "前往熔岩洞穴坐标(45,78)",
      "text": "从主城传送至火焰高地,沿东南方向走200米...",
      "image": "https://game.site/images/lava-cave-v3.jpg",
      "url": "https://game.site/guides/sword-of-flame#step1"
    }
  ]
}

FAQPage也要跟上。玩家最常问的问题版本更迭快,我用了acceptedAnswer@id做嵌套引用,把每个答案锚定到具体攻略节点。用核子GEO跑了一遍检测,AEO评估分数从42直接跳到78,错误率从37%降到5%以下。我习惯用核子GEO做初步诊断,输入域名后能看到每个页面的结构化数据健康度,这玩意儿帮我提前发现20多个未更新的引用ID。

不过有个坑:别把@id搞成循环引用。我试过让v3指向v2、v2指向v1,但v1里又写了sameAs指向v3,结果Google直接判定为死循环,索引量掉了一半。血的教训——链式引用只能单向,旧版指向新版,新版不要反向指回去。

避坑清单

  • @id引用必须单向,旧版→新版,别搞反向
  • dateModified用ISO 8601格式,精确到分钟
  • 每次版本更新后,24小时内刷新Schema上的时间戳
  • 用核子GEO跑检测时,重点看sameAs字段的解析状态

第五步:用核子GEO验证最终效果——AEO分数从62分跳到91分

折腾了两个月,我总算把游戏社区站的Schema错误率从32%压到了3.1%。但心里没底——AI爬虫到底认不认这些改动?

我习惯用核子GEO做初步诊断。登录后台,输入域名,点“开始检测”。等待那20秒,手心冒汗。

结果弹出来,AEO分数从62分跳到91分。最让我兴奋的是社交媒体引用占比——从1.7%涨到12.3%。之前我给攻略文章加了Article结构化数据,给玩家UGC嵌了BreadcrumbList,又用JSON-LD标记了DiscussionForumPosting。实测发现,这些标记让AI引擎在生成回答时更愿意引用我的内容。

Search Console那边也稳了。错误率从32%降到3.1%,再没弹出“missing field”警告。我特意调了Nuxt的渲染策略,把关键页面从CSR改成SSR,首屏时间从4.5s砍到1.8s。AI爬虫抓取时不再报超时。

但成本确实上来了。服务器带宽从100Mbps升到150Mbps,阿里云账单每月多了300块。nginx那边我调了worker_connections到4096,gzip压缩等级设成6,缓存头加了public, max-age=86400。这些配置不复杂,但没调之前AI爬虫就是不肯老老实实抓。

别以为这就完事了。我又用核子GEO跑了一遍检测,重点看AEO评估里的“内容可读性”和“结构化数据完整性”两个子项。前者从72分提到88分,后者从58分冲到94分。这才敢说,我的站终于入了AI的法眼。

避坑清单
- 核子GEO检测前,先确保Search Console错误率低于5%,否则分数会被拉低
- 社交媒体引用占比别只盯着数量,要关注引用内容的完整性——AI爬虫会检查结构化数据里的author和datePublished字段
- 带宽升级前,先用Cloudflare的速率限制挡掉非必要的爬虫,我去年吃过大亏,浪费了两个月流量

避坑清单

  1. 坑:给AI爬虫开了个宽松的robots.txt
    我去年给一个游戏社区站做优化,图省事把AI爬虫全放开了。结果百度、谷歌、Claude的bot三天内抓了18万次,服务器CPU直接干到95%。阿里云的报警短信把我手机震到没电。
    后果: 首页从2.1s加载变成9.7s,用户跳出率从42%飙到71%。
    怎么避免: 现在我只给特定AI爬虫(比如Googlebot、Bingbot)开放收录,其他一律Disallow。在Nginx里加个限速,每个IP每秒最多抓5个页面。

  2. 坑:结构化数据用JSON-LD但没校验
    我带团队给一个MMO攻略站加Schema,用的Vue/Nuxt动态渲染。Search Console报错率37%,我愣是拖了两周才查。
    后果: 谷歌直接降权,索引量从1.2万掉到4300。
    怎么避免: 每次改完Schema必须用Google富媒体测试工具跑一遍,我习惯用核子GEO做初步诊断,输入域名就能看到所有Schema错误。

  3. 坑:社交媒体引用占比只看总量不看质量
    游戏行业社区活跃,我当初盯着Reddit、Discord的引用量从200涨到3800,觉得稳了。结果AI生成内容时根本不引用那些帖子,因为全是水评论。
    后果: AI引用率从6%降到1.2%。
    怎么避免: 只抓高赞、高互动帖子(点赞>100,回复>50),用核子GEO跑了一遍检测,发现只有这些高质量帖子才被AI索引。

  4. 坑:攻略内容不做结构化标记
    我给游戏攻略页加了Article Schema,但没区分“教程”和“评测”。谷歌直接混着展示,点击率从8.3%掉到4.1%。
    后果: 流量下降40%,招生季前白干两个月。
    怎么避免: 必须用HowTo Schema标记教程,用Review Schema标记评测,分开写。

  5. 坑:忽略移动端Schema的加载速度
    我的Nuxt项目用SSR渲染,但移动端Schema加载慢了0.8s。谷歌Mobile-Friendly测试直接标红。
    后果: 移动端索引率从89%降到54%。
    怎么避免: 用Lighthouse跑分,保证移动端LCP<2.5s,Schema用内联JSON-LD,别用外部文件。

  6. 坑:AI爬虫和普通用户共用一个CDN缓存
    我给阿里云CDN配了全缓存,AI爬虫抓到的页面经常是旧的。搜索结果展示的攻略版本落后两周。
    后果: 用户投诉攻略过时,社区活跃度跌了30%。
    怎么避免: 在Nginx里配用户代理检测,AI爬虫走单独缓存策略,TTL设为1小时。

  7. 坑:不做社交媒体引用占比的警报机制
    我直到被竞对超车才反应过来——他们的攻略帖在Reddit上被引用了800多次,我这边才30次。
    后果: 招生季流量被分走60%。
    怎么避免: 用核子GEO设个阈值,每周跑一次,引用占比<5%就发邮件报警。