爬蟲(二)-關於單體爬蟲的設計問題

本文的前提是:不考慮分佈式及集羣形式的爬蟲,從單體爬蟲入手,分析爬蟲的各組成部分及設計思路。

一.宏觀分析

首先從宏觀上理解,爬蟲主要的作用是在最短的時間內爬取最多的質量最高的網頁,爲之後的索引階段提供最基本的數據源。

上一篇文章從圖論遍歷的角度分析了爬蟲的爬行算法-BFS及DFS,實際上在真正的大型爬蟲系統中,爬行算法的選擇並不是絕對的,比如一般來說對某個domain的爬取工作可能是由爬蟲集羣中的某個或多個爬蟲節點來完成,那麼這些爬蟲節點用的就是BFS,而對於整個爬蟲集羣來說就是用的DFS,整個爬蟲集羣的結構可能如下(雖然本文的前提是隻考慮單體爬蟲,但我還是忍不住考慮實際生產環境中的設計問題):

130816698.png

通過一個scheduler system(調度系統)分配需要爬取的URL,而具體的crawler node(爬蟲節點)去做具體爬取的工作。

二.逐步分解

在面對一個複雜問題時我們通常的做法將其分解爲多個小問題進行各個擊破,如在算法設計時經常使用的分治思想,同樣的在考慮單體爬蟲的設計問題時我們也可以借鑑此方式。

單體爬蟲各組成部分分析:

1.首先我們需要一個存放待爬取URL的隊列,習慣稱爲TODO Queue。

這部分需要針對我們的target data source-需要爬取的網頁數量決定採用何種數據結構或存儲技術,是採用內存數據結構如鏈表、優先級隊列,還是採用內存數據庫如BerkeleyDB,還是採用relationDB(關係型數據庫)?該部分將在後一篇博文中討論。

2.其次我們需要一個存放已爬取URL的集合,習慣稱爲Visited Set。

該部分在整個爬行過程中訪問率很高,還需要考慮訪問速度、空間佔用等問題,將在之後進行討論。

3.第三我們需要一個網頁下載服務,從服務器下載網頁代碼。

該部分需要考慮帶寬的使用率及握手次數對下載速度的影響,我們也放在該系列博文之後進行討論。

4.第四我們需要一個網頁解析服務,來從網頁代碼中提取URL。

該部分本應該是爬蟲中最簡單的,但是存在一個問題:動態網頁的URL提取。

各大搜索引擎提供商面對這個問題時都採取了另外一種策略-SEO優化,在這裏我們只從純技術角度去討論如何對動態網頁進行URL提取,之後進行討論。

於是我們有了下圖:

134006698.png

單體爬蟲的組成還是相當簡單的,之後我們討論爬蟲各部分的設計思路並寫一些小demo.

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