一文搞懂分佈式進程爬蟲

來源:JAP君 
鏈接:https://mp.weixin.qq.com/s/7N6fRAq0tRiuVZeXxgbwLA

1.預備知識

今天咱們來扯一扯分佈式進程爬蟲,對爬蟲有所瞭解的都知道分佈式爬蟲這個東東,今天我們來搞懂一下分佈式這個概念,從字面上看就是分開來佈置,確實如此它是可以分開來運作的。

分佈式進程就是將進程分佈到多臺機器上去,充分利用每一臺機器來完成我們的爬蟲任務。分佈式進程需要用到multiprocessing模板,multiprocessing模板不但支持多進程,它的managers子模塊還支持把多進程分佈到多臺機器上。

我們可以寫一個服務進程作為調度者,然後將我們的爬蟲任務分佈給其他的多個進程當中去,我們依靠網絡通信來管理這些進程。

2.模擬一個分佈式進程爬蟲


我們來模擬進行一個分佈式進程的爬蟲吧,就比如我們需要抓取某個圖片網站的所有圖片,如果用我們的分佈式進程的思想,我們會創建一個進程負責抓取圖片的鏈接地址,然後將這些鏈接地址存放到Queue中,另外的進程負責從Queue中讀取鏈接進行圖片的下載或者進行其他操作(存在本地).

其實我們的Queue是暴露在網絡中的,通過分佈式就是將其進行了封裝,其實也就是所謂的本地隊列的網絡化。

接下來,我們來分析一下如何去創建一個分佈式的服務進程,總體可以分為六步:

  1. 首先我們需要建立一個隊列queue,這個主要用作進程之間的通信。總體來說就是兩種進程,一種是服務進程,一種是任務進程。服務進程創建任務隊列task_queue,用作傳遞任務給任務進程的通道。服務進程又創建result_queue,作為任務進程完成任務後回覆服務進程的通道。在分佈式進程的環境下,我們需要通過Queuemanager 獲得的Queue接口來添加任務。
  2. 把我們在第一步中隊列在網絡上進行註冊,暴露給其他的進程或者主機,註冊後獲得網絡隊列,相當於本地隊列的映像。
  3. 建立Queuemanager的對象,並且實例化,綁定端口和口令
  4. 啟動第三步中建立的實例,即啟動管理manager,監管信息通道
  5. 通過管理實例的方法獲取到通過網絡訪問的queue對象,也就是把網絡對象實體化成本地的一個隊列。
  6. 創建任務到“本地”隊列中,自動上傳任務到網絡隊列中,分配給任務進程進行處理。

我們就來寫一下服務進程的代碼 taskManager.py:

python爬蟲 | 一文搞懂分佈式進程爬蟲

python爬蟲 | 一文搞懂分佈式進程爬蟲

python爬蟲 | 一文搞懂分佈式進程爬蟲

上面就是我們的服務進程,我把解析都寫在了裡面,大家可以仔細看一下,接下來我們來寫任務進程(taskWorker),創建任務進程也比較簡單,只有簡單的四步:

1. 創建一個類似的QueueManager對象,使用QueueManager註冊用於獲取queue的方法名稱,任務進程只能通過名稱來在網絡上獲取queue,所以這裡一定要注意服務端和任務端的名稱要相同。

2. 鏈接服務器,端口和指令一定要與服務端相同

3. 從網絡上獲取queue,並且將其本地化。

4. 從task對列中獲取任務,並且把結果寫入result對列。

python爬蟲 | 一文搞懂分佈式進程爬蟲

python爬蟲 | 一文搞懂分佈式進程爬蟲

詳細的步驟也寫在裡面了,當然這個任務隊列,我們是可以創建多個的,每個任務進程都會完成自己的事,而不會干擾其他的任務進程,這也就讓我們的url不會重複的去爬取,從而完美的實現了多個進程來爬取我們的任務。

以上就是一個非常簡單的分佈式進程的爬蟲小案例,大家可以通過這種方式去實戰自己的一個小項目,在這裡還說一下,我們是可以將我們的任務分佈到多臺機器上的,這樣我們就實現了大規模的爬取。


分享到:


相關文章: