1. 程式人生 > >資料爬蟲綜述

資料爬蟲綜述

隨著大資料時代的來臨,網際網路對人類的生活影響越來越深入,已經成為人類獲取資訊的主要來源之一。網際網路為使用者帶來海量資料的同時也帶來了困擾,如何及時獲得有效資訊成為研究重點。搜尋引擎根據預定的策略從網際網路上發現和抓取資料,存入本地;對資料進行去噪、抽取和生成索引等處理,最終為使用者提供資訊檢索服務,將相關資訊展示給使用者的系統。

爬蟲(Crawler)是搜尋引擎架構中的最底層模組,以一定的策略從網際網路上抓取資料,並對資料進行預處理,然後將處理後的資料提交給搜尋引擎其他模組,資料的質量和數量直接影響使用者的體驗。但是,隨著大資料時代網際網路資料爆炸式增長,爬蟲抓取資料的速度越來越不能滿足實際應用的需要。解決這個問題主要從軟硬體考慮:一是升級爬蟲的硬體,使用效能更好的硬體裝置,但價效比不高,且不易擴充套件;二是利用分散式方式提高爬蟲的並行處理能力,但這種方法會增加爬蟲系統設計的複雜度。

目前,大多數大型爬蟲系統採用的是分散式方式,但仍然不能滿足使用者的實際需要。其次,爬蟲系統還需解決網頁動態變化導致本地副本過期的問題。網頁隨時都可能變化,有的幾小時更新一次,爬蟲系統必須及時的發現並更新本地的網頁,但網際網路海洋中網頁數量多、分佈廣,爬蟲系統更新一遍需要數週甚至更長的時間,使得本地庫中網頁副本時新性較低。因此,一個採集速度快,網頁更新及時的高可靠爬蟲系統,不僅僅為搜尋引擎提供基礎資料,也可以為資料分析、挖掘提供基礎資料,從而獲得資訊、知識。

Nutch Apache 軟體基金會的一個開源專案,由Java 編寫的可擴充套件和可伸縮的搜尋引擎,具有跨平臺的優點,使用基於模組化的思想設計。它基於

Hadoop的分散式處理模型保證了系統的效能,類似Eclipse 的外掛機制有利於使用者自定義擴充套件NutchNutch 為我們研究搜尋引擎爬蟲的原理及工作機制提供了一個很好的平臺。

Nutch 有兩種執行模式:分散式模式和單機模式。分散式模式採用HDFS 作為儲存檔案系統,並利用MapReduce 實現爬蟲抓取網頁的各個環節,從而使Nutch 能夠抓取、儲存海量網頁。Nutch有兩部分:爬蟲和檢索。爬蟲負責從網際網路抓取資料儲存在本地,索引程式對抓取在本地的資料建立索引,然後儲存在索引庫。檢索程式接收使用者的查詢請求,搜尋索引庫中的索引並返回結果。

Nutch 爬蟲系統是由爬蟲程式以及用於維護相關資料結構的程式組成,採用外掛機制進行設計,因此可以很清晰地分離出爬蟲執行各階段的任務。

Nutch 的爬蟲通過累積式抓取和增量式抓取方式從網際網路中將網頁抓下來,分散式模式下將資料儲存在HDFS 中,為其他模組提供基礎資料。在 Hadoop 分散式平臺下,Nutch 在抓取資料的各階段都向Hadoop 提交MapReduce job,且這些job 都有嚴格的前後順序關係。

Nutch 爬行工作流程如下:

1)建立初始種子URL 集:一般新建一個檔案包含指定的網址,上傳到HDFS上。非全網爬行時,還需在$NUTCH_HOME/conf/regex-urlfilter.txt 檔案中設定超連結的過濾規則,過濾掉不合規則的URL

2Inject:該操作是由org.apache.nutch.crawl 包中的Injector 類完成,將URL集註入 CrawlDB 資料庫。利用外掛 URL Normalizers URL Filters URL 格式化、過濾,消去重複的URL,並設定URL 狀態和初始化分值,再更新CrawlDB 資料庫中相對應的內容,並標記已經爬行的URL

3Generate:該操作是由org.apache.nutch.crawl 包中的Generator 類完成,從CrawlDB 資料庫中取出URL 建立抓取列表。當一次爬行完成後, Generate 階段利用CrawlDB 庫中的資訊對已爬的URL進行過濾,之後運用Hash 演算法對URL 進行降序排列,結果存入segments 目錄下的一個目錄,目錄名是一個時間戳。迴圈爬行多少次,segments 目錄下就有多少這樣的檔案;

4Fetch:該操作是由org.apache.nutch.fetcher 包中的Fetcher 類完成,執行抓取,獲取網頁資訊。抓取按 segments 目錄下的URL 列表進行,可以自定義爬行的深度(depth)及執行緒數,適度的增加執行緒數可以很好地提高Nutch 爬行的效率。網頁結果儲存在segments 相對應的目錄下;

5Parse:該操作是由org.apache.nutch. parse 包中的ParseSegment 類完成。對 Fetch 抓到的網頁進行解析,得到parse-data parse-text 兩個目錄。parse-text 目錄儲存的是網頁的文字資訊,parse-data 目錄儲存的是日期、超連結、題名等其他網頁資訊;

6Update CrawlDB:該操作是由org.apache.nutch.crawl 包中的CrawlDb 類完成。根據抓取下來的 segments 目錄下的內容更新CrawlDB資料庫,更新包括URL爬行週期、爬行間隔、網頁指紋等,還要將Parse 階段解析出的新的URL 加入到CrawlDB,為新的抓取提供URL 列表;

7)迴圈執行36 的步驟,直到depth 的值。以上迴圈過程可以總結為“產生/抓取/更新”迴圈;

8Update LinkDBNutch 爬行結束後,更新LinkDB 並建立索引。

Nutch 網頁更新機制採用的是鄰比法。對第一次採集的網頁,鄰比法設定其更新時間為初始值。如果該網頁在這個時間內更新了,則更新時間縮小一定值;如果沒有更新,則更新時間增加一定值。Nutch 網頁更新機制我們稱為Recrawl 機制,它提供Adaptive FetchSchedule class 來管理爬蟲的重新抓取。

Nutch作為開源的搜尋引擎框架,能夠得到極速的發展使用,不僅是因為Nutch具有以上的功能,還有一項重要的機制促使了Nutch的快速發展,那便是Nutch的外掛機制,這種機制極大地方便了研究工作,通過這個擴充套件機制,能滿足了個性化需求。Nutch的外掛機制的基本思想是借鑑了Eclipse軟體對外掛的使用。其優點主要體現為以下幾點:

1.可擴充套件性。外掛機制的使用,極大地提高了Nutch對於不同應用的擴充套件,在實際開發中只需要對特定的介面進行簡單的實現,便能夠生成具有特定功能的搜尋引擎,滿足了各種特色的搜尋服務。

2.靈活性。外掛擁有著強大的資源庫,這些外掛都在Nutchplugins中,開發者在使用Nutch框架定製符合自己需求的外掛,,比如:開發者可以選擇不同的實現演算法,尋找滿足自己需要的最優解,也可以增加對不同格式文件的分析解壓。

3.可維護性。每個開發者只需要關注自己需要關注的問題,如核心的開發者為引擎核心擴充套件時,只需新增一個描述它的介面;plugin的開發者只需關注這個plugin所要實現的功能,不需要完全瞭解整個系統工作的工作流程。僅僅需要知道pluginplug之間交換的資料型別。這使得核心更加簡單,也更容易維護。

外掛機制在Nutch中的實現,是由Nutch框架提供的擴充套件點,為其增加一系列的擴充套件項,從而實現複雜的業務功能。

Nutch的爬蟲屬於普通的爬蟲,這樣的爬蟲在工作的時候,首先要選好一定的URL集合作為一個起始佇列。爬蟲通過爬取、解析等過程,獲取到網頁上新的URL,並且把這些URL新增到佇列之中,當第一輪抓取完成之後,就會繼續以這些獲取到的新的URL為起始地址,繼續向深層次抓取,如此迴圈抓取,直到滿足抓取停止的條件或者佇列為空,爬蟲才會停止工作。普通的爬蟲一般會包括待爬行佇列模組,獲取網頁模組,頁面解析模組等。

與普通爬蟲相比,主題爬蟲一般會增加一個主題相關度判斷的模組,也是主題爬蟲的核心模組。該模組負責爬蟲在抓取到網頁之後,對網頁的內容進行一次主題判斷,如果判斷結果為與主題相關或者相近,則該頁面可以保留;若判斷結果為該頁面與主題無直接關係,則可以認為這個頁面對於抓取後的操作意義不大,可以直接捨棄。由此可以推斷出,抓取頁面質量的優劣直接有主題爬蟲設計的好壞決定,而主題爬蟲好壞又直接受到主題相關度判斷模組影響。

目前,主要的主題爬蟲爬行策略有兩種:一是廣度優先搜尋策略,二是最佳優先搜尋策略。二者各有優點和缺點,很多時候都是結合著使用的。

廣度優先搜尋策略是一種圖形搜尋演算法,在網際網路上,網頁與網頁之間相聯絡是靠URL,假設通過頁面A上的某一URL可以跳轉到頁面B,則可以認為頁面A為上層,頁面B為下層。廣度優先搜尋策略都是按照層次搜尋的,總是優先搜尋上層的結點,從根節點出發,逐層向下搜尋新的與上層鄰近的節點,網頁的存在基本上就是被URL分成了層。

最佳優先搜尋策略的實施與網頁評分相關聯。進行最佳優先搜尋,要給每一個頁面進行一個打分,分數的高低也直接決定了網頁的優劣。網頁抓取到之後,也會根據網頁的分數的高低將網頁放入佇列,便於下一輪的抓取操作。該演算法相較於廣度優先搜尋策略有一定的優勢,但是也存在自身的缺點,就是網頁的主題性往往是不連貫的,需要經過多層的網頁也許才會到達另一個與主題相關的網頁,這就產生了“隧道”現象。