摘要:網(wǎng)絡(luò)爬蟲是搜索引擎的重要組成部分,它在搜索引擎中負責網(wǎng)絡(luò)信息的采集。詳細介紹了Web_Crawler,一種優(yōu)化的網(wǎng)絡(luò)爬蟲的設(shè)計和實現(xiàn),包括系統(tǒng)框架、主要模塊、多線程工作和數(shù)據(jù)緩沖池的轉(zhuǎn)存技術(shù)。Web-Crawler主要從多線程并行下載提高了速度,并利用數(shù)據(jù)緩沖池轉(zhuǎn)存技術(shù)在實現(xiàn)快速檢索的同時減少了存儲空間需求這兩方面來優(yōu)化網(wǎng)絡(luò)爬蟲。
關(guān)鍵詞:搜索引擎;信息采集;網(wǎng)絡(luò)爬蟲;數(shù)據(jù)緩沖池
中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2008)35-2082-02
Design and Implementation of a optimized Web-Crawler
CAO Zhong1,ZHAO Wen-jing2
(1.College of Computer and Educational Software,Guangzhou University,Guangzhou 510006,China;2.Center of Experiment,Guangzhou University,Guangzhou 510006,China)
Abstract: Web-Crawler is a important part of search engine,it is responsible for the network information gathering.The paper introduce the design and implement of a optimized Web-Crawler.It include the frame,Main module, multi-thread work and the data buffer pool Shift memory technology. Web-Crawler depends Multi-thread parallel downloading enhanced the speed,and uses the data buffer pool Shift memory technology to realize Fast retrieval and Reduced the storage space demand.
Key words: search engine; information gathering; web-crawler; data buffer pool
1 引言
搜索引擎(Search Engine)是隨著Web信息的迅速增加,從90年代中期開始逐漸發(fā)展起來的技術(shù)。面對Internet上浩如煙海的信息,搜索引擎主要功能就是方便人們快速地在Internet上找到自己所關(guān)心的信息。 網(wǎng)絡(luò)爬蟲程序是搜索引擎的重要組成部分。它通過請求站點上的HTML文檔訪問某一站點,它遍歷Web空間,不斷從一個站點移動到另一個站點,自動建立索引,并加入到網(wǎng)頁數(shù)據(jù)庫中。網(wǎng)絡(luò)爬蟲進入某個超級文本時,它利用HTML語言的標記結(jié)構(gòu)來搜索信息及獲取指向其他超級文本的URL地址,可以完全不依賴用戶干預(yù)實現(xiàn)網(wǎng)絡(luò)上的自動爬行和搜索。是整套搜索系統(tǒng)的流程啟動者。其設(shè)計的好壞和性能的優(yōu)劣直接影響系統(tǒng)的性能。
網(wǎng)絡(luò)爬蟲的主要功能包括:
1) 通過HTTP協(xié)議,從Internet中抓取網(wǎng)頁信息;
2) 判斷頁面內(nèi)容有無重復(fù);
3) 從頁面信息中提取URL,并判斷提取的URL的可用性;
4) 判斷獲取的URL是否已被訪問過,若未訪問則將此URL放入待訪問隊列中。
該文介紹了一種優(yōu)化的網(wǎng)絡(luò)爬蟲Web_Crawler的設(shè)計方案。由于網(wǎng)絡(luò)信息量的巨大,網(wǎng)絡(luò)爬蟲多采用多機并行的設(shè)計方案。
2 系統(tǒng)框架
Web_Crawler采用多機并行的設(shè)計方案。系統(tǒng)中包括一個本地配置器(Local Collocation)和多個網(wǎng)絡(luò)爬蟲Web_Crawler。本地配置器對被搜索的網(wǎng)絡(luò)進行邏輯劃分,并把劃分后的邏輯分區(qū)分配給每個網(wǎng)絡(luò)爬蟲。每一個網(wǎng)絡(luò)爬蟲采用多線程負責下載自己負責的邏輯分區(qū)內(nèi)的網(wǎng)頁,并通過本地配置器來相互交換下載任務(wù),相互之間通過高速的局域網(wǎng)進行通信。它們使用本地存儲空間存儲下載的網(wǎng)頁,但在存入本地存儲空間之前使用數(shù)據(jù)緩沖池進行轉(zhuǎn)存,在緩沖池中進行信息的標引,處理后的結(jié)果被集中保存在媒體內(nèi)容數(shù)據(jù)庫中以供檢索程序使用。整個系統(tǒng)框架如圖1 所示。
Web_Crawler:網(wǎng)絡(luò)爬蟲;
Local Collocation:本地配置器;
Data Buffer Pool:數(shù)據(jù)緩沖池;
Information Index Engine:信息標引引擎;
Media Content DataBase:媒體內(nèi)容數(shù)據(jù)庫。
3 多線程下載技術(shù)
多線程是一種機制,它允許在程序中并發(fā)執(zhí)行多個指令流,每個指令流都成為一個線程,彼此間互相獨立。多個線程的執(zhí)行是并發(fā)的,也就是在邏輯上“同時”,而不管是否是物理上的“同時”。因為系統(tǒng)只有一個CPU,那么真正的“同時”是不可能的,但是由于CPU的速度非常快,用戶感覺不到其中的區(qū)別,因此只需要設(shè)想各個線程是同時執(zhí)行即可。多線程和傳統(tǒng)的單線程在程序設(shè)計上最大的區(qū)別在于:由于各個線程的控制流彼此獨立,使得各個線程是亂序執(zhí)行的,因此必需注意的線程調(diào)度和同步等問題。
由于網(wǎng)絡(luò)爬蟲Web_Crawler采用MFC開發(fā),所以多線程并發(fā)工作必須使用MFC的線程機制。在MFC中,線程分為用戶界面線程和工作者線程(又稱為后臺線程或輔助線程)兩種。
用戶界面線程通常用來處理用戶輸入并響應(yīng)用戶生成的事件和消息;不需要用戶輸入的就是工作者線程。CWinAPP對象就是一個用戶界面線程,用戶界面線程一般都是主線程,在Windows操作系統(tǒng)下隨應(yīng)用程序啟動而自動創(chuàng)建,隨應(yīng)用程序的退出而終止。創(chuàng)建用戶界面線程先從CwinThread派生一個類,同時必須使用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE來聲明和實現(xiàn)這個CWinThread派生類,然后根據(jù)需要重載該派生類的一些成員函數(shù),最后調(diào)用AfxBeginThread函數(shù)來啟動界面線程。
工作者線程用來執(zhí)行后臺的處理任務(wù),比如計算、壓縮、對文件或串口的讀寫操作等。它和用戶界面線程的區(qū)別是它不用從CWinThread類派生,它的創(chuàng)建主要是通過AfxBeginThread( )函數(shù)的另一個版本來實現(xiàn)。創(chuàng)建線程的方法有很多,也可以直接使用Win32 API函數(shù)CreateThread來實現(xiàn)。在此我們采用的是工作者線程來進行多線程抓取頁面數(shù)據(jù)和多線程數(shù)據(jù)緩沖緩池中提取數(shù)據(jù)進行標引等操作。
網(wǎng)絡(luò)爬蟲Web_Crawler采用多線程是為了使得多個線程并行的工作以完成多項任務(wù),以提高系統(tǒng)的使用效率。系統(tǒng)的多線程抓取數(shù)據(jù)和多線程提取數(shù)據(jù)如圖2所示。
4 數(shù)據(jù)緩沖池轉(zhuǎn)存技術(shù)
通常網(wǎng)絡(luò)爬蟲將抓取的數(shù)據(jù)存放到數(shù)據(jù)庫中,再重數(shù)據(jù)庫中調(diào)出數(shù)據(jù)進行數(shù)據(jù)標引等處理,再放入媒體內(nèi)容庫中。這一過程涉及了兩次數(shù)據(jù)庫的存儲過程,其效率會受數(shù)據(jù)庫的存取速度影響。然而網(wǎng)絡(luò)爬蟲將抓取的數(shù)據(jù)直接進行信息標引等操作,等一條信息處理存入媒體內(nèi)容庫后再抓取下一條信息又會使整個系統(tǒng)的效率大大降低。
而網(wǎng)絡(luò)爬蟲Web_Crawler在從網(wǎng)絡(luò)中抓取網(wǎng)頁數(shù)據(jù)后先將信息暫存在緩沖區(qū),當緩沖區(qū)到達一定大小的時候,系統(tǒng)觸發(fā)另一個線程將數(shù)據(jù)交給信息處理程序,也就是媒體處理程序,經(jīng)過媒體處理程序?qū)⒃季W(wǎng)頁數(shù)據(jù)加工后再存放到媒體內(nèi)容數(shù)據(jù)庫,以準備供用戶查詢使用。媒體處理程序定義了多個結(jié)構(gòu)體,也定義了多個結(jié)構(gòu)體數(shù)組,其中某些是用于處理分詞和切詞。實現(xiàn)時以一個結(jié)構(gòu)體來記錄URL和對應(yīng)的HTML:
struct memory_pool{
string strURLAddress;
string strURLContent;
memory_pool(string url = ””,string html = ””)
{strURLAddress = url;
strURLContent = html;}
};
在結(jié)構(gòu)體中,strURLAddress為網(wǎng)絡(luò)地址,也就是URL,類型為字符串(string);strURLContent為對應(yīng)地址的網(wǎng)頁(HTML),以文本形式存儲,類型也是字符串(string)。
考慮到網(wǎng)絡(luò)爬蟲與信息處理程序的處理速度不匹配問題,對于struct memory_pool這個結(jié)構(gòu)體并不是抓取一個就處理一個,而是先將每一個抓取到的結(jié)構(gòu)體放到緩沖區(qū)。緩沖區(qū)用一個動態(tài)數(shù)組實現(xiàn),當數(shù)組的元素個數(shù)到達一定大小的時候,另一個函數(shù)就將整個結(jié)構(gòu)體數(shù)組寫入數(shù)據(jù)庫,然后再將動態(tài)數(shù)組清空,循環(huán)寫入。流程圖如圖3所示:
信息搜索部分的“網(wǎng)絡(luò)爬蟲”程序用MFC開發(fā),而MFC中有一個CArray模板類,使用CArray模板類很容易就實現(xiàn)多維動態(tài)數(shù)組。CArray類支持與CArray相似的數(shù)組,但是必要時可以動態(tài)壓縮并擴展。數(shù)組索引從0開始,可以決定是固定數(shù)組上界還是允許當添加元素時擴展當前的邊界。內(nèi)存對上界是連續(xù)地分配空間,甚至一些元素可為空。和CArray一樣,CArray索引元素的訪問時間是不變的,與數(shù)組大小無關(guān)。
CArray的聲明如下:CArray
CArray
以上聲明了一個名為pool,數(shù)據(jù)類型為struct memory_pool的動態(tài)數(shù)組。聲明了自定義的動態(tài)數(shù)組后,接下來就是要將“網(wǎng)絡(luò)爬蟲”程序所獲取的數(shù)據(jù)暫時存放在pool這個動態(tài)數(shù)組。
搜集程序?qū)⑺鸭降臄?shù)據(jù)存放到緩沖區(qū),當緩沖區(qū)到達一定大小的時候,會觸發(fā)另一個函數(shù)將數(shù)據(jù)交給信息處理程序,也就是媒體處理程序,經(jīng)過媒體處理程序?qū)⒃季W(wǎng)頁數(shù)據(jù)加工后再存放到數(shù)據(jù)庫,以準備供用戶查詢使用。媒體處理程序定義了多個結(jié)構(gòu)體,也定義了多個結(jié)構(gòu)體數(shù)組,其中某些是用于處理分詞切詞。
5 結(jié)束語
網(wǎng)絡(luò)爬蟲作為搜索引擎的基本組成部分,它的爬行速度和爬行量直接影響著搜索效率與質(zhì)量。本文從搜索引擎的相關(guān)概念和構(gòu)成出發(fā),介紹了網(wǎng)絡(luò)爬蟲Web_Crawler的相關(guān)概念, 并闡述了網(wǎng)絡(luò)爬蟲的組成結(jié)構(gòu),采用了多線程并行下載和數(shù)據(jù)緩沖池技術(shù)的設(shè)計方案,大大優(yōu)化了網(wǎng)絡(luò)爬蟲程序網(wǎng)頁下載的速度和效率。
參考文獻:
[1] 徐遠超,劉江華,劉麗珍,關(guān)永.基于Web 的網(wǎng)絡(luò)爬蟲的設(shè)計與實現(xiàn)[J].微計算機信息,2007,23(21):119-121.
[2] 將宗禮,趙欽,肖華,王蕊. 高性能并行爬行器[J].計算機工程與設(shè)計,2006(24):158-162.
[3] 王軍,彭建.網(wǎng)絡(luò)爬蟲的結(jié)構(gòu)設(shè)計研究[J].科技信息,2007(27):106-107,109.
[4] 謝建國.一個小型搜索引擎的系統(tǒng)設(shè)計[J].漳州職業(yè)技術(shù)學(xué)院學(xué)報,2007(4):13-16.
[5] 劉林,汪濤,樊孝忠.主題爬蟲的解決方案[J].華南理工大學(xué)學(xué)報(自然科學(xué)版),2004(s1):143-147.
[6] 劉暢,張輝.一種應(yīng)用于搜索引擎的索引結(jié)構(gòu)研究[J].計算機與數(shù)字工程,2005(9):43-46.
[7] 譚思亮.一種新的主題爬行算法[J].微計算機信息,2007(6):200-202.
[8] 王知津,等.現(xiàn)代信息檢索[M].北京:機械工業(yè)出版社,2005.