1. 程式人生 > >搜尋引擎手記(二)之爬蟲的開發

搜尋引擎手記(二)之爬蟲的開發

2015 3 23日 ( 星期一 ) 

晴、南風

  今天資料組開會說爬蟲已經開發完畢,在嘗試爬網站。由於我們採集的網站,網址都是固定的,並且爬蟲網頁深度為3。不需要像heritrix這些通用爬蟲那麼強大的功能。

爬蟲主要採用了httpclienthtmlparse兩個Java庫,爬蟲的架構思路借鑑了下面的思路。

一、        架構圖

那裡搜網絡爬蟲框架主要針對電子商務網站進行資料爬取,分析,儲存,索引。
 

爬蟲:爬蟲負責爬取,解析,處理網頁的內容

資料庫:儲存網頁資訊

索引:網頁內容的指紋資訊

Task佇列:需要爬取的網頁列表

Visited表:已經爬取過的網頁列表

爬蟲監控平臺:web平臺可以啟動,停止爬蟲,管理爬蟲,task佇列,visited表。

二、 爬蟲

1.      流程

1)       Scheduler啟動爬蟲器,TaskMaster初始化taskQueue

2)       WorkersTaskQueue

中獲取任務

3)       Worker執行緒呼叫Fetcher爬取Task中描述的網頁

4)       Worker執行緒將爬取到的網頁交給Parser解析

5)       Parser解析出來的資料送交Handler處理,抽取網頁Link和處理網頁內容

6)       VisitedTableManager判斷從

URLExtractor抽取出來的連結是否已經被爬取過,如果沒有提交到TaskQueue



 

2.      Scheduler

Scheduler負責啟動爬蟲器,呼叫TaskMaster初始化TaskQueue,同時建立一個monitor執行緒,負責控制程式的退出。

3.      Task Master

  工作管理員,負責管理任務佇列。工作管理員抽象了任務佇列的實現。

在現階段,我們用mysql作為任務佇列的實現。可供替代的還有Redis

工作管理員的處理流程:

1)        工作管理員初始化任務佇列,任務佇列的初始化根據不同的配置可能不同。增量式的情況下,根據指定的URL List初始化。而全文爬取的情況下只預先初始化某個或幾個電子商務網站的首頁。

2)       工作管理員建立monitor執行緒,控制整個程式的退出

3)       工作管理員排程任務,如果任務佇列是持久化的,負責從任務佇列伺服器load任務。需要考慮預取。

4)       工作管理員還負責驗證任務的有效性驗證,爬蟲監控平臺可以將任務佇列中的某些任務設為失效?

4.      Workers

  Worker執行緒池,每個執行緒都會執行整個爬取的流程。可以考慮用多個執行緒池,分割非同步化整個流程。提高執行緒的利用率。

5.      Fetcher

  Fetcher負責直接爬取電子商務網站的網頁。用HTTP Client實現。HTTP core 4以上已經有NIO的功能NIO實現。

Fetcher可以配置需不需要儲存HTML檔案

6.      Parser

  Parser解析Fetcher獲取的網頁,一般的網頁可能不是完好格式化的(XHTML是完美格式化的),這樣就不能利用XML的類庫處理。我們需要一款比較好的HTML解析器,可以修復這些非完好格式化的網頁,我們採用的是htmlparse

7.      Handler

  Handler是對Parser解析出來的內容做處理。

回撥方式(visitor):對於SAX event處理,我們需要將handler適配成saxcontent handler。作為parser的回撥方法。不同事件解析出來的內容可以儲存在HandlingContext中。最後由Parser一起返回。

  主動方式:需要解析整個HTML,選取自己需要的內容。對Parser提取的內容進行處理。XML需要解析成DOM結構。方便使用,可以使用Xpathnodefilter等,但耗記憶體。

ContentHandler:它還包含元件ContentFilter。過濾content

URLExtractor負責從網頁中提取符合格式的URL,將URL構建成Task,並提交到Task queue中。

8.      VisitedTableManager

  訪問表管理器,管理訪問過的URLs。提取統一介面,抽象底層實現。如果URL被爬取過,就不會被新增到TaskQueue中。

三、        Task佇列

  Task佇列儲存了需要被爬取的任務。任務之間是有關聯的。我們可以儲存和管理這個任務關係。這個關係也是URL之間的關係。儲存下來,有助於後臺形成Web圖,分析資料。

Task佇列在分散式爬蟲叢集中,需要使用集中的伺服器存放。一些輕量級的資料庫或者支援列表的NoSql都可以用來儲存。可選方案:

1)         mysql儲存。

2)         Redis儲存

四、        Visited

  Visited表儲存了已經被爬的網站。每次爬取都需要構建。

  針對目前的資料量,採用mysql

五、結束語

  爬蟲是爬蟲組負責的開發,我沒有詳細的參與,具體的細節不是很清楚。不過,後來聽說爬蟲出現了經常掉線的問題。經常遭網站遮蔽,問題至今沒解決。

擅長爬蟲技術的,可以指導一下。

     今天是難得的晴天。窗外,兩棵不知名的樹,樹葉也已經綠了。煥發生機的樹幹,直插雲端,讓遠方的天空,顯得那樣近,那麼藍。