你那个炫酷的SPA网站,上线好几天了,百度搜索框里搜自家品牌名——首页都冒不出来。别慌,不是你代码写得差,是百度蜘蛛压根没看清你页面里到底写了啥。

我去年帮三个客户折腾这事,全卡在收录这关。不是技术不行,是踩坑踩得太准:以为JS渲染早没问题了,结果百度蜘蛛路过你的页面,跟进了个空房间。

为什么百度蜘蛛看到你的SPA就像瞎子?

百度蜘蛛本质是个“不点鼠标”的浏览器。它不会执行JavaScript,也不会等Vue或React把页面一点点拼出来。它打开index.html,扫一眼,发现里面只有几个空<div>、一个<div id="app"></div>,然后默默关掉页面,转身就走。

2019年后百度确实加了JS渲染能力,但实测下来,只对极简的SPA有效——比如单页、无嵌套路由、没调用复杂API的那种。你用Vue Router做了动态路由,组件嵌套三四层,再配上权限守卫和懒加载?百度蜘蛛大概率看两眼就放弃。

我之前接手一个企业官网,Vue3 + Pinia + 路由守卫全齐,上线三个月,百度站长平台里蜘蛛天天来,抓回来的页面源码里连标题都是空的。首页勉强能收录,剩下二十多个产品页,全是“未收录”。

4个被验证过的百度收录策略

策略1:预渲染(Prerendering)——最省事但有限制

预渲染就是在打包时,提前把每个路由对应的HTML“快照”生成好。百度来爬的时候,Nginx直接返回这个静态HTML,不碰JS,不等渲染,秒出内容。

我用的是 prerender-spa-plugin,Webpack构建阶段加几行配置:列出所有要收录的固定路径(比如 /products/a/about),插件会起个无头浏览器,挨个访问、截图式保存HTML。

效果立竿见影。那个卡了三个月的企业站,加完预渲染部署上线,一周后百度收录从1页跳到十几页。

但它真不适合所有场景:如果URL带用户ID或文章ID(比如 /user/123),你就没法提前预生成;路由一过百,构建时间会明显变长,CI流程也容易卡住。

策略2:服务端渲染(SSR)——效果好但成本高

SSR是让服务器扛起渲染任务:用户或百度蜘蛛一请求,Node服务当场把Vue/React组件跑一遍,吐出完整HTML再返回。

我用Nuxt3重构过一个B2B行业站,开SSR后,新页面发布两小时内就被百度抓走,收录量稳定增长,不再卡在首页。

代价也很实在:服务器CPU占用翻了几倍,部署要多维护一套Node服务,有些前端逻辑(比如window对象、localStorage)得加判断才能跑通。要是项目已经上线半年、代码全按SPA写的,硬切SSR,开发同学可能要熬两个通宵改useMountedonServerPrefetch

策略3:动态渲染(Dynamic Rendering)——百度特供版

核心就一句话:人看SPA,百度看HTML快照。

靠Nginx或Node中间件识别User-Agent。只要检测到Baiduspider,就转发请求到预渲染服务(比如rendertron),返回静态HTML;其他所有流量,原样走你的SPA。

配置不难:Nginx加个if判断,再配个上游代理,半天就能跑通。不用动业务代码,也不影响用户首屏速度。

我帮朋友公司上这套方案时,他们那个半年没更新收录的官网,一个月内可收录页面数明显提升,后台数据曲线终于开始往上走了。

策略4:用好百度搜索资源平台的推送接口

技术铺好了,还得主动喊百度:“这儿有新内容!”不然它可能几个月都不来翻你家后院。

百度搜索资源平台提供三种方式:

  • 主动推送(Submit):发个HTTP请求,把URL塞给百度
  • Sitemap:提交一个XML地图文件
  • 手动提交:后台一个个粘贴URL(适合页面少的新站)

实测下来,主动推送配合SSR或动态渲染,见效最快。我们一般在CMS发布文章、运营同学上线活动页后,自动触发一次推送。

写法很简单:用curlaxios POST到百度接口,带上URL和token就行,不用传全文,百度自己会去抓。

一个容易忽略但致命的问题:页面跳转

SPA为了丝滑体验,常用history.pushState或hash路由做无刷新跳转。问题来了:百度蜘蛛不会“点菜单”,它只认URL。你导航栏点来点去,地址栏变了,但蜘蛛只记得第一次访问的那个链接。

真实案例:一个用Vue Router做的官网,导航菜单全是<router-link>,点击后内容切换,URL也变。结果百度只收录了//about,其他页面在站长平台里全标“未收录”,点进去看抓取结果,源码里还是首页的内容。

解法很朴素:确保每个有意义的URL,服务端都能返回一个可用的HTML。Nginx配置里加一行try_files $uri $uri/ /index.html;,让所有路由兜底到index.html,再交由前端路由接管。至少不会返回404,给百度留个进门的机会。

3个需要避开的坑

坑1:懒加载没留“后门”

图片、模块用懒加载很正常,但别忘了百度蜘蛛不会滚屏幕。如果你的SEO关键内容(比如产品标题、核心参数)藏在懒加载组件里,又没做任何降级,那蜘蛛真就看不见。

补救办法有两个:给关键区域加<noscript>兜底内容;或者干脆在服务端就把这部分内容直出,前端再接管交互。

坑2:动态渲染服务成了单点故障

你搭了个rendertron服务专门伺候百度蜘蛛,结果某天它内存爆了、进程挂了,而你没设监控也没配自动重启——那接下来几天,百度来的全是空白页。站长平台里收录量断崖下跌,你还以为是算法调整。

建议加个简单的健康检查脚本,每5分钟curl一下渲染服务,挂了就钉钉告警,顺便自动拉起进程。

坑3:移动端体验稀烂还指望收录

百度早就切到移动优先索引了。它现在主要用手机UA抓取、用手机端快照做排名。你SPA在iPhone上打开卡顿、按钮小得戳不准、字体糊成一片……百度蜘蛛不仅看得费劲,还会直接打低分。

别光看PC端。今天顺手用Chrome DevTools切到“Mobile”模式,打开你的首页,看加载是否顺畅、文字是否可读、按钮是否够大。Lighthouse跑个分,60分以下,先优化再谈收录。

今天就能执行的1个操作步骤

如果你现在用的是纯前端SPA(没SSR、没预渲染、也没动态渲染),今天下班前花15分钟做这件事:

打开【百度搜索资源平台】(就是你每天登录的那个站长后台),进左侧菜单「资源提交」→「主动推送」,复制你网站所有已上线页面的URL(比如首页、关于我们、联系方式、4个主打产品页),一行一个,粘贴进推送框,点提交。

同时顺手点一下顶部导航的「抓取诊断」→「robots.txt检测」,看看有没有哪条规则误写了Disallow: /或者把/products/整个目录屏蔽了。如果有,立刻删掉或改成更细粒度的限制。

这一步不会让你明天就霸榜,但它能让百度明确知道:你这个站活着,有内容,值得再来瞧瞧。后面要不要上预渲染、怎么配Nginx,咱们一步步来。