4

解决百度爬虫无法爬取 Github Pages 个人博客的问题 | Ox333333

 4 years ago
source link: https://zpjiang.me/2020/01/15/let-baidu-index-github-page/?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

解决百度爬虫无法爬取 Github Pages 个人博客的问题

Jan 15, 2020

marketmechina 统计,去年12月份中国市场全平台 (桌面+手机客户端)搜索引擎市场份额:

  • 百度: 67.09%
  • 搜狗: 18.75%
  • 神马: 6.84%
  • 谷歌: 2.64%
  • 必应: 2.6%
  • 其它: 2.08%

不得不说,即使大家现在如此 diss 百度,这中文搜索的第一把交椅,百度还是坐的很稳。想要获得中文搜索的流量,百度这一入口不容忽视。

GitHub Pages 个人博客

Github Pages 这项服务自上线后,很快就成为了程序员搭建静态个人博客的最佳之选,大家喜欢的原因有很多,比如

  • 可以像写 code 一样写文章
  • 可以通过命令行 git push 一键发布网站,酷炫 😎
  • 静态网页生成框架选择众多,插件完善,自定义性很高
  • 如果懂点前端,上手非常容易

更不用提版本追踪、多人协作这些 Git 自带的优势了。2013年,我也是用 Jekyll 在 GitHub Pages 上搭了个人第一个博客。

First blog screenshot

百度爬虫被拒绝访问

然而,2015年,因为一些不能细说的原因,Github 开始拒绝百度爬虫的访问,直接返回 403。

官方给出原因是,百度爬虫爬得太狠,影响了 Github Page 服务的正常使用。这就导致了,但凡在 Github Page 搭建的个人博客,都无法被百度收录。

自去年年底佛罗里达之行回来,我开始写中文游记,目前为止,Google 收录非常及时全面,SEO 效果也很不错。但如果只有国外的中文读者可以搜索到这些文章,那国内这最大的一批中文读者就被忽略了,再好的内容无法被分享出去也是白搭。

于是,我开始捣鼓如何让百度爬虫收录我的个人博客。

CDN 解决不了问题

我在网上粗略搜了一番,不少人提到 CDN,然而,CDN 无法完美解决问题,尤其对小流量的个人博客。

传送门:什么是 CDN

CDN structure

先说结论,CDN 无法完美解决问题,尤其对小流量的个人博客。

原理上来讲,CDN 解决了最后一公里的资源分发,如果国内的 CDN 服务器有博客的静态文件,那百度爬虫访问时直接从 CDN 节点上爬取资源,Github 源站拒绝访问的问题自然就不存在了。

但是,问题就出在 CDN 节点上。第一次访问时,CDN 上的缓存还未建立,爬虫的请求会被转发到 Github 源站,由于转发请求默认携带了百度爬虫的UA 还有原始 IP,GitHub 发现后会直接拒绝。

有些人会说,国内有些 CDN 厂商支持主动缓存预热(老本行 😂),但缓存是有失效时间的,expired 之后,照样得回源。对于流量小的个人博客,想让资源一直缓存在 CDN 节点上,不现实,新写的文章怎么发布?修改的文章怎么更新?

当然,如果 CDN 节点回源时能够不带上客户端 User Agent,Github 便认不出这是正常访问还是百度爬虫了。这个方法是可行的,很多人提到了用 Nginx 反向代理,然后 override forward IP,这确实可以糊弄过去。只不过,这些方法都需要一定的定制能力,如果是个人开发者,还得买一台 VPS 或者云服务器。

Coding Pages 做镜像站

国内 coding.net 现在也有了类似于 GitHub Pages 的服务:Coding Pages。

在博客静态文件 repo 的配置中同时加上 Github 和 coding.net 的 remote 地址,这样一键发布,两地更新。加上域名智能解析,对于国内的请求,转发到 Coding Page 即可。

可惜的是,现在 .coding.me 和 .coding.io 访问时会先出现跳转页面,导致百度爬虫无法正常收录。

有没有简单、可靠还免费的方法?

答案是,有!

前段时间逛 Twitter,看到大神 Guillermo Rauch 的一篇文章 2019 in Review,顺便就去看了他们创业正在做的产品,zeit.co,提供的正是免费的静态资源 hosting 服务。

抱着试试的心态,我跟着官网文档,不到十分钟就配完了,用百度爬虫一抓,200!

写这篇博客的时候刚好一周,从百度站长上看,文章正在慢慢被收录。

baidu index status

其实 zeit.co 的原理跟上述几个思路类似,本质上他们提供了 Storage + CDN + DNS 这一套完整服务。根据他们的文档,整个过程我只需要:

  • 用我的 Github 账户登陆,给了 zeit 我的静态网页 repo 的 read 权限
  • 等几秒,importing
  • 部署成功!

不用写任何 code,点两下鼠标就完事了。部署完成后,会生成一个类似于 xxxxxxx.now.sh 的链接,点击即可访问,静态资源已经部署到了他们的边缘 CDN 节点上。

到了这一步,接下来需要做的就是切换域名,通过智能 DNS 把国内流量切过去。

不过,为了省事,我决定直接放弃 GitHub Page 提供的 CDN 功能,原本的一套技术栈是 GitHub + GitHub Pages(Fastly CDN)+ Default DNS,如果 zeit 能够提供足够智能的 CDN 和 DNS 服务,没有必要中间套两层 CDN,新的技术栈变成了 GitHub + zeit Smart CDN + zeit Smart DNS。一旦有新的文件 submit 到 GitHub,zeit 就能自动触发更新,这跟 GitHub Pages 是一样的。

于是,我把自定义域名到 Github Page 的 CNAME 记录,换成 zeit.co 提供的 TXT 和 CNAME 记录(TXT记录用来验证)。

后来,我发现更好的做法是,直接用 zeit 提供的 nameserver 智能 DNS,测下来解析比域名自带的免费 DNS 效果还要好。下图是他们的 CDN 节点分布,中国附近台湾和香港都有节点,国内访问应该速度不会太慢。

zeit cdn nodes

除了以上提到的这些,zeit 还提供了一些小 feature,比如免费的 HTTPS,基本GitHub Pages 有的 zeit 都有。对于免费用户,每个月流量限额是20G,这点对我来说已经远够用了。

Disclamer: 我没有收 zeit 任何推广费,纯粹是慕大神之名而来。
PS: 百度站长里 sitemap 提交了快一周,才收录了 11 篇文章,这速度真是慢。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK