這幾個(gè)月在公司里面寫看好多個(gè)爬蟲,一直沒什么時(shí)間分析。今天由于寫了兩周的項(xiàng)目被最終棄用了(手動(dòng)哭臉),很是忐忑啊,今天就趁剩下不用干活的時(shí)間分享一個(gè)之前寫的Instagram的一個(gè)分布式爬蟲。
爬蟲的需求如下,根據(jù)用戶提供的明星字段(放在mongodb的一張表里面),然后拼接成明星主頁(yè)的url,通過(guò)訪問明星主頁(yè)的url,獲取明星的最新動(dòng)態(tài),然后下載明星發(fā)布的新的圖片以及視頻,儲(chǔ)存在服務(wù)器。由于需要爬取的明星量過(guò)多以及以及頻率的需求,所以需要用分布式實(shí)現(xiàn)。
了解完需求之后實(shí)現(xiàn)起來(lái)就不難了,下面看一下這個(gè)簡(jiǎn)單的流程圖。

我們先選取一臺(tái)做master的服務(wù)器,這里主要裝好redis就可以了,甚至python都可以不用裝,剩下的worker就監(jiān)聽這個(gè)redis服務(wù)器上是否添加了url,一旦檢測(cè)到有待爬取url就會(huì)提取然后進(jìn)行爬取,要實(shí)現(xiàn)這個(gè)功能只需要在scrpay里面做以下修改就可以了

注意箭頭方向,這里是跟單機(jī)scrapy最大的區(qū)別。設(shè)置完了之后去settings里面做一點(diǎn)數(shù)據(jù)庫(kù)以及調(diào)速器的更換,如圖

主要是箭頭所指的三個(gè)改變,添加完這三個(gè)其實(shí)就可以實(shí)現(xiàn)一個(gè)分布式爬蟲了,所有的我worker代碼都是一樣的,他們都會(huì)監(jiān)聽master上redis數(shù)據(jù)庫(kù),一旦發(fā)現(xiàn)列表ins_urls有新的url,就會(huì)直接取到然后進(jìn)行爬取,一旦某臺(tái)worker取到了這個(gè)url,其他機(jī)器是取不到的,至于為什么是ins_urls字段,可以看看我們第二幅圖的redis_key,就是在那里定義的。好了,這樣一個(gè)簡(jiǎn)單的分布式抓取就完成了。
但是這僅僅是數(shù)據(jù)抓取的實(shí)現(xiàn),對(duì)于一個(gè)爬蟲工程師來(lái)說(shuō)做到這里肯定是不夠的呀,例如怎么一鍵關(guān)閉所有worker???如何一鍵把爬蟲全部部署到worker上?怎么監(jiān)控哪臺(tái)worker掛掉了???改代碼了怎么辦,每臺(tái)worker登錄上去改代碼嗎?等等各種問題。下面介紹本次爬蟲用到的一個(gè)比較簡(jiǎn)單的解決辦法(當(dāng)然更高端的我下次再更新,耶)
首先的部署,本次的分布式部署用的是scrapyd,這是一個(gè)服務(wù),可以直接pip install scrapyd安裝好就可以直接用scrapyd命令啟動(dòng)了。然后就可以直接用一句命令把本地scrapy代碼部署到啟用了scrapyd的worker機(jī)器上了,不過(guò)首先在本地的scrapy.cfg文件里面加上要部署到的機(jī)器的ip上,也就是要部署到哪臺(tái)worker的機(jī)器上,如圖

之后就可以一條命令部署了,如圖

這是scrapyd的官網(wǎng)圖片,照著填完參數(shù)就好了。這就可以臺(tái)機(jī)器一條名利部署上去了,但是還是太慢了是吧,這個(gè)時(shí)候偶然請(qǐng)教了一下大才哥(靜覓博客的博主),這家伙真是吊炸天,自己基于scrapyd開發(fā)了一個(gè)部署工具,我們自己完全就不用記scrapyd的用法,這個(gè)工具可以直接用pip install gerapy安裝,使用非常簡(jiǎn)單,如圖




這里僅僅展示了他簡(jiǎn)單的用法,如果需要添加worker主機(jī),直接寫ip就好了,然后里面有代碼打包功能,可以一鍵部署,這樣一句命令都不行寫了,

而且可以隨時(shí)查看爬蟲的日志。順便說(shuō)一下,大才的新書也要介紹自己gerapy的使用,想要gerapy的文檔的可以問我要。
至于怎么監(jiān)控哪臺(tái)worker掛掉了,我用的是最簡(jiǎn)單的辦法,添加了一個(gè)中間件,判斷每一次訪問的返回值,如圖

最后一個(gè)要解決的是worker的scrapyd服務(wù)的穩(wěn)定開啟,現(xiàn)在我比較喜歡用dockerd穩(wěn)定運(yùn)行這個(gè)服務(wù),這個(gè)留在下個(gè)版本再寫。這次是運(yùn)維做鏡像,我現(xiàn)在一臺(tái)機(jī)器上運(yùn)行了scrapyd,然后寫了一個(gè)shell腳本,類似這樣

這是兄弟連老師的上課截圖,我們把里面的httpd換成scrapyd,還有else下面的啟動(dòng)換成scrapyd就好了,我自己的那份被運(yùn)維刪除了,懶得寫,就用這個(gè)了。
好了,現(xiàn)在一個(gè)比較健壯的Instagram分布式爬蟲已經(jīng)搭建完畢了。開了十臺(tái)服務(wù)器,時(shí)刻監(jiān)控著哪些明星發(fā)布了的新動(dòng)態(tài),平均每天每臺(tái)機(jī)器每天抓到的小視頻還有圖片大概500M左右,幾萬(wàn)連接控制在20分鐘消化掉了,其實(shí)這里主要是下載時(shí)間還有下載之后回傳國(guó)內(nèi)消耗的時(shí)間。