AngularJS 百度SEO避坑:单页应用收录指南
为什么 AngularJS 站点在百度总是收录难
做过单页应用的同行大概都遇到过这样的尴尬:页面在浏览器里跑得很顺,内容也很丰富,可在百度里搜半天就是找不到自己的站。打开网页源代码一看就明白了——AngularJS 把大部分内容交给浏览器端的 JavaScript 去渲染,首屏 HTML 里往往只剩一个空壳和几行脚本引用,真正的正文要等脚本执行完才出现。
问题就出在这里。搜索引擎抓取的是最初返回的那份 HTML,如果它拿到的是空壳,自然没什么可收录的。这也是很多 AngularJS 项目上线很久、百度却迟迟不给排名的根本原因。
先摸清百度爬虫的脾气
相比之下,谷歌这些年对 JavaScript 的执行能力提升明显,能渲染出不少 SPA 页面;但百度爬虫在这方面一直偏保守。虽然百度官方也提到过具备一定的 JS 解析能力,可实际抓取复杂前端框架时仍然不够稳定,渲染时机、资源加载、异步接口这些环节任何一处卡住,内容就抓不全。
所以对国内站点来说,与其赌百度能不能跑通你的脚本,不如主动把渲染好的 HTML 直接喂给它。这是思路上的关键转变:让爬虫拿到成品,而不是让它自己下厨。
让页面被百度看见的几种做法
服务端渲染或预渲染
最彻底的办法是服务端渲染(SSR)。如果用的是较新的 Angular,可以上 Angular Universal,在服务器端先把首屏 HTML 生成好再返回;老的 AngularJS 1.x 没有官方 SSR 方案,通常借助预渲染(prerender)来实现——用无头浏览器把每个路由跑一遍,生成静态快照,再针对爬虫返回这些快照。这种“动态渲染”对改造成本敏感的老项目比较友好。
URL 和路由要干净
尽量启用 HTML5 的 pushState 模式,让地址变成 /article/123 这样的常规路径,而不是带 # 号的 hashbang。百度对哈希路由的支持很弱,# 后面的内容往往被直接忽略。同时要保证每个页面都有独立、可直接访问的 URL,别让内容藏在只能点击才触发的状态里。
把 TDK 和结构化数据补齐
单页应用切换路由时,标题和描述如果不跟着变,所有页面在百度眼里就长得一模一样。要用相应机制在每次路由变化时动态更新 title、description、keywords,让每个页面都有自己的身份。有条件的话再补上结构化数据,帮助百度理解内容类型。
上线后别忽略的运营动作
- 在百度搜索资源平台完成站点验证,主动提交 sitemap 和链接;
- 用平台自带的抓取诊断工具,看看百度实际拿到的 HTML 到底是不是渲染后的版本;
- 保证服务器响应速度和移动端适配,这两点对排名的影响一直不小;
- 新内容发布后配合主动推送接口,缩短被发现的时间。
一点实战心得
AngularJS 做百度 SEO,难点从来不是技术多高深,而是要先认清“前端渲染”和“搜索引擎抓取”之间的错位。把首屏内容尽早以 HTML 形式交付,把 URL 和 TDK 这些基础打扎实,再借助资源平台持续观察抓取情况,收录和排名通常会慢慢跟上。别指望一步到位,SEO 本就是个需要耐心迭代的活儿。