【爬蟲】手把手教你寫網絡爬蟲(6)


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

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

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

 

架構概述

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

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 AmI”就用代理來隱藏自己,躲避FBI和其他黑客組織的追蹤。

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

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

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


流程控制 – 任務

Scheduler_manager定時讀取Mysql中的任務信息,根據任務的週期等配置進行調度,下面是一個最基本的任務啓停流程。

  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集合。

  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發送到filtertodo隊列,Filter讀取數據後進行清洗。

流程控制 – 狀態

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

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

Redis中的任務信息如下表所示:




流程控制 – failover

如果一個Crawler_core的機器掛掉了,就會開始數據恢復程序,把這臺機器所有未完成的任務恢復到公共緩存中。

  1. 監控到192.168.0.1心跳停止。

  2. Master遍歷正在運行的任務: task_jdjr:1489050240345等。

  3. 得到doing和todo集合:

    a)    task_jdjr:1489050240345:crawler:doing:192.168.0.1

    b)    task_jdjr:1489050240345:crawler:todo

  4.  將doing中的數據全部移動到todo中。


下一步

今天對架構和流程進行了一個概要的介紹,細節問題以後會慢慢說。下期我們就先聊聊URL去重那些事兒。



微信掃一掃
關注該公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章