处理搜索引擎无法成功抓取博客的问题

百度爬虫抓取诊断地址:https://ziyuan.baidu.com/crawltools/index

第一个坑:百度爬虫无法抓取GitHub pages内容

百度和GitHub之前好像谈崩了,所以GitHub上的东西百度是无法抓取的,如果博客服务直接使用的GitHub pages,百度是无法抓取到的。

要解决这个问题,需要把博客放到百度爬虫可以抓取的服务上,比如各类S3服务直接提供静态网页服务,如腾讯云CO、,阿里云OSS,外部可以再挂载CDN;或者直接放在自己的服务器上。

我采用的是直接放在自己的服务器上,然后外部挂载的腾讯云的CDN服务。

第二个坑:HTTPS认证无法通过

HTTPS认证能够增加在搜索引擎的权重,但是https认证的时候也遇到一个坑,明明我所有的链接都是https的了,但是却无法通过百度的https认证。

这个坑的原因是,https认证必须保证http链接也是可以访问的,因为认证时是通过http访问来认证的。而我在挂载cdn的时候,强制所有的http请求直接重定向为https的访问了,所以始终无法通过,直接在服务器访问也是同样的问题。

所以要想通过https的认证,需要保证网站http和https访问都是可以支持的,而且不能把http重定向为https。

第三个坑:百度爬虫无法成功抓取页面内容

爬虫在进行页面爬取时,会解析到最终服务器的ip去进行访问,所以最终直接访问服务器来请求实际页面内容来解析。

我的博客是部署在我的服务器上的,然后外面挂载CDN,而CDN使用的域名和服务器的域名并不是同一个,所以最开始,在服务器上的NGINX并没有配置cdn使用的域名,所以当爬虫直接访问我的服务器时,并不能成功获取到页面内容,才开始并没有想到是这个原因,我把ip访问直接放回了博客内容,这样只解决了sitmap的上报问题,本身页面抓取的问题并没有解决。

不过在我认证https之前,爬虫是可以成功抓取到页面内容的,基于此分析,https和http差别就是ssl证书,而ssl证书是和域名相关的,而百度抓取的域名是我cdn的域名,分析到这个点,实际抓取失败的原因也就大概猜出来了。

解决方案就是在服务上的NGINX上配置上cdn的域名,因为是https的访问,所以还要将cdn的域名用的ssl证书也配置在NGINX上,配置完成后,再去进行百度爬虫诊断,发现可以成功抓取内容了。

修改hexo生成的html文件名

背景

hexo 默认情况下,生成的HTML文件名是new post时输入的文件名,而在创建文章时,这个文件名输入相信很多人都是输入的中文,那么最终生成博客时,生成的文件也是中文文件命,这个对搜索引擎是比较不友好的,还一个点就是有些插件对url长度有限制,那么中文的文件名url经过url编码后会很长很长,无法使用。下面就来讲讲怎么修改这个url。

方案

这个生成文件名的修改网上也有一些方案,比如自己写脚本来批量改相关内容,参考这片文章:
修改Hexo自动生成的HTML文件名

也有一些现成的插件呀,参考下面这个文章,里面的GitHub连接点进去还有另一个插件:
永久链接

不过吧,其实没那么麻烦,因为这个功能hexo本身已经提供了的。

hexo 根目录下的_config.yml里面有以下参数:

1
2
permalink: :year/:month/:day/:title/
permalink_defaults:

这个其实就是指定了生成文章后的url的,接下来就讲下怎么改,首先看下面这个我的配置:

1
2
3
permalink: :year:month:day/:urlname.html
permalink_defaults:
urlname: :title

首先将url的层级减少,但是最好不要减完,减少是因为这样对于搜索引擎比较友好,不减完是为了让文章不至于全部在一个层级里面,这样会很难维护,我这里改成了只有两级。
这里可以应用的参数有以下这些默认的:

但是有没有发现,上面我的配置里面有个urlname,这里里面并没有,这个参数就是自定义的一个参数,这里是允许我们自定义参数的,就在我们写博客的头部,如我的一个博客的头部内容是:

1
2
3
4
5
6
---
title: 基于hexo构建博客
date: 2021-02-28 17:27:15
tags: 博客搭建
urlname: blog_init_2
---

那么对应的博客的uri就是/20210228/blog_init_2.html

这个文件头部模板是在博客的scaffold/post.md配置的,我们可以直接将这个自定义参数加在里面,这样每次新建文章的时候就会自动生成了

1
2
3
4
5
6
7
---
title: {{ title }}
date: {{ date }}
tags:
urlname:
---

为hexo引入访问量统计

配置是否开启不蒜子访问量统计功能

找到你所用主题的_config.yml文件,比如我用的默认的landscape主题,那么路径就是 themes/landscape/_config.yml,加入以下配置

1
2
busuanzi:
enable: true

引入不蒜子并添加站点访问量

找到你的用的主题里面配置底部样式的ejs,一般都是footer.ejs这个文件,比如我的 themes/landscape/layout/_partial/footer.ejs ,加入以下代码:

1
2
3
4
5
6
7
8
9
10
11
<% if (theme.busuanzi && theme.busuanzi.enable){ %>
<!-- 不蒜子统计 -->
<span id="busuanzi_container_site_pv">
本站总访问量<span id="busuanzi_value_site_pv"></span>次
</span>
<span class="post-meta-divider">|</span>
<span id="busuanzi_container_site_uv" style='display:none'>
本站访客数<span id="busuanzi_value_site_uv"></span>人
</span>
<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<% } %>

添加文章访问量

文章显示一般都是带日期,所以文章访问统计可以加到日期展示,一般都是date.ejs,比如我的路径是themes/landscape/layout/_partial/post/date.ejs,加入以下代码:

1
2
3
4
5
6
7
 <% if (theme.busuanzi && theme.busuanzi.enable && !index){ %>
<!-- 不蒜子统计 -->
<span id="busuanzi_container_page_pv" style='display:none' class="<%= class_name %>">
<i class="icon-smile icon"></i> 阅读数:<span id="busuanzi_value_page_pv"></span>次
</span>
<% } %>

注意点

引入的其实就是一段js,然后几个html元素,具体阅读量啥的在哪展示,由你放置上面这些代码的位置决定的,然后各种主题的目录结构其实都差不多,所以按照我上面所给的路径对照自己的主题基本都是可以接入成功的

为hexo博客接入百度统计个和Google统计

接入百度统计

开通百度统计账号

百度统计 注册帐号(站长注册)。

在网站列表中加入自己的网站

将百度统计代码植入博客

这里先使用next主题,首先next主题

1
2
3
4
5
6
7
8
9
10
11
# 进入到你的hexo博客目录下
cd your-hexo-site

# 我这里是默认的landscape主题,其他主题也差不多的操作
cd themes
# 下载lanscape主题
git clone https://github.com/hexojs/hexo-theme-landscape.git

# 创建文件
cd landscape
touch layout/_partial/baidu_tongji.ejs

还记得我们之前申请的百度统计账号么,在代码管理那一栏有一段代码,找到刚刚创建的baidu_tongji.ejs文件,写入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<% if (theme.baidu_tongji){ %>
<!-- baidu_tongji 百度统计网站上的那段代码 -->
<script type="text/javascript">
var _hmt = _hmt || [];
(function () {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?ec36f7***1765ac22fe11d7e17f57b00";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();

</script>
<!-- End baidu_tongji -->
<% } %>

然后找到themes/landscape/layout/_partial/head.ejs文件,加入以下代码:

1
2
<%- partial('baidu_tongji') %>

在主题的配置文件(themes/landscape/_config.yml)中加入以下配置:

1
baidu_tongji: true

配置好以后,重新发布博客就可以了,然后在百度统计页面进行代码安装检查就OK了。

接入Google统计

开通Google分析账号

Google分析 注册账号

拿到GA ID

landscape是已经集成了Google统计,所以只需要配置一下就行了
在主题的配置文件(themes/landscape/_config.yml)中加入以下配置:

1
google_analytics: *****

重新发布博客就OK了。

自动推送链接到百度搜索

注册百度资源搜索账号

提交自己的站点,按步骤操作就可以了

站点提交完以后百度就会对博客进行爬取了。

同时我们可以每次发布时自动推送新链接到百度。

先安装推送插件:

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

在根目录的_config.yml 文件添加以下配置:

1
2
3
4
5
baidu_url_submit:
count: 100 # 提交最新的多少个链接
host: www.wkcaeser.com # 在百度站长平台中添加的域名
token: # 秘钥
path: baidu_urls.txt

秘钥在刚刚百度资源网站上找

基于hexo构建博客

what is hexo

hexo 是一个基于GitHub pages托管能力(当然也可以自己直接发布)构建自己博客的一个nodejs 框架,用来搭建自己博客是很方便的。

构建GitHub pages博客

在使用hexo博客前最好先使用GitHub pages搭建好自己的博客服务,具体教程参考搭建GitHub_pages博客并配置自定义域名cdn加速

安装hexo

在安装使用hexo之前,需要先安装nodejs,具体教程参考nodejs安装配置

node安装完成以后,就可以安装hexo了,打开控制台:

1
2
3
4
5
# 全局安装hexo命令
npm install -g hexo-cli

# 验证是否安装成功
hexo --help

初始化博客

创建一个目录,进入到这个博客内部执行初始化命令

1
hexo init

在执行命令的时候,遇到一个报错,这个报错是由于小飞机代理引起的,修改gitcofig即可。
报错如下:
1
2
3
4
5
6
7
8
9
10
11
 INFO  Cloning hexo-starter https://github.com/hexojs/hexo-starter.git
fatal: 无法访问 'https://github.com/hexojs/hexo-starter.git/':LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443
WARN git clone failed. Copying data instead
FATAL {
err: [Error: ENOENT: no such file or directory, scandir '/usr/local/lib/node_modules/hexo-cli/assets'] {
errno: -2,
code: 'ENOENT',
syscall: 'scandir',
path: '/usr/local/lib/node_modules/hexo-cli/assets'
}
} Something's wrong. Maybe you can find the solution here: %s http://hexo.io/docs/troubleshooting.html

解决方式是编辑git的配置文件:
1
vim ~/.gitconfig

写入一下内容,端口是你自己小飞机的端口:
1
2
3
4
5
6
7
8
 [user]
name = wkCaeser
email = wkCaeser@gmail.com

[http]
proxy = socks5://127.0.0.1:10808
[https]
proxy = socks5://127.0.0.1:10808

改好以后再重新执行hexo init命令即可,执行完成后目录就多了如下内容:

然后执行如下操作来查看自己初始化的博客:

1
2
3
4
5
# 编译生成博客
hexo g

# 本地启动博客服务
hexo s

然后浏览器中输入 http://localhost:4000 就可以看到自己初始化的博客页面了。

发布到GitHub pages

找到刚刚生成的博客目录下的_config.yml,写入GitHub pages仓库的地址信息:

1
2
3
4
5
6
7
8
9
# gihub pages cname的域名 
# 如果设置了自定义域名或者cdn域名,一定要写页面访问是输入的地址
# 没有的话就写GitHub原本提供的域名
url: https://www.wkcaeser.com

deploy:
type: git
repository: https://github.com/wkcaeser/blog.git
branch: main

然后找到source目录,创建CNAME文件,文件内容为在GitHub上配置自定义域名,例如我的是:

1
blog.wkcaeser.com

然后执行发布命令:

1
2
# 发布到GitHub 需要先配置GitHub的ssh-key
hexo d

然后发现报了下面这个错:

1
2
3
guimokai@wk-mbp:~/Desktop/vs_code_workspace/blog$ hexo d
INFO Validating config
ERROR Deployer not found: git

这是因为缺少hexo-deployer-git插件,安装后重新执行发布命令即可:

1
npm install hexo-deployer-git --save

然后就可以通过自己GitHub pages的链接访问博客了,例如我的是 www.wkcaeser.com

写文章

使用命令如下命令就可以生成新文章了,

1
hexo new post "article title"

也可以直接在source/_post目录下直接新建md文档。

编写完以后,就可以重新生成,然后发布了

1
2
3
hexo clean
hexo g
hexo d

搭建GitHub_pages博客并配置自定义域名cdn加速

全部步骤列表

  • 1、创建GitHub账号
  • 2、本地安装git
  • 3、创建GitHub pages repository项目
  • 4、绑定域名
  • 5、绑定cdn加速

前面两步暂时就不讲了,可以参考网上其他文章

创建GitHub pages repository项目

  • 创建项目

首先选择GitHub页面右上角的加号,选择New repository。

然后输入项目名,同时自动生成README文件需要勾选上,然后点击Crete repository创建项目。

然后进到刚刚创建的项目主页,点击settings进行项目GitHub pages项目配置,点进去了往下来找到GitHub pages

然后在source位置配置博客文件的存放分支和路径,点击save就OK了,页面上会展示出你博客的访问路径了。
后面将博客需要发布的内容放到GitHub这个仓库里面就可以在博客中看到了

绑定域名


还记我们上面设置创建的仓库为GitHub pages么,在同样的地方设置你的个人域名,需要进行两步操作
  • 第一步,在你的域名服务商设置一条CNAME的解析记录,比如我的是腾讯云
  • 第二步,在刚刚GitHub pages的配置地方,填写你的域名,点击save,实际上它是在你的仓库生成了一个叫CNAME的文件


这时候你访问你的个人域名就可以访问你的博客,但是有个问题,你会发现你访问的域名是http的请求,所以还需要配置https,这一步现在GitHub会自动帮你完成的,你只需要刷新页面等待即可。
  • 等enforce https 可以点击的时候点击勾选就可以了
  • 上面那个绿色条条显示的是TLS证书的申请进度,等他走完了刷新页面勾选enforce HTTPS即可

勾选以后你会发现你的访问链接变成HTTPS的了,如果还不是多刷新几次

绑定cdn加速

给GitHub pages绑定cdn加速其实各个服务上操作都差不多,主要是几个概念要理解清楚,这几个概念折腾请求了就很容易配了(mmp,当时我理解错了回源host的含义,主要是很多博客上也说得错的或者很含糊,折腾了一天,在各个云上都试了下提工单看文档才搞定)。

  • 加速域名:你访问时在浏览器里面输入的域名
  • 源站域名:你的服务放在哪个服务器上,那个服务器绑定的域名,cdn会解析到对应的ip,一般是个负载均衡的域名,能解析出多个ip,cdn会解析到对应ip
  • 回源host(回源域名):回源请求访问哪个域名,上面说到了源站域名可能会解析出多个ip,而这些ip上可能又绑定的有多个域名,这个域名就决定了访问这个ip时的请求用什么域名去访问

下面是我在企鹅云的配置:

  • 加速域名是www.wkcaeser.com
  • 源站域名是我之前在GitHub pages配置的个人域名 blog.wkcaeser.com
  • 回源host是 blog.wkcaeser.com (这里如果在GitHub配置了个人域名一定要写个人域名,不然会有解析死循环的问题),如果配置的时候GitHub pages提供的那个域名的话(比如我是 wkcaeser.github.io),还需要配置下url路径重写(因为实际访问地址是 wkcaeser.github.io/blog),和NGINX差不多

另外,最好cdn回源配置里面的“回源跟随301/302配置”勾选上,不然有些基于GitHub pages的框架在访问时重定向可能会有问题(比如hexo)