如果你的网站依赖客户端渲染(CSR),比如用React、Vue写单页应用,那AI爬虫可能压根儿看不到你的正文。因为像GPTBot、Google-Extended这类爬虫,它们只请求初始HTML,不会去执行那些JS代码。所以你想知道爬虫能不能读到内容,直接模拟它们的请求看一眼就清楚了。比如打开终端,用curl带上Googlebot的User-Agent去抓你的页面,再grep一下正文关键词,要是什么都没拿到,那就说明爬虫看到的是一片空白。这个动作很简单,但能帮你快速定位问题。
为什么客户端渲染对AI爬虫不友好
AI爬虫的设计跟普通浏览器不一样。普通浏览器打开页面会执行所有JS,然后渲染出完整DOM;但AI爬虫的目的只是抓取文本信息,所以它们通常只接收服务器返回的初始HTML,不去跑JS。如果你的网站是用CSR生成的,初始HTML里可能只有一个空的容器节点,真正的正文全靠JS动态填充。这种情况下,AI爬虫拿到的就是那个空壳,正文内容等于没发出去。很多人误以为爬虫会像浏览器一样渲染,其实大部分都不行——只有Google的Smart Crawler等少数会执行部分JS,但AI爬虫一般不会。所以别指望爬虫能自己解析你的JS,得主动给它们喂煮熟的内容。
最直接的测试方法:用curl模拟爬虫
要测试AI爬虫能不能读你的正文,最直接的办法就是用命令行模拟它们。拿一张AI爬虫的User-Agent清单(比如Googlebot、GPTBot、Claude-Web等),然后挨个试试。命令大概长这样:curl -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://your-site.com。把返回的HTML存到一个文件里,然后搜索你的正文内容,看有没有。要是搜不到,就说明爬虫拿不到。你可以对比一下浏览器里看到的页面源码——CSR的页面浏览器源码往往也是空的,这也是为什么有些SEO工具会提醒你页面是空的。这个测试不需要任何工具,一个终端就搞定,但要注意:你要确保用的UA是AI爬虫的真实UA,别用错了。
进阶测试:用headless浏览器渲染后对比
如果你觉得curl太粗暴,或者想看看爬虫到底渲染到了什么程度,可以用headless浏览器(比如Puppeteer或Playwright)模拟爬虫抓取。你写个脚本,在无头模式下访问页面,然后截图或者导出HTML,就能看到爬虫“眼中”的世界。另外你还可以做一个对比:先不执行任何JS,直接保存初始HTML;再执行完所有JS后保存最终HTML,两个文件diff一下。如果初始HTML里没有正文,而最终HTML里有,那就说明你的内容完全依赖客户端渲染。这时候你就得想办法给爬虫提供预渲染版本了。这个方法稍微复杂点,但能帮你精确诊断问题出在哪个环节。
常见的修复方案:动态渲染或SSR
如果测试发现爬虫确实拿不到正文,那就是数据没被渲染到服务器端。解决思路有两个方向:一是用动态渲染(Dynamic Rendering),二是直接把页面改成SSR(服务端渲染)或SSG(静态生成)。动态渲染的意思是,当检测到请求来自爬虫时,服务器先调用一个无头浏览器帮你把页面渲染好,再把渲染后的HTML返回给爬虫。普通用户访问的仍然是原来的CSR页面,体验不变。这个方案比较适合已经上了CSR的老项目,改造成本低。但你要注意配置:必须正确识别爬虫的UA,并且做好缓存,不然服务器压力会很大。另一个方向是改架构,用Next.js、Nuxt.js这类框架做SSR,让所有用户都拿到完整页面。这个一劳永逸,但前期工作量大。不管用哪种方案,改完之后都得用刚才的curl命令再测一遍,确认正文能正常返回。
常见误区与边界条件
一个常见的误区是:觉得只要用了React的SSR就没问题。实际上SSR如果没处理爬虫UA,或者动态渲染没配好,爬虫可能还是拿到老数据。另外,不同AI爬虫的User-Agent可能不一样,甚至有些爬虫会伪装成普通浏览器。所以多测几个UA,看看返回内容是否一致。还有一个边界条件:如果你的页面内容是通过用户交互才加载的(比如点击按钮后弹出内容),那即使SSR也不会自带这些内容,爬虫永远拿不到。这种场景下你得考虑把关键内容直接放在初始HTML里,或者用结构化数据标记。总之,测试是关键,没有一劳永逸的方案。