1. 程式人生 > >初學者的分散式Python爬蟲教程

初學者的分散式Python爬蟲教程

下面是一個超級計算機的排行榜,如果我們能擁有其中任意一個,那麼我們就不需要搞什麼分散式系統。可是我們買不起,即使買得起,也交不起電費,所以我們只好費腦子搞分散式。

來自阿里的Python程式設計師,寫給初學者的分散式Python爬蟲教程!

 

分散式的本質就如上期提到的一個概念:分散式系統是若干獨立計算機的集合,這些計算機對於使用者來說就像是單個相關係統。這就是在說,把廉價的計算機堆到一起,通過程式控制,使其整體用起來像個高效能運算機,目的就是節約成本。

當然私信小編“01”可以獲取Python入門學習資料哦! 希望對你們有幫助!

來自阿里的Python程式設計師,寫給初學者的分散式Python爬蟲教程!

 

對於分散式爬蟲系統來說,假設1臺機器能10天爬完一個任務,如果部署10臺機器,那麼1天就會完成這個任務。這樣就用可以接受的成本,讓系統的效率提高了十倍。之前介紹的單機架構是達不到這種效果的,是時候介紹新的架構了!

架構概述

與第二期介紹的通用爬蟲架構不同,下面是一個聚焦爬蟲的架構圖,與前者相比,它不僅要儲存網頁,還要提取出網頁中的指定內容。

來自阿里的Python程式設計師,寫給初學者的分散式Python爬蟲教程!

 

Crawler_core 從任務佇列獲取爬蟲任務,請求網頁並將其儲存到Mongodb,同時解析出網頁中的URLs並快取到Redis。最後通知Common-clean-platform抽取網頁的指定欄位。

Common-clean-platform 收到Crawler_core的通知後,從Mongodb中取出網頁,根據配置進行資料抽取,形成結構化的資料,儲存到Mongodb。

Scheduler_manager 負責任務排程(如啟停),狀態控制(如爬取數量),redis資源清理等。

Resource_manager 封裝Mysql、Mongodb、Redis介面。Mysql儲存任務基本資訊、配置檔案、任務實時狀態等。Mongodb儲存網頁、結構化資料。Redis快取佇列、集合等資料結構。

Proxy 代理伺服器。建立網路爬蟲的第一原則是:所有資訊都可以偽造。你可以用非本人的郵箱傳送郵件,或者通過命令列自動化滑鼠的行為。但是有一件事情是不能作假的,那就是你的IP地址。如果你在爬取的過程中不想被人發現,或者不想IP被封殺,那麼就需要使用代理。

筆者以前看過一個電影叫《Who Am I – No System Is Safe》,劇中的黑客老大“Who Am I”就用代理來隱藏自己,躲避FBI和其他黑客組織的追蹤。

來自阿里的Python程式設計師,寫給初學者的分散式Python爬蟲教程!

 

不過最終他還是被抓了,看來即使用了炫酷的技術,也不是絕對安全的。

如果你也想體驗一下匿名訪問網路,可以試試Tor代理伺服器。洋蔥路由(The Onion Router)網路,常用縮寫為Tor,是一種IP 地址匿名手段。由網路志願者伺服器構建的洋蔥路由器網路,通過不同伺服器構成多個層(就像洋蔥)把客戶端包在最裡面。資料進入網路之前會被加密,因此任何伺服器都不能偷取通訊資料。另外,雖然每一個伺服器的入站和出站通訊都可以被查到,但是要想查出通訊的真正起點和終點,必須知道整個通訊鏈路上所有伺服器的入站和出站通訊細節,而這基本是不可能實現的。

Tor 是人權工作者和政治避難人員與記者通訊的常用手段,得到了美國政府的大力支援。當然,它經常也被用於非法活動,所以也是政府盯防的目標(雖然目前盯防得並不是很成功)。

流程控制 – 任務

Scheduler_manager定時讀取Mysql中的任務資訊,根據任務的週期等配置進行排程,下面是一個最基本的任務啟停流程。

來自阿里的Python程式設計師,寫給初學者的分散式Python爬蟲教程!

 

  1. 當一個任務可以開始時,Scheduler_manager會將其基本資訊(包括task_id,種子url,啟動時間等)插入Reids的任務佇列中。如果任務結束,就從佇列中刪除。
  2. 每個Crawler_core例項定時讀取Redis任務佇列中的任務,插入到本地的記憶體任務佇列中。
  3. 相同的任務可以存在於不同的Crawler_core例項中,一個Crawler_core例項中也可以有相同的任務。
  4. Crawler_core的抓取執行緒從記憶體佇列中獲得可執行的任務,依次抓取和解析。

流程控制 – 資料

現在每個Crawler_core例項都有了待處理的任務,接下來就要對每個任務的url進行處理了。繼續使用Redis作為公共快取來存放URLs,多個Crawler_core例項並行存取todo集合。

來自阿里的Python程式設計師,寫給初學者的分散式Python爬蟲教程!

 

  1. Todo集合 Crawler_core從集合中取出url進行處理,並將解析得到的url新增到todo集合中。
  2. Doing集合 Crawler_core從todo中取出url,都同時儲存到doing中,url處理完成時被從doing中刪除。主要用於恢復資料。
  3. Parser todo佇列 Crawler_core將已經儲存到mongodb的頁面的url傳送到parser todo佇列,Parser讀取資料後進行解析。
  4. Filter todo佇列 Parser將已經儲存到mongodb的解析結果的url傳送到filter todo佇列,Filter讀取資料後進行清洗。

流程控制 – 狀態

來自阿里的Python程式設計師,寫給初學者的分散式Python爬蟲教程!

 

藍色箭頭 業務模組實時更新任務狀態到Redis,StateObserver讀取到Redis狀態後,更新到mysql。

紅色箭頭 ClearObserver定時讀取Mysql狀態,若任務完成或中止,則清除任務所有的Redis key。

Redis中的任務資訊如下表所示:

來自阿里的Python程式設計師,寫給初學者的分散式Python爬蟲教程!

 

來自阿里的Python程式設計師,寫給初學者的分散式Python爬蟲教程!

 

來自阿里的Python程式設計師,寫給初學者的分散式Python爬蟲教程!

 

流程控制 – failover

如果一個Crawler_core的機器掛掉了,就會開始資料恢復程式,把這臺機器所有未完成的任務恢復到公共快取中。

來自阿里的Python程式設計師,寫給初學者的分散式Python爬蟲教程!

 

  1. 監控到192.168.0.1心跳停止。
  2. Master遍歷正在執行的任務: task_jdjr:1489050240345等。
  3. 得到doing和todo集合:
  4. task_jdjr:1489050240345:crawler:doing: 192.168.0.1
  5. task_jdjr:1489050240345:crawler:todo
  6. 將doing中的資料全部移動到todo中。