AI Readable
← 全部文章

在 AI 抓取器眼里,你的页面可能是一个空壳

AI 抓取器只取初始 HTML、不执行 JavaScript。正文如果是客户端渲染的,它们看不到任何可引用的内容。

Google 能收录你的站,不等于 AI 能读到你的内容。

Googlebot 会渲染 JavaScript,而 GPTBot、ClaudeBot、PerplexityBot 拿到初始 HTML 就结束了。如果你的正文要等 useEffect 跑完才出现,它们看到的就是一个 <div id="root"></div>,别的什么都没有。

两者的差别从哪来

渲染 JavaScript 很贵:每个页面都要一个浏览器引擎。搜索引擎付得起这个成本,因为它要覆盖全互联网,可以排队慢慢渲染。AI 抓取器是在用户提问那一刻现抓的,它只取第一次响应拿到的东西,没时间替你执行前端。

这个差别在浏览器里看不出来。你自己看页面是好的,Google Search Console 里也是好的。只有原始 HTML 会暴露它。

自己查一遍

按抓取器的方式取一次,不带 JavaScript,只要响应:

curl -sL https://your-site.com/your-page | grep -c "<p>"

如果这一页你明知有十段正文,而结果是 0 或 1,问题就在这里了。顺手再看两件事:

  • 正文到底在不在(搜一句页面上独有的句子)
  • 挂载点里有什么(<div id="app">、<div id="root">、<div id="__next">)

挂载点是空的、正文也搜不到,那就是它了。

怎么修

方向是让内容出现在第一次响应里,而不是给它加一个兜底。按工作量从轻到重:

  • 静态生成。构建时就把内容渲染好。最理想,大多数营销页和博客都适用。
  • 服务端渲染。每次请求在服务端渲染。内容依赖请求参数时必须用这个,对抓取器同样可读。
  • 预渲染。用服务把 SPA 渲染成 HTML 给抓取器。应用改不动时的权宜方案,代价是多了一个会与主站漂移的系统。

<noscript> 不算修法。它有一点帮助,但抓取器需要的文字应该出现在页面里,而不是出现在一段给「已经关掉 JS 的浏览器」看的提示里。

用无 JS 视图工具可以直接看到自己的页面在抓取器眼里是什么样:正文剩下多少、挂载点是不是空的。

想看全貌而不只是一项,做一次完整评估:覆盖全部 32 条规则(包含渲染这一类),并给出按影响排序的修复清单。