如何構建一個分散式爬蟲:基礎篇

發表於2017-06-08

上篇我們談論了Celery的基本知識後,本篇繼續講解如何一步步使用Celery構建分散式爬蟲。這次我們抓取的物件定為celery官方文件

首先,我們新建目錄distributedspider,然後再在其中新建檔案workers.py,裡面內容如下

上述程式碼主要是做Celery例項的初始化工作,include是在初始化celery app的時候需要引入的內容,主要就是註冊為網路呼叫的函式所在的檔案。然後我們再編寫任務函式,新建檔案tasks.py,內容如下

它的作用很簡單,就是抓取指定的url,並且把標籤為h1的元素提取出來

最後,我們新建檔案task_dispatcher.py,內容如下

這段程式碼的作用主要就是給worker傳送任務,任務是tasks.crawl,引數是url(元祖的形式)

現在,讓我們在節點A(hostname為resolvewang的主機)上啟動worker

這裡 -c指定了執行緒數為2, -l表示日誌等級是info。我們把程式碼拷貝到節點B(節點名為wpm的主機),同樣以相同命令啟動worker,便可以看到以下輸出

如何構建一個分散式爬蟲:基礎篇

兩個節點

可以看到左邊節點(A)先是all alone,表示只有一個節點;後來再節點B啟動後,它便和B同步了

這個時候,我們執行給這兩個worker節點傳送抓取任務

可以看到如下輸出

如何構建一個分散式爬蟲:基礎篇

分散式抓取示意圖

可以看到兩個節點都在執行抓取任務,並且它們的任務不會重複。我們再在redis裡看看結果

如何構建一個分散式爬蟲:基礎篇

backend示意圖

可以看到一共有11條結果,說明 tasks.crawl中返回的資料都在db2(backend)中了,並且以json的形式儲存了起來,除了返回的結果,還有執行是否成功等資訊。

到此,我們就實現了一個很基礎的分散式網路爬蟲,但是它還不具有很好的擴充套件性,而且貌似太簡單了…下一篇我將以微博資料採集為例來演示如何構建一個穩健的分散式網路爬蟲。


對微博大規模資料採集感興趣的同學可以關注一下分散式微博爬蟲,用用也是極好的

相關文章