AJAX 加载的内容能不能被抓取,取决于它以什么形式出现在页面上,而不是取决于它是不是 AJAX。用脚本插入的标准链接、抓取时不需要用户交互就能看到的内容、用真实状态码和持久地址,都可被抓取;靠点击事件触发的跳转、靠滚动才出现的内容、不落地地址的片段,全部不行。更关键的是:早期的 AJAX 抓取方案已被官方废弃,不存在"给爬虫一个特殊入口"这种取巧空间。

官方对 AJAX 抓取的现状说明
Google 关于修复 JavaScript 抓取问题的文档在"不要用地址片段加载不同内容"一节里写得很直接:AJAX 抓取方案自 2015 年起已经废弃,不能依赖地址片段配合 Googlebot 生效,文档推荐在单页应用里用 History API 根据 URL 加载不同内容。这条是判断 AJAX 方案可行性的分水岭:凡是靠地址片段区分视图的设计,都要改。
同一份文档还有两条常被忽略的约束。一是状态保留:渲染服务每次加载 URL 的方式与普通浏览器相同、也会跟进重定向,但不会跨页面保留状态——本地存储和会话存储会被清空,HTTP Cookie 同样会被清空。所以"首次访问拉一次数据、之后从存储里读"的设计在抓取侧是空的。二是连接方式:Googlebot 用 HTTP 请求取内容,不支持 WebSocket 或 WebRTC,需要这类交互的模块要有 HTTP 回退。
链接为什么是第一个要修的
抓取阶段解析的是 HTML 里链接的 href 属性。Google 关于链接的说明把边界写得很窄:Google 一般只能抓取带 href 属性的 <a> 元素;其他格式大多不会被解析提取,靠脚本事件充当链接的写法无法被可靠提取 URL。文档同时给了动态插入这一条出路——用 JavaScript 插入链接可以,前提是仍然使用标准标记;带 href 的元素即使挂着 onclick 也仍在可解析一侧。
所以 AJAX 页面修链接的标准很简单:关掉 JavaScript 之后,这批内容还能不能通过点链接到达。到不了就是缺标准链接,到得了就不用动链接层。内容本身的判定标准在JavaScript 搜索优化说明里:内容不出现在渲染后的 HTML 里,Google 就无法索引它。
怎么做:四步改造成可被抓取
- 把片段路由换成 History API。官方推荐的做法,理由就是地址片段那一套依赖的抓取方案已经废弃。
- 给每个状态一个持久唯一地址。用绝对序号,不用相对量。
- 补上标准链接。把靠点击事件触发的跳转改成带
href的元素,地址顺次连起来。 - 用接口取数据时留 HTTP 回退和特征检测。官方建议对关键能力做特征检测并提供回退或 polyfill;请求失败要有明确处理,不要让页面停在空白状态。
WordPress 站上前台取数据通常走 REST API。官方手册说明这套接口通过收发 JSON 对象交换数据,是区块编辑器的基础,同时强调它只提供内容数据访问,主题模板那部分不在其中。换句话说,正文能从接口取到,不代表页面结构、导航和页脚也能取到,后者得由模板层负责,这一步最容易漏。
| 检查项 | 现在的样子 | 要改成 |
|---|---|---|
| 地址形态 | 带片段或没有地址 | 每个状态一个持久地址,用 History API 同步 |
| 内部跳转 | 靠点击事件 | 带 href 的标准元素,顺次连接 |
| 内容位置 | 交互后才出现 | 进入视口即加载,不依赖用户动作 |
| 异常处理 | 请求失败停在空白 | 按官方建议做 HTTP 回退与特征检测 |
哪些场景不在这个问题范围内
有几类情况不用按这套改。纯后台的局部交互,比如筛选面板、下拉搜索、页内选项卡——这些内容不承担被搜索找到的任务。以及本来就服务端输出完整、只是顺手用 AJAX 做增强的页面,正文和链接本来就合格。收藏夹、购物车这类需要登录的地址也不在讨论里:官方的处理方式是用有意义的状态码表达,比如登录后才能访问的页面用 401。
边界有三条。第一,官方从未公布过渲染等待的时间上限,也就没有"渲染超过几秒就放弃"这种阈值。第二,官方没有公布过 AJAX 页面的抓取配额或优先级规则。第三,用 JavaScript 注入规范地址或 robots meta 标签官方是允许的,但文档也写了一处陷阱:遇到 noindex 时可能跳过渲染与脚本执行,所以靠脚本把 noindex 改成可索引可能不按预期生效——需要可索引的页面,初始代码里就别放 noindex。
核对顺序建议这样排
验证工具官方在两份文档里给的是同一套:结构化数据测试工具与网址检查工具,能看到加载的资源、控制台异常和渲染后的 DOM。链接文档还给了一条:如果锚文本是用 JavaScript 插入的,用网址检查工具确认它出现在渲染后的 HTML 里。
建议的核对顺序:先在浏览器里禁用 JavaScript 打开页面,看核心内容还在不在、站内链接还能不能点通;再确认几个 AJAX 区块是不是必须交互才出现;然后用网址检查工具测两三个地址,确认渲染后 HTML 里有内容和标准链接;最后翻服务器访问日志,看接口地址和目标页面各自有没有被请求过。日志这步能分清"接口没被请求"和"请求了但内容没落到 HTML"。接口依赖查一遍,为 SEO 关闭 WordPress REST API?先查编辑器和前台依赖里的依赖核对顺序可以直接借用;同一页里这类区块放在什么位置也有讲究,链接上下文为什么重要:同一页不同位置差别在哪讲的是位置侧,canonical 和外链指向的 URL 有什么关系讲的是地址侧,两条都得先对齐再动改造。