Hexo 优化:提交 sitemap 及解决百度爬虫无法抓取 GitHub Pages 链接问题

前言

博客搭建起来了,但搜索引擎总搜不到,太没有成就感了。于是下一步要做的就是针对搜索引擎的优化,最终根据网上资料和自己遇到的实际情况,完成此博文。
本文主要分以下三个部分:

  1. 针对一般性的搜索引擎的优化配置
  2. sitemap 的生成和提交
  3. 百度搜索的优化配置及解决百度爬虫无法爬取 GitHub Pages 链接的问题
  4. 一般来说应该先阐述如何向搜索引擎提交链接,再来说明优化的。但在实际操作中发现,因为优化中包括文章链接的变动,已经提交的链接变得无法检索,所以先进行一些优化,再提交链接为好。

验证博客是否被收录

在谷歌或者百度的搜索链接中,使用以下格式可以直接搜索自己的域名,或者关键词 + 域名来更好地判断 , 如果能搜索到就说明已经被收录,反之则没有。可以直接搜索自己的域名,或者加一些关键词来更好地判断,例如

1
wsl site:www.yuan-ji.me

一般性优化

文章链接优化

Hexo 默认的文章链接形式为 domain/year/month/day/postname,分级较多,造成 URL(Universal Resource Locator,统一资源定位符) 较长,不利于搜索引擎检索,我们可根据需要缩短 URL,将其改为 domain/postname的形式。编辑站点配置文件_config.yml, 将 permalink 字段改为 permalink: :title/
tips:
如果仍想在 URL 中保留时间要素,比如将 URL 改为 domain/year-month-day/postname 的形式,也可将permalink字段改为 permalink: :year-:month-:day/:title/

首页标题优化

在主题目录下的主题配置文件 _config.yml 中新增 description 字段,后面添加你想为网站首页标题增加的描述 , 例如 description: xxxxx, 更改 \themes\next\layout 目录下的 index.swig文件,将代码

1
{% block title %} {{ config.title }} {% endblock %}

改为

1
{% block title %} {{ config.title }} - {{ theme.description }} {% endblock}

此时网站首页标题会变成 网站名称-网站描述的形式。

或者改为

1
{% block title %} {{ theme.keywords }} - {{ config.title }} - {{ theme.description }} {% endblock %}

此时网站首页标题会变成 网站关键词-网站名称-网站描述的形式,theme.keywords 显示的是主题配置文件中 keywords 的内容。
不过个人喜欢首页标题简洁些,所以还是维持了默认的只显示网站名称的形式。

限制出站链接,增加 nofollow 标签

nofollow 标签是由谷歌领头创新的一个 “反垃圾链接” 的标签,并被百度、yahoo 等各大搜索引擎广泛支持,引用 nofollow 标签的目的是:用于指示搜索引擎不要追踪(即抓取)网页上的带有 nofollow 属性的任何出站链接,以减少垃圾链接的分散网站权重!

安装以下插件,自动为文章添加 nofollow 标签

1
npm install hexo-autonofollow --save

并在 站点配置文件 中添加以下字段

1
2
3
4
5
nofollow:
enable: true
exclude: # 不添加 nofollow 标签的连接
- exclude1.com
- exclude2.com

添加 robots.txt

robots.txt(统一小写)是一种存放于网站根目录下的 ASCII 编码的文本文件,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。

source 目录下增加 rebots.txt 文件, 我参考的 robots.txt 代码如下,请将域名改为自己的网站

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# hexo robots.txt
User-agent: *
Allow: /
Allow: /archives/
Disallow: /vendors/
Disallow: /js/
Disallow: /css/
Disallow: /fonts/
Disallow: /vendors/
Disallow: /fancybox/
Sitemap: http://www.yuan-ji.me/sitemap.xml
Sitemap: http://www.yuan-ji.me/baidusitemap.xml

这样在下次部署博客时,robots.txt 就会被上传至网站了。稍后我们在提交 sitemap 时,可以顺便测试它是否被搜索引擎正确解析了。

sitemap 的生成和提交

sitemap 的生成

Sitemap 可方便网站管理员通知搜索引擎他们网站上有哪些可供抓取的网页。最简单的 Sitemap 形式,就是 XML 文件,在其中列出网站中的网址以及关于每个网址的其他元数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度为何等),以便搜索引擎可以更加智能地抓取网站。

简言之, 网站地图 {Sitemap} 对于 搜索引擎优化 (英语:Search Engine Optimization,缩写为 SEO)非常重要,在网站中加入 Sitemap 有利于搜索引擎蜘蛛的抓取和收录。我们用安装以下两个插件来生成适用于谷歌和百度的 sitemap

1
2
npm install hexo-generator-sitemap --save
npm install hexo-generator-baidu-sitemap --save

并在 站点配置文件中添加以下字代码

1
2
3
4
5
#hexo sitemap
sitemap:
path: sitemap.xml
baidusitemap:
path: baidusitemap.xml

之后在执行 hexo g 后, public目录下发现生成了 sitemap.xmlbaidusitemap.xml 就表示配置成功了。

tips:

  • 插件生成的 sitemap 的文章链接,都是以站点配置文件中的 url 为基础的,如果将博客绑定了域名,那最好将 url 字段填写为绑定的域名。
  • 不想生成 sitemap 的页面,可在页面最上方以 --- 分割的区域内,即 Front-matter 中,添加代码 sitemap: false

验证网站

在我们向搜索引擎提交 sitemap 之前,搜索引擎需要先验证我们对网站的所有权。

为什么要验证网站
  站长平台推荐站长添加主站(您网站的链接也许会使用 www 和非 www 两种网址,建议添加用户能够真实访问到的网址),添加并验证后,可证明您是该域名的拥有者,可以快捷批量添加子站点,查看所有子站数据,无需再一一验证您的子站点。
如何验证网站
首先如果您的网站已使用了百度统计,您可以使用统计账号登录平台,或者绑定站长平台与百度统计账号,站长平台支持您批量导入百度统计中的站点,您不需要再对网站进行验证。
百度站长平台为未使用百度统计的站点提供三种验证方式:文件验证、html 标签验证、CNAME 验证。
  1. 文件验证:您需要下载验证文件,将文件上传至您的服务器,放置于域名根目录下。
  2.html 标签验证:将 html 标签添加至网站首页 html 代码的 标签与 标签之间。
  3.CNAME 验证:您需要登录域名提供商或托管服务提供商的网站,添加新的 DNS 记录。
  验证完成后,我们将会认为您是网站的拥有者。为使您的网站一直保持验证通过的状态,请保留验证的文件、html 标签或 CNAME 记录,我们会去定期检查验证记录。

两个搜索引擎提交的入口分别为:
Google Search Console
百度站长平台
验证的方法很多,我两个搜索引擎均采用 文件验证 的方法。Google 添加链接后,会自动跳转至验证页面,供我们下载 HTML 验证文件。

google 验证

百度需要提交链接后,点击 验证网站所有权,下载 HTML 验证文件。
将下载的验证文件在 source 目录下。 为了使 hexo 不处理这两个验证文件,并且不生成关于这两个文件的 sitemap,我们需要打开验证文件,在最上面添加以下代码

1
2
3
layout: false
sitemap: false
---

执行 hexo 部署命令

1
2
3
hexo clean
hexo g
hexo d

之后,就可以查看验证是否通过了。

提交 sitemap

向谷歌提交

向谷歌提交 sitemap 比较简单,登录 Google Search Console ,选择已经验证过的站点,在抓取 -> 站点地图 中,右上角可看到 添加 / 测试站点地图,添加 sitemap.xml 的链接即可,谷歌效率较高,一般当天或者第二天就能搜到微博了。
tips:

  • 需要注意的是,在生成 sitemap 时,要屏蔽掉谷歌和百度的验证文件 (方法见上文 ‘sitemap 的生成 ‘ tips), 否则谷歌在检测 sitemap 时报错。
  • 另外可以在 抓取-> robots.txt 测试工具 中点击测试,测试添加的 robots.txt 是否已经成功。

向百度提交

与谷歌类似,我们可以直接向百度交 sitemap,登录 百度站长平台,点击 网页抓取-> 链接提交,在 自动提交中选择 sitemap,输入自己的域名加 baidusitemap.xml 即可,比如我的是 http://www.yuan-ji.me/baidusitemap.xml 。 之后可查看 url 提取是否成功。

baisu 站点地图

tips:
和谷歌不同,百度提交了链接也不一定收录,要不断提升文章质量和数量才行。

百度相关的搜索配置

由于 GitHub 屏蔽了百度的爬虫,即使提交成功,百度知道这里有可供抓取的链接,也不一定能抓取成功。 首先我们先检测一下百度爬虫是否可以抓取网页。在百度站长平台网页抓取->抓取诊断 中,选择PC UA点击抓取 , 查看抓取状态, 如果显示 抓取失败, 则需要进一步的配置。

抓取测试

tips:
选择 移动 UA抓取一般都是会成功的。

主动推送和自动推送

百度提供了多种链接提交的方式

如何选择链接提交方式
1、主动推送:最为快速的提交方式,推荐您将站点当天新产出链接立即通过此方式推送给百度,以保证新链接可以及时被百度收录。
2、自动推送:最为便捷的提交方式,请将自动推送的 JS 代码部署在站点的每一个页面源代码中,部署代码的页面在每次被浏览时,链接会被自动推送给百度。可以与主动推送配合使用。
3、sitemap:您可以定期将网站链接放到 sitemap 中,然后将 sitemap 提交给百度。百度会周期性的抓取检查您提交的 sitemap,对其中的链接进行处理,但收录速度慢于主动推送。
4、手动提交:一次性提交链接给百度,可以使用此种方式

我们可以综合使用,互为补充。

自动推送

next 主题已经部署了自动推送的代码,我们只需在主题配置文件 中找到 baidu_push 字段 , 设置其为 true 即可。

主动推送

为使用主动推送,需要安装插件 , 参考官方说明 Hexo 插件之百度主动提交链接

首先,在 Hexo 根目录下,安装本插件:

1
npm install hexo-baidu-url-submit --save

然后,同样在根目录下,把以下内容配置到 _config.yml 文件中:

1
2
3
4
5
baidu_url_submit:
count: 3 ## 比如 3,代表提交最新的三个链接
host: www.hui-wang.info ## 在百度站长平台中注册的域名
token: your_token ## 请注意这是您的秘钥, 请不要发布在公众仓库里 !
path: baidu_urls.txt ## 文本文档的地址, 新链接会保存在此文本文档里

其次,记得查看 _config.ym 文件中 url 的值, 必须包含是百度站长平台注册的域名(一般有 www), 比如:

1
2
3
4
# URL
url: http://www.hui-wang.info
root: /
permalink: :year/:month/:day/:title/

最后,加入新的 deployer:

1
2
deploy:
- type: baidu_url_submitter

执行 hexo deploy 的时候,新的连接就会被推送了。

tips:

  • 百度每天主动提交的链接数量是有限制的

    主动推送可以推多少条链接?
    答:主动推送可提交的链接数量上限是根据您提交的新产生有价值链接数量而决定的,百度会根据您提交数量的情况不定期对上限额进行调整,提交的新产生有价值链接数量越多,可提交链接的上限越高。

  • 主动推送是否成功会在执行 hexo deploy 时显示, success后的数字为主动推送成功的链接数

    成功链接

Coding.net 镜像部署

还有一个解决思路是,利用 Coding.net 提供的 Coding Pages 功能另外部署一个镜像,让百度爬虫访问此镜像,普通用户还是访问位于 Github Pages 的页面。

注册 Coding.net 账号

首先在注册 Coding.net 账号, 创建用户 Pages , 并绑定自己的域名,此处请参考 官方帮助文档

修改域名绑定

登录自己的域名解析的控制台, 将指向 pages.coding.me 的解析的线路类型设为 百度

主机记录 记录类型 线路类型 记录值
www CNAME 百度 pages.coding.me

这样就为百度专门开了一条线路。

增加页面跳转

Coding Pages 与 GitHub Pages 不同的一点是,即使绑定了域名,当用户直接访问 Coding.net 分配给自己的二级域名时,却不能跳到已绑定的域名。比如在访问 yuan-ji.coding.me 时,并不能跳转到 www.yuan-ji.me。为了避免用户误访问了 Coding Pages 的镜像,我们需要增加一段跳转代码。
在位于 themes/next/layout/_partials/head.swig文件中,最后位置添加如下代码,

he
1
2
3
4
5
<script language="javascript">
host = window.location.host
if(host == "yuan-ji.coding.me")
window.location.href = window.location.href.replace(/yuan-ji.coding.me/,"www.yuan-ji.me")
</script>

这样当用户在浏览器访问镜像时,会直接跳到我们在 GitHub 的页面,同时又不会影响百度爬虫。

站点配置文件 中增加新的 deployer

1
2
3
4
deploy:
- type: git
repo: git@git.coding.net:yuan-ji/yuan-ji.git
branch: coding-pages

这样每次在执行部署时,博客会同时部署到 GitHub 和 Coding.net 的镜像上。

更新 Robots

登录百度站长平台 , 点击 网页抓取->Robots-> 检测并更新。 这样百度爬虫会检测并更新 robots.txt, 并会在新的 ip 地址上抓取内容,不然还是会抓取原来的 GitHub 上的 ip 地址,导致抓取失败。更新完成后,我们再次在抓取诊断中测试,这时应该就会抓取成功了。
tips:
如果之前已经上传过 robots.txt 导致更新不成功的话,可以试着删除 robots.txt, 重新上传。

小结

我最终三种方式混合使用,数据连接提交效果如下。
链接提交

感慨一下,百度搜索提交实在是太过繁琐了,相比之下,谷歌搜索提交真是方便又有效率。

参考链接

Hexo SEO优化
动动手指,不限于NexT主题的Hexo优化(SEO篇)
hexo干货系列:(六)hexo提交搜索引擎(百度+谷歌)
URL网址统一修正
使用 Hexo 搭建博客的深度优化与定制
Hexo NexT 主题SEO优化指南
Hexo插件之百度主动提交链接
Hexo 博客添加百度sitemap
解决 Github Pages 禁止百度爬虫的方法与可行性分析