解決百度爬蟲無法爬取 Github Pages 個人博客的問題

據 marketmechina 統計,去年12月份中國市場全平臺 (桌面+手機客戶端)搜索引擎市場份額:

  • Baidu: 67.09%
  • Sogou: 18.75%
  • Shenma: 6.84%
  • Google: 2.64%
  • bing: 2.6%
  • Other: 2.08%

不得不說,即使大家現在如此 diss 百度,這中文搜索的第一把交椅,百度還是坐的很穩。想要獲得中文搜索的流量,百度這一入口不容忽視。

GitHub Pages 個人博客

Github Pages 這項服務自上線後,很快就成為了程序員搭建靜態個人博客的最佳之選,大家喜歡的原因有很多,比如

  • 可以像寫 code 一樣寫文章
  • 可以通過命令行 git push 一鍵發佈網站,酷炫
  • 靜態網頁生成框架選擇眾多,插件完善,自定義性很高
  • 如果懂點前端,上手非常容易

更不用提版本追蹤、多人協作這些 Git 自帶的優勢了。2013年,我也是用 Jekyll 在 GitHub Pages 上搭了個人第一個博客。


解決百度爬蟲無法爬取 Github Pages 個人博客的問題


然而,2015年,因為一些不能細說的原因,Github 開始拒絕百度爬蟲的訪問,直接返回 403。

官方給出原因是,百度爬蟲爬得太狠,影響了 Github Page 服務的正常使用。這就導致了,但凡在 Github Page 搭建的個人博客,都無法被百度收錄。

自去年年底佛羅里達之行回來,我開始寫中文遊記,目前為止,Google 收錄非常及時全面,SEO 效果也很不錯。但如果只有國外的中文讀者可以搜索到這些文章,那國內這最大的一批中文讀者就被忽略了,再好的內容無法被分享出去也是白搭。

於是,我開始搗鼓如何讓百度爬蟲收錄我的個人博客。

CDN 解決不了問題

我在網上粗略搜了一番,不少人提到 CDN,然而,CDN 無法完美解決問題,尤其對小流量的個人博客。

傳送門:什麼是 CDN。


解決百度爬蟲無法爬取 Github Pages 個人博客的問題


先說結論,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!

寫這篇博客的時候剛好一週,從百度站長上看,文章正在慢慢被收錄。


解決百度爬蟲無法爬取 Github Pages 個人博客的問題

其實 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 節點分佈,中國附近臺灣和香港都有節點,國內訪問應該速度不會太慢。


解決百度爬蟲無法爬取 Github Pages 個人博客的問題

除了以上提到的這些,zeit 還提供了一些小 feature,比如免費的 HTTPS,基本GitHub Pages 有的 zeit 都有。對於免費用戶,每個月流量限額是20G,這點對我來說已經遠夠用了。

Disclamer: 我沒有收 zeit 任何推廣費,純粹是慕大神之名而來。PS: 百度站長裡 sitemap 提交了快一週,才收錄了 11 篇文章,這速度真是慢。


分享到:


相關文章: