搜尋引擎手記(二)之爬蟲的開發
晴、南風
今天資料組開會說爬蟲已經開發完畢,在嘗試爬網站。由於我們採集的網站,網址都是固定的,並且爬蟲網頁深度為3。不需要像heritrix這些通用爬蟲那麼強大的功能。
爬蟲主要採用了httpclient和htmlparse兩個Java庫,爬蟲的架構思路借鑑了下面的思路。
一、 架構圖
那裡搜網絡爬蟲框架主要針對電子商務網站進行資料爬取,分析,儲存,索引。
爬蟲:爬蟲負責爬取,解析,處理網頁的內容
資料庫:儲存網頁資訊
索引:網頁內容的指紋資訊
Task佇列:需要爬取的網頁列表
Visited表:已經爬取過的網頁列表
爬蟲監控平臺:web平臺可以啟動,停止爬蟲,管理爬蟲,task佇列,visited表。
二、 爬蟲
1. 流程
1) Scheduler啟動爬蟲器,TaskMaster初始化taskQueue
2) Workers從TaskQueue
3) Worker執行緒呼叫Fetcher爬取Task中描述的網頁
4) Worker執行緒將爬取到的網頁交給Parser解析
5) Parser解析出來的資料送交Handler處理,抽取網頁Link和處理網頁內容
6) VisitedTableManager判斷從
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適配成sax的content handler。作為parser的回撥方法。不同事件解析出來的內容可以儲存在HandlingContext中。最後由Parser一起返回。
主動方式:需要解析整個HTML,選取自己需要的內容。對Parser提取的內容進行處理。XML需要解析成DOM結構。方便使用,可以使用Xpath,nodefilter等,但耗記憶體。
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
五、結束語
爬蟲是爬蟲組負責的開發,我沒有詳細的參與,具體的細節不是很清楚。不過,後來聽說爬蟲出現了經常掉線的問題。經常遭網站遮蔽,問題至今沒解決。
擅長爬蟲技術的,可以指導一下。
今天是難得的晴天。窗外,兩棵不知名的樹,樹葉也已經綠了。煥發生機的樹幹,直插雲端,讓遠方的天空,顯得那樣近,那麼藍。