你是不是也试过:页面做得挺炫,用户点哪加载哪,结果搜“我的网站”——首页都排不进前几?不是流量差,是 Google 根本没看见你写了啥。

别怀疑自己写的内容,问题大概率出在 AJAX 加载那一步。它让页面变快了,却悄悄把搜索引擎关在了门外。

为什么你的 AJAX 网站像个“隐形人”

AJAX 让用户体验飞起,但搜索引擎爬虫不是浏览器,它不会乖乖等你执行 JavaScript。

爬虫发请求,服务器返回的往往是空壳 HTML,里面的数据全靠 JS 异步拉取。爬虫看不到内容,自然以为你页面是空的。

我见过一个电商站,产品列表全是 AJAX 加载,上线三个月,流量几乎为零。老板翻着后台数据直摇头:“开发投了十几万,结果搜索引擎根本不鸟我。”

核心就两点:

  • 爬虫要么不执行 JS,要么只跑一小段,根本等不到数据回来;
  • AJAX 请求的 URL(比如 /api/products)压根没被收录,连入口都没有。

这不是爬虫偷懒,是你没给它能看懂的“说明书”。

3个把AJAX内容“喂给”爬虫的实战方法

方法1:服务端渲染(SSR)—— 最彻底的方案

SSR 就是在服务器端跑一遍你的页面逻辑,生成带真实数据的完整 HTML,再发给爬虫。它拿到的就是“成品”,不用拼、不用等、不用猜。

我用 Next.js 帮一个内容站改过。之前 AJAX 加载的文章列表,Google 只抓到了首页和几篇老文章。改成 SSR 后,新发布的文章当天就被收录,抓取量明显提升。代价是得动后端或框架逻辑,小团队可能要多花几天时间。但如果你靠搜索引流,这一步绕不开。

方法2:动态渲染(Dynamic Rendering)—— 偷懒但有效

动态渲染相当于给爬虫开个“快捷通道”:检测到是 Googlebot 或 Bingbot,就返回预渲染好的 HTML;普通用户还是走原来的 AJAX 流程。

工具用 Puppeteer 或 Rendertron 就行,部署在自己的服务器上。我在一个旅游预订站试过,原来搜索页完全不被收录,加完动态渲染后,两周内核心页面陆续出现在搜索结果里。注意:这需要额外搭个渲染服务,但不用改业务代码。

方法3:History API + 静态回退 —— 适合小改动

如果你的 AJAX 是靠哈希跳转控制的(比如 #/post/456),把它换成 History API 生成真实路径(比如 /post/456)。关键是:这个路径必须能被服务器直接响应,返回含内容的 HTML——哪怕 JS 关了也能打开。

有个独立博客作者就这么干的。他把每篇帖子的评论区 AJAX 请求,对应到一个独立 URL(如 /post/456/comments),并让 Nginx 直接返回静态 HTML 片段。爬虫一扫就抓到了,他自己都没怎么改前端。

抓取失败?先检查这3个地方

1. 爬虫模拟工具骗不了自己

别信“应该没问题”。打开 Google Search Console 的“URL 检查”工具,输入你最想被收录的 AJAX 页面,点“测试实时 URL”。如果预览里一片空白,或者只看到 loading 动画,那就是实锤了。

Screaming Frog 也可以切到 JavaScript 渲染模式跑一遍,效果更接近真实爬虫。我帮客户查过,对方坚持说“我们做了预加载”,结果一跑 GSC,页面正文全是空 div。

2. robots.txt 和 noindex 是隐藏杀手

开发时图省事加的 noindex,上线后忘了删;或者 robots.txt 里顺手写了 Disallow: /api/,结果 AJAX 数据接口全被拦在外面。

真有团队这么干过:他们把所有内容都从 /api/v1/posts 拉,而 robots.txt 正好屏蔽了 /api/。爬虫连数据源都碰不到,当然抓不到内容。去翻翻你的 robots.txt,重点看看有没有误伤的路径。

3. 检查是否被“软屏蔽”

有些网站在 CDN 或 WAF 层做了限流,对非浏览器 User-Agent(比如 Googlebot)直接返回 503 或 429。看起来是“服务器忙”,其实是被悄悄拒之门外。

用终端跑一句:

curl -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://你的网站/某页面

如果返回的是空页、错误码,或者只有骨架 HTML,那就得找运维看看规则了。

真实踩坑:一个日活几万的论坛怎么救回来的

2022 年,我接手一个技术论坛,日活稳定在几万,但 SEO 几乎为零。查了一圈发现:帖子列表、用户主页、甚至搜索结果页,全靠 AJAX 渲染。Google 只抓到了首页,点进去全是“未找到内容”。

我们没全盘重做,只做了两件事:

  • 给帖子详情页加上 SSR,确保每个 /post/xxx 都能返回带标题、正文、标签的完整 HTML;
  • 对搜索页启用动态渲染,用 Puppeteer 把关键词搜索结果提前渲染成静态 HTML 返回。

前后花了三周,上线后一个月,核心帖子页收录率从几乎为零涨到八成以上,搜索流量也明显提升。老板请吃火锅那天,还特意问我:“下次能不能先改搜索页?用户找内容最难。”

关键不是一步到位,而是先挑最影响搜索体验的页面下手——比如用户最常搜、最常点进来的那几个 URL。

今天就能执行的3个步骤

  1. 打开 Google Search Console,选一个你最在意的 AJAX 页面(比如产品页或文章页),点“测试实时 URL”,看右侧预览里有没有实际文字内容。没有?说明爬虫现在也看不到。

  2. 用 cURL 模拟 Googlebot:在终端粘贴这句(把网址换成你的):

    curl -A "Googlebot" https://your-site.com/product/123
    

    回车后看返回的 HTML 里,有没有商品标题、描述、价格这些关键信息。如果没有,就是服务端没给爬虫“真货”。

  3. 挑一个页面手动改一次:比如你有个 /blog/abc 页面,现在靠 AJAX 加载正文。今天就把它改成:服务端直接把正文塞进 HTML 的 <main> 里,JS 只负责增强交互(比如点赞、展开评论)。改完立刻在 GSC 提交该 URL。如果两天后能在“覆盖率”里看到状态变成“已编入索引”,你就摸到门道了。