摘要:可行性分析是通過來判定百度爬蟲并返回的。然而并沒有卵用參考資料如何解決百度爬蟲無法爬取搭建在上的個人博客的問題
本文最初發(fā)布于我的個人博客:咀嚼之味
我寫技術(shù)博客有兩個原因:一是總結(jié)自己近日的研究成果,二是將這些成果分享給大家。所以就我個人來說,還是比較希望寫出來的文章有更多的人能夠看到的。我最近注意到我的博客的流量大多來自于谷歌,而幾乎沒有來源于百度的。而本文就旨在提出這個問題,并嘗試著去解決這個問題。當(dāng)然,換一個云主機(jī)服務(wù)提供商能夠很直接明了地解決這個問題,但這不是本文的重點(diǎn),暫且不提。
為什么 Github Pages 禁用了百度爬蟲?就這個問題,我聯(lián)系了 Github Support 部門,對方給我的答復(fù)是這樣的:
Hi Jerry,
Sorry for the trouble with this. We are currently blocking the Baidu user agent from crawling GitHub Pages sites in response to this user agent being responsible for an excessive amount of requests, which was causing availability issues for other GitHub customers.
This is unlikely to change any time soon, so if you need the Baidu user agent to be able to crawl your site you will need to host it elsewhere.
Apologies again for the inconvenience.
Cheers,
Alex
簡單地來說,就是百度爬蟲爬得太猛烈,已經(jīng)對很多 Github 用戶造成了可用性的問題了,而禁用百度爬蟲這一舉措可能會一直持續(xù)下去。(不知道跟之前的 Great Cannon有沒有關(guān)系)
因此,只能自己動手豐衣足食了,下面來討論一下解決這個問題的方式。
解決問題 —— CDN我在知乎提了這樣一個問題:如何解決百度爬蟲無法爬取搭建在Github上的個人博客的問題?,并且 Stackoverflow 上也有類似的問題:github blocks Baidu spider, how can I make it work again。兩位知乎答主和Stackoverflow的評論都比較推薦使用 CDN 來解決這個問題。
那我們首先來了解一下 CDN 的原理。
CDN 的原理CDN 的全稱是 Content Delivery Network,即內(nèi)容分發(fā)網(wǎng)絡(luò),一般用于分發(fā)靜態(tài)內(nèi)容,比如圖片、視頻、CSS、JS文件。
如果不使用 CDN,那所有用戶的請求都會直接導(dǎo)向單一的源服務(wù)器(Origin Server)。而如果啟用了 CDN 服務(wù),那么 CDN 服務(wù)提供商會分配給你若干個節(jié)點(diǎn),這里以上圖為例,比如分配給你的服務(wù)器 3 個東海岸的節(jié)點(diǎn)和 3 個西海岸的節(jié)點(diǎn)。
此時用戶就不會直接向源服務(wù)器發(fā)送請求,而是向邊緣服務(wù)器(Edge Server)發(fā)送請求。再看下面這張示意圖,當(dāng)你第一次訪問資源 foo.png 時,邊緣服務(wù)器沒有 foo.png 的緩存。所以會由它向源服務(wù)器發(fā)送請求,并獲取到 foo.png。下一次所有經(jīng)過這個節(jié)點(diǎn)的請求,因?yàn)榇嬖诰彺娴木壒?,都不用再次向源服?wù)器發(fā)送請求,而是由邊緣服務(wù)器直接返回該文件的緩存即可。這樣一來就可以大大降低時延,也減小了源服務(wù)器的壓力。
那 CDN 服務(wù)是如何決定你從哪個邊緣服務(wù)器獲取資源的呢?其實(shí)就是在發(fā)送 DNS 請求的時候,將你要訪問的域名映射到最近的節(jié)點(diǎn)的 IP 上。具體判定哪個是最近的節(jié)點(diǎn),最簡單的策略就是根據(jù) IP,但各個 CDN 的服務(wù)提供商的策略可能各不相同,這里就不展開討論了。
CDN 的局限性CDN 確實(shí)能夠解決不少問題,但它本身也存在一定的局限性。其中最重要的一點(diǎn)是:決不能用 CDN 來緩存動態(tài)內(nèi)容。
來看一個例子,假設(shè)服務(wù)器端有這樣一個PHP文件 hello.php:
... Hello, = $name ?>
如果 CDN 緩存了這個文件就會造成很糟糕的后果。比如 Jerry 先訪問了 hello.php 頁面,得到了 Hello, Jerry 的內(nèi)容。此時這個內(nèi)容已經(jīng)被緩存到了節(jié)點(diǎn) A,而 Tom 同學(xué)也是離節(jié)點(diǎn) A 最近,那么 Tom 同學(xué)訪問 hello.php 時,就會直接得到緩存內(nèi)容:Hello, Jerry。這個時候 Tom 同學(xué)的內(nèi)心一定是崩潰的。
你還應(yīng)該避免使用 CDN 的情況有:根據(jù) user-agent 來選擇返回移動版還是桌面版頁面。UA 判斷這對解決我們的問題很重要,下文會提及。當(dāng)然,部署在 Github Pages 上的網(wǎng)站都是靜態(tài)站點(diǎn),所有用戶進(jìn)來看到的內(nèi)容一般是相同的。所以通過 CDN 來對全站進(jìn)行緩存沒有什么問題。
可行性分析Github是通過 UA 來判定百度爬蟲并返回 403 Forbidden 的。而百度爬蟲的 UA 一般是這樣的:
Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
那么使用 CDN 來解決這個問題的關(guān)鍵就在于,讓百度爬蟲不要直接向 Github 的服務(wù)器發(fā)送請求,而是通過 CDN 邊緣服務(wù)器的緩存來抓取網(wǎng)站的內(nèi)容。邊緣服務(wù)器本身是不會關(guān)心 UA 的,所以問題就迎刃而解了。
可是問題真有這么簡單嗎?
并不是。
來看一下,我使用百度站長工具來進(jìn)行抓取診斷的測試結(jié)果:
結(jié)果是只有偶爾能夠抓取成功,結(jié)果很讓人失望吧?讓我們來分析以下原因,首先羅列我目前可知的一些情況:
所有抓取成功的頁面都訪問了 209.9.130.5 節(jié)點(diǎn)
所有抓取失敗的頁面都訪問了 209.9.130.6 節(jié)點(diǎn)
我本機(jī)ping jerryzou.com會 ping 到 209.9.130.8 節(jié)點(diǎn)
好了,細(xì)心的同學(xué)應(yīng)該已經(jīng)發(fā)現(xiàn)問題所在了,百度爬蟲大部分的請求被導(dǎo)到了 209.9.130.6 節(jié)點(diǎn),但是這個節(jié)點(diǎn)上沒有頁面的緩存!!如果百度爬蟲是某個頁面的第一個訪問者,CDN 的邊緣服務(wù)器會用百度爬蟲的 UA 去請求 Github 的服務(wù)器,得到的結(jié)果自然是被拒絕了。
最終我們得到了通過 CDN 來解決這個問題的必要條件:你的博客必須有巨大的訪問量!這樣才能保證 CDN 的每一個邊緣服務(wù)器上都有任何一個頁面的緩存。我覺得除非像React主頁這樣的網(wǎng)站,不然要達(dá)到這個要求幾乎不可能的。
最后,一句話總結(jié):CDN 這一解決方案并不靠譜。
當(dāng)然,不死心的我還是做了件奇怪的事……首先我在找到了所有 BaiduSpider 的 IP,然后想要偽裝成這些 IP 來請求內(nèi)容,以此想在所有百度爬蟲可能爬取的邊緣服務(wù)器上都建立緩存。
$url, CURLOPT_TIMEOUT => 10, CURLOPT_HEADER => true, CURLOPT_HTTPHEADER => [ "X-FORWARDED-FOR: ".$ip, "CLIENT-IP: ".$ip ], CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_NOBODY => false, CURLOPT_REFERER => "http://test.jerryzou.com", CURLOPT_USERAGENT => "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36", ]); $response = curl_exec($ch); curl_close($ch); return $response; } $ipList = [ "203.125.234.1", "220.181.7.1", "123.125.66.1", "123.125.71.1", "119.63.192.1", "119.63.193.1", "119.63.194.1", "119.63.195.1", "119.63.196.1", "119.63.197.1", "119.63.198.1", "119.63.199.1", "180.76.5.1", "202.108.249.185", "202.108.249.177", "202.108.249.182", "202.108.249.184", "202.108.249.189", "61.135.146.200", "61.135.145.221", "61.135.145.207", "202.108.250.196", "68.170.119.76", "207.46.199.52", ]; foreach ($ipList as $ip) { Curl("http://jerryzou.com", $ip); echo "$ip "; } echo "Done ";
然而并沒有卵用……
參考資料如何解決百度爬蟲無法爬取搭建在Github上的個人博客的問題?
Wikipedia: Content delivery network
How content delivery networks (CDNs) work
Baiduspider using multiple User Agents how to stop them?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/10934.html
摘要:也許有人看過我之前的一篇博文解決禁止百度爬蟲的方法與可行性分析。為了解決文章中的這個問題,我最后建立了一個只服務(wù)于百度爬蟲的一個備份服務(wù)器。于是我要完成的事情便是完成一個能夠?qū)⑽易钚掳姹镜牟┛?,隨時同步到備份服務(wù)器的。 本文最初發(fā)布于我的個人博客:咀嚼之味 Webhook,也就是人們常說的鉤子,是一個很有用的工具。你可以通過定制 Webhook 來監(jiān)測你在 Github.com 上的各...
摘要:最近在研究區(qū)塊鏈,閑來無事抓取了拉勾網(wǎng)上條區(qū)塊鏈相關(guān)的招聘信息。拉勾網(wǎng)的反爬蟲做的還是比較好的,畢竟自己也知道這種做招聘信息聚合的網(wǎng)站很容易被爬,而且比起妹子圖這種網(wǎng)站,開發(fā)的技術(shù)水平應(yīng)該高不少。 最近在研究區(qū)塊鏈,閑來無事抓取了拉勾網(wǎng)上450條區(qū)塊鏈相關(guān)的招聘信息。過程及結(jié)果如下。 拉勾網(wǎng)爬取 首先是從拉勾網(wǎng)爬取數(shù)據(jù),用的requests庫。拉勾網(wǎng)的反爬蟲做的還是比較好的,畢竟自己也...
摘要:原作者原鏈接基于多入口生成模板用于服務(wù)端渲染的方案及實(shí)戰(zhàn)法律聲明警告本作品遵循署名非商業(yè)性使用禁止演繹未本地化版本協(xié)議發(fā)布。這是什么背景現(xiàn)代化的前端項(xiàng)目中很多都使用了客戶端渲染的單頁面應(yīng)用。 原作者:@LinuxerPHL原鏈接:基于 Webpack 4 多入口生成模板用于服務(wù)端渲染的方案及實(shí)戰(zhàn) 法律聲明 警告:本作品遵循 署名-非商業(yè)性使用-禁止演繹3.0 未本地化版本(CC BY-...
摘要:原作者原博文地址基于多入口生成模板用于服務(wù)端渲染的方案及實(shí)戰(zhàn)法律聲明警告本作品遵循署名非商業(yè)性使用禁止演繹未本地化版本協(xié)議發(fā)布。這是什么背景現(xiàn)代化的前端項(xiàng)目中很多都使用了客戶端渲染的單頁面應(yīng)用。 原作者:@LinuxerPHL原博文地址: 基于 Webpack 4 多入口生成模板用于服務(wù)端渲染的方案及實(shí)戰(zhàn) 法律聲明 警告:本作品遵循 署名-非商業(yè)性使用-禁止演繹3.0 未本地化版本(...
摘要:比如我們可以設(shè)置這就代表我們設(shè)置的規(guī)則對百度爬蟲是有效的。上一篇文章網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)使用解析鏈接下一篇文章網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)基本使用 上一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---22、使用Urllib:解析鏈接下一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---24、requests:基本使用 利用 Urllib 的 robotparser 模塊我們可以實(shí)現(xiàn)網(wǎng)站 Robots 協(xié)議的分析,本節(jié)我們來簡...
閱讀 1442·2023-04-25 17:18
閱讀 1882·2021-10-27 14:18
閱讀 2123·2021-09-09 09:33
閱讀 1839·2019-08-30 15:55
閱讀 2016·2019-08-30 15:53
閱讀 3439·2019-08-29 16:17
閱讀 3429·2019-08-26 13:57
閱讀 1730·2019-08-26 13:46