资讯动态

Hexo博客百度收录优化:sitemap与主动推送全攻略

发布时间:2026/10/13 14:08:03 来源:尧图企业网站定制
1. 先搞清楚百度到底是怎么收录你的 Hexo 博客的1.1 搜索引擎收录的两条路径很多朋友把 Hexo 博客部署上线之后第一件事就是去百度搜自己域名的关键字结果翻了好几页都看不到自己的文章心里凉了半截。其实这不代表你的内容有问题而是你根本没有给百度“指路”——搜索引擎要收录一个网站无外乎两条路径一条是蜘蛛主动顺着链接爬过来一条是站长主动把网址交上去。路径一叫“被动抓取”。百度蜘蛛通过外链、导航站、友链等入口找到你的站点然后顺着页面里的链接一层层翻下去。路径二叫“主动提交”也就是把你想让搜索引擎收录的 URL 列表直接提交给百度。对于刚上线、外链几乎为零的个人博客来说被动抓取可能要等很久而主动提交几乎是立竿见影的。这正是“百度主动推送”存在的意义。它和 sitemap站点地图不同sitemap 是放在你网站上的一个清单文件方便蜘蛛来了之后按图索骥主动推送则是把最新发布的文章 URL 直接“塞到”百度的接收接口里告诉它“我有新内容了快来抓”。两者配合才是完整的收录方案这也是我当初搭博客踩了一圈坑之后总结出来的结论。1.2 sitemap 在中间起什么作用你可以把 sitemap 理解成一份餐厅菜单。蜘蛛进到你的网站餐厅之后顺着菜单点菜想吃什么就直接翻到哪一页不用满屋子乱跑。如果连菜单都没有蜘蛛只能一间间包厢推门进去找效率低、体力消耗大收录速度自然慢。Hexo 默认不会生成 sitemap需要装插件。常见的做法是生成两个文件一个是通用格式的sitemap.xml给 Google、Bing 这些国外搜索引擎用另一个是baidusitemap.xml它是百度特有的格式字段更靠近百度对页面优先级、更新频率的解析习惯。这里有个很多人忽略的细节sitemap 里的 URL 地址必须和页面真实可访问的地址一字不差包括协议http/https、域名带不带www、结尾斜杠。我的一个学员之前把 Hexo 配置文件里的url写成http://localhost:4000就部署了生成的 sitemap 里全是 localhost 链接百度拿到这种列表自然一无所获。后面我会专门讲这个坑。1.3 为什么很多人部署后久久不收录说句实在话百度对个人新站的态度一向比较保守。域名注册时间短、没有备案、服务器在境外、页面更新频率低、外链少这些因素都会让收录周期拉长。谷歌那边可能文章发出去第二天就搜得到了百度这边一周都没动静是非常正常的现象。但“正常”不代表“没办法”。除了被动等待你能做的有三件事第一在百度搜索资源平台完成站点验证第二生成 sitemap 并提交第三每次发布文章后执行主动推送。这三件事做完百度蜘蛛大概率会在几小时到几天内来抓一次比干等强得多。2. 站点地图生成插件选型与一个容易踩的“URL 前缀”坑2.1 两个常用插件的区别与选择Hexo 社区里有两个主流插件分别是hexo-generator-sitemap和hexo-generator-baidu-sitemap。很多人以为装一个就够了实际我强烈建议两个都装。hexo-generator-sitemap生成的是标准协议格式的sitemap.xml结构简单各大搜索引擎都认识。hexo-generator-baidu-sitemap生成的是baidusitemap.xml它在标准格式基础上增加了百度能识别的标签属性比如locs这样的节点更贴合百度的抓取习惯。两个插件装好后会在public目录下各生成一个 XML 文件互不干扰。之后你再把两个地址分别提交到百度搜索资源平台的“sitemap 提交”入口以及 Google Search Console 里就齐活了。注意不要只提交 Google 能用的那个百度对baidusitemap.xml的友好度明显更高。2.2 安装配置与生成验证安装命令很简单npm install hexo-generator-sitemap --save npm install hexo-generator-baidu-sitemap --save装完之后重点检查 Hexo 根目录的_config.yml里这几个字段url: https://yourname.github.io root: /url必须填写部署后的完整域名不要带任何子路径更不要写 localhost。root一般是/如果你的博客是放在username.github.io/hexo这种子目录下的才需要改成对应路径。然后在_config.yml末尾追加sitemap: path: sitemap.xml baidusitemap: path: baidusitemap.xml保存后执行hexo clean hexo generate去public目录确认是否生成了这两个 XML 文件。我习惯再打开其中一个看看里面loc标签里的地址是否都是你的正式域名。这一步花不了两分钟但能避免部署完才发现一堆错误链接。2.3 多语言站点的 sitemap 处理我遇到过用hexo-generator-i18n或者类似多语言插件的朋友他们问我多语言站点的 sitemap 是不是要自己手动去重其实不用。上面这两个插件在生成时会把所有语言版本的文章 URL 都列出来因为每个语言版本在 Hexo 里本质上是一篇独立的 HTML 文件。但这里有一个实操要点sitemap 里的 URL 必须是能直接访问的地址。如果你的多语言文章路径是/en/xxx/、/zh/xxx/这种那没问题如果插件生成的是带?langen这种查询参数的地址建议你在主题配置里把语言切换改成路径式路由爬虫对带参数的 URL 抓取优先级很低别指望它自己乖乖去“整理”这些链接。3. 百度主动推送从申请到跑通的完整路径3.1 在百度搜索资源平台完成站点验证主动推送的第一步是先证明“这个域名是你的”。你需要去百度搜索资源平台ziyuan.baidu.com注册账号然后添加站点。添加时会让你选验证方式我用得最顺的是文件验证。文件验证的操作是平台会生成一个特定文件名的文件比如baidu_verify_xxxxx.html你把这个文件原封不动放进 Hexo 的source目录然后执行hexo g hexo d部署上去。等平台那边能通过https://你的域名/文件名访问到这个文件验证就通过了。这里有两个提醒一是文件名里的字符大小写、下划线都要保持原样部署完先自己在浏览器里访问一遍确认能打开二是不要放在source/js或source/css之类子目录里直接放source根目录下这样生成后会出现在站点根路径。有人因为多放了一层目录导致验证文件访问 404来回折腾了一下午。3.2 主动推送的三种落地方式怎么选验证通过之后进入“普通收录 — 主动推送”页面你会看到一个推送接口地址格式大致是http://data.zz.baidu.com/urls?site你的域名token一串token这个接口支持 POST 一个纯文本内容每行一个 URL。有三种落地方式方式一后台手动粘贴。适合站点刚建好、文章还不多的时候直接把 10 来个 URL 粘进去提交先测试收录效果。方式二curl 命令。适合偶尔手动补推。我在正文里贴过 curl 示例一行命令就能推一批。方式三脚本批量推送。适合把推送动作固化成自动化流程每次hexo d之后自动执行。这是我目前主力使用的方式下面详细讲。如果你只是想快速测试curl 就已经够用了curl -H Content-Type:text/plain --data-binary urls.txt \ http://data.zz.baidu.com/urls?siteyourname.github.iotoken你的token提前把要推的 URL 写进urls.txt一行一个最后一行要以换行结尾。3.3 自定义推送脚本的完整实现更多场景下我建议写一个简单的 Node.js 脚本放在 Hexo 根目录下每次生成完站点后自动扫描public目录里的所有.html文件拼成完整 URL再批量 POST 给百度。好处是以后每次写文章都不用手动去整理链接。脚本逻辑大致如下const https require(https); const http require(http); const fs require(fs); const path require(path); const site yourname.github.io; const token 这里填你的token; const publicDir path.join(__dirname, public); const urls []; function walk(dir) { const files fs.readdirSync(dir); files.forEach(file { const full path.join(dir, file); if (fs.statSync(full).isDirectory()) { walk(full); } else if (file.endsWith(.html)) { let rel path.relative(publicDir, full); rel rel.replace(/\.html$/, ); if (rel.includes(index)) { rel rel.split(index)[0]; } urls.push(https://${site}/${rel}/); } }); } walk(publicDir); const postData urls.join(\n) \n; const postUrl new URL(http://data.zz.baidu.com/urls?site${site}token${token}); const req http.request({ hostname: postUrl.hostname, path: postUrl.pathname postUrl.search, method: POST, headers: { Content-Type: text/plain, Content-Length: Buffer.byteLength(postData) } }, res { let body ; res.on(data, chunk body chunk); res.on(end, () console.log(推送结果:, body)); }); req.on(error, err console.error(推送失败:, err.message)); req.write(postData); req.end();跑一下脚本看到返回的success字段大于 0说明接口已经接收了。注意到脚本里我用了http模块因为百度这个接口是 http 协议用https模块反而会因为证书问题报错。4. 脚本推送的细节返回码、限额与定时触发4.1 推送结果怎么看status 与 remain 的含义调用推送接口后百度会返回一串 JSON最常见的三种形态是{ remain: 4999980, success: 5 }success表示这次成功接收了多少条 URLremain表示当天剩余的可提交条数。配额是每天早上重新计算的新站一般几百到几千条不等个人博客完全够用。如果推送失败返回里会有error字段。常见的情况包括error 值含义常见原因400请求格式错误token 或 site 参数写错401token 错误从平台粘贴 token 时带了空格403不是本站地址site 参数与验证域名不一致404地址不存在接口路径拼错少写了/urls另外还有两个字段需要留意not_same_site表示这批 URL 里有不属于当前站点域名的地址接口默认直接忽略not_valid表示 URL 格式不合法。看到这两个字段不为 0第一件事就是去检查脚本拼接 URL 的逻辑十有八九是文章路径里带了index.html没有处理掉或者 URL 写成了双斜杠。4.2 我遇到的推送失败场景与排查过程第一次做主动推送时我的返回结果里success一直是 0error给了 403。排查了半天发现问题出在site参数上我在百度平台验证的是带www的域名推送接口里填的却是没有www的裸域名。后台提示“非本站地址”但实际上只要你验证的是主域接口优先认主域如果验证的是带www的子域就必须带www。不同账号状态容易混淆务必去平台“站点设置”里核对一遍再复制。还有一次推送后百度返回了not_valid原因是我脚本拼接路径时把index.html处理后没有补上结尾的/生成了类似https://site.com/abouthtml这种畸形地址。这里有一个原则Hexo 生成文章默认是目录形式最终 URL 是https://site.com/xxx/所以脚本里要把.html去掉之后补一个斜杠结尾。我在脚本里已经处理了这一点。最后一种情况有点隐蔽CDN 加速导致的 URL 跳转。有个朋友给博客挂了一层 CDN百度抓取时 301 跳转到另一个协议下的地址返回的not_valid数量忽然变多。解决方法是统一协议并关闭不必要的跳转让实际访问 URL 与脚本推送 URL 完全一致。4.3 部署后自动推送的三种触发方案手动跑脚本终归不是长久之计我每次写完文章都希望“发布即推送”。两个主流的自动化触发方式你可以任选方案一修改 npm scripts。在package.json的scripts里把部署命令改成长链scripts: { deploy: hexo clean hexo g hexo d node push.js }以后每次执行npm run deploy就会自动完成生成、部署、推送三个动作。这是最直观的方式本地跑起来省心。方案二Git Hook。如果你习惯直接用hexo d部署可以在.git/hooks/post-commit里追加一行node push.js。但要注意这个 hook 在你每次git commit时都会触发如果你只在部署仓库里提交问题不大如果是本地源码仓库频繁提交每条 commit 都推送一遍就没有必要了。方案三GitHub Actions。如果你把 Hexo 源码托管在 GitHub 上配置一个 workflow在 push 到主分支后自动执行生成、部署到 Pages、再向百度接口发请求。这种方式的好处是彻底解放本地环境新人照着网上模板改一改就行。不过维护成本略高个人博客用前两种方案足够了。5. 配套工程robots、主题配置与站点数据核对5.1 robots.txt别让蜘蛛白跑一趟网站地图和主动推送都搞定之后别忘了还有一个小文件会影响收录robots.txt。Hexo 默认不会生成它需要你手动在source目录下新建一个。我给自己的博客用的是极简写法User-agent: * Allow: / Sitemap: https://yourname.github.io/sitemap.xml如果你有不想被收录的目录比如source/lab这种私有测试页面可以加上Disallow: /lab/。但要注意不要全局禁止 JS 和 CSS。很多新手照抄网上的“优化配置”把.js和.css全部 Disallow 了结果蜘蛛抓取页面时无法解析排版反而影响收录质量。5.2 next 主题侧边栏与统计配置我用的是 Hexo 经典的 Next 主题。虽然全新版的 Next 提供了很多默认组件但侧边栏信息还是要自己调。为了配合百度 SEO我在侧边栏里做了两件事一是加了一个“站点地图”链接指向/sitemap.xml既是给访客用的也是给蜘蛛多留一个入口二是把百度统计的代码放进了主题配置里。Next 的侧边栏配置逻辑是在主题的_config.yml里找一个叫menu的区域像这样追加menu: 站点地图: /sitemap.xml || sitemap如果你了解 Next 主题结构就会知道菜单项后面的地址支持相对路径图标名称可以沿用主题自带的 font-awesome 名字。我这里写的|| sitemap就是图标不填也没关系。至于百度统计把从平台复制的 js 代码放到_config.yml的baidu_analytics字段即可新版主题通常已经预留了入口不需要去改模板文件。这里顺带说一句改写侧边栏的时候不要为了好看把侧边栏做成纯文字堆砌。导航要精简有明确的入口这不仅是为了用户体验也是为了让蜘蛛沿着清晰的链接结构遍历全站。5.3 sitemap 与页面实际 URL 的一致性核对最后一步也是我最想强调的一步部署完一定要用真实线上地址核对 sitemap。网站地图生成本地看着没问题部署后有时候会暴露出一些诡异的情况比如Hexo 配置的url没改导致生成的链接是localhost站点部署上去之后 sitemap 全部无法访问域名的www与裸域名做了跳转导致 sitemap 里 URL 和线上规范地址不一致用了某个主题的“绝对路径”配置给所有 URL 加了子目录前缀但时代背景是站点根路径最终拼出来 404。我每次部署完都会执行一次curl -I查看线上 sitemap 的响应头确认文件存在且最后一个url节点是能正常访问的文章页curl -I https://yourname.github.io/sitemap.xml curl -I https://yourname.github.io/某篇文章路径/这一步看起来笨但能提前拦截绝大多数收录问题。毕竟 sitemap 里面哪怕有一条 URL 是 404百度就可能降低对这个文件的信任度觉得你这个站点链接质量不稳定。一次正式推送之前先花五分钟验证值。最后再分享一个我自己的小习惯主动推送不是只在新文章发布时才做。每隔一段时间我会把全站所有文章 URL 重新批量推一次尤其当主题改版、URL 结构调整之后。百度的索引过期策略比较激进的时期重推一次能明显加快旧文章“复活”的速度。我的 blog 上线第一周靠这套 sitemap 加主动推送的流程一周内就有文章被百度收录两个月后整站收录率达到了可观的比例。你如果刚把 Hexo 部署完就照着上面这几步走一遍等收录结果的过程会踏实很多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑