[摘要]隨著互聯(lián)網(wǎng)和寬帶上網(wǎng)的普及,搜索引擎在中國異軍突起,并日益滲透到人們的日常生活中。在互聯(lián)網(wǎng)普及之前,人們查閱資料首先想到的是擁有大量書籍資料的圖書館,但是今天很多人都會選擇一種更方便、快捷、全面、準(zhǔn)確的查閱方式互聯(lián)網(wǎng)。但是搜索引擎也得有一個自己的‘書庫,這個‘書庫是如何獲得的呢?那就需要網(wǎng)絡(luò)爬蟲了,它可以從互聯(lián)網(wǎng)上搜取各式各樣的信息,組成搜索引擎的資料庫,以便用戶查詢。
[關(guān)鍵詞]搜索引擎,網(wǎng)絡(luò)爬蟲,信息抓取
中圖分類號:TP-9文獻(xiàn)標(biāo)識碼:A文章編號:1671-7597(2009)0810066-01
互聯(lián)網(wǎng)搜索引擎通常由5個主要環(huán)節(jié)構(gòu)成。系統(tǒng)主要模塊包括網(wǎng)頁信息抓取、網(wǎng)頁內(nèi)容分析、網(wǎng)頁索引建立、網(wǎng)頁結(jié)果排序、網(wǎng)頁搜索工具與接口。主要功能模塊結(jié)合其他中文信息處理和信息檢索技術(shù),完成整個網(wǎng)頁搜索引擎。其中網(wǎng)絡(luò)信息抓取需要網(wǎng)絡(luò)爬蟲來完成,網(wǎng)絡(luò)爬蟲在搜索引擎中起著至關(guān)重要的作用,它是搜索引擎信息來源的核心。
網(wǎng)絡(luò)爬蟲功能需求主要是完成信息抓取,其他功能設(shè)計都圍繞信息抓取這個核心功能進(jìn)行。網(wǎng)絡(luò)爬蟲的設(shè)計開發(fā)總體上包括5方面任務(wù)要求。具體的內(nèi)容描述如下:
1.網(wǎng)絡(luò)爬蟲具有可配置性。它需要動態(tài)配置信息,設(shè)定待抓取URL地址列表、抓取深度和層次范圍。網(wǎng)絡(luò)爬蟲需要行為控制信息,包括抓取使用的線程或進(jìn)程情況、時間間隔和更新周期。
2.新網(wǎng)站和新鏈接的發(fā)現(xiàn)能力。網(wǎng)絡(luò)爬蟲需要簡單分析下載的頁面,提取包含的新URL。新增加的URL增加到等待下載隊列,保證網(wǎng)絡(luò)爬蟲的自我資源發(fā)現(xiàn)能力。
3.下載頁面的存儲和管理。網(wǎng)絡(luò)爬蟲存儲下載的網(wǎng)頁內(nèi)容,為網(wǎng)頁分析和索引提供數(shù)據(jù)。海量搜索引擎下載的文檔數(shù)量驚人,需要合理的管理策略。存儲的高效和可靠性至關(guān)重要,需要考慮分布式存儲策略。
4.高效的網(wǎng)頁更新、死鎖判別方法。網(wǎng)絡(luò)爬蟲對歷史下載的網(wǎng)頁需要定期檢查,判斷頁面內(nèi)容是否更換,確定網(wǎng)頁源是否已經(jīng)被刪除。這部分功能需要網(wǎng)絡(luò)爬蟲通過多線程并發(fā)控制,控制對同一站點的訪問并發(fā)數(shù)量和檢查周期。
5.域名解析緩存機(jī)制和已下載內(nèi)容的本地代理緩存。網(wǎng)絡(luò)爬蟲需要經(jīng)常訪問同一個域名下的網(wǎng)頁內(nèi)容。域名解析內(nèi)容緩存能存儲域名與IP地址的復(fù)雜對應(yīng)關(guān)系,減少域名查詢次數(shù),大大提高網(wǎng)絡(luò)利用率。本地下載代理內(nèi)容可以避免重復(fù)下載減少一定時期內(nèi)對目標(biāo)站點的多次下載。
從結(jié)構(gòu)上來看,互聯(lián)網(wǎng)其實就是一張大型的網(wǎng)絡(luò)圖。搜索引擎中可以把每一個網(wǎng)頁作為一個節(jié)點,把網(wǎng)頁內(nèi)的超鏈接當(dāng)作連接網(wǎng)頁的弧。搜索引擎在進(jìn)行信息抓取時,可以按照圖論的相關(guān)算法進(jìn)行處理。網(wǎng)絡(luò)爬蟲從某個網(wǎng)站的首頁進(jìn)入,按照圖論的相關(guān)遍歷算法就可以訪問這個網(wǎng)站的所有信息。
為了實現(xiàn)網(wǎng)絡(luò)爬蟲,需要對HTTP協(xié)議有所了解。HTTP協(xié)議是用于從互聯(lián)網(wǎng)WWW服務(wù)器傳送超文本到本地瀏覽器的傳送協(xié)議。協(xié)議的目標(biāo)是使瀏覽器更加高效,提高網(wǎng)絡(luò)傳輸效率。HTTP協(xié)議不僅可以正確、快速的傳輸超文本文檔,還可以確定傳輸文檔中的哪一部分首先顯示。
為了更快的實現(xiàn)抓取,可以采用封裝的HTTP協(xié)議API,也可以采用最基本的Socket通信編程模式。Socket就是所謂的網(wǎng)絡(luò)套接字。
互聯(lián)網(wǎng)上分布著大量網(wǎng)頁,不同網(wǎng)頁的訪問速度差別比較大。網(wǎng)頁下載過程中的網(wǎng)絡(luò)延遲成為整個系統(tǒng)性能的瓶頸。為了提高效率,網(wǎng)絡(luò)爬蟲被設(shè)計成隊列緩沖、多線程并行結(jié)構(gòu)。網(wǎng)絡(luò)爬蟲具有3大模塊:HTTP下載模塊、鏈接分析模塊、和下載控制模塊。3大模塊有機(jī)的組成一個高效的功能體系。各模塊的作用如下:
·HTTP下載模塊利用HTTP網(wǎng)絡(luò)協(xié)議下載,獲取并存儲網(wǎng)頁內(nèi)容。
·鏈接分析模塊能夠提取網(wǎng)頁內(nèi)的超鏈接用來獲取后續(xù)網(wǎng)頁入口。
·下載控制模塊控制網(wǎng)頁訪問次序、更新策略、訪問隊列調(diào)度等工作。
網(wǎng)絡(luò)爬蟲訪問一個網(wǎng)站,需要從已知的入口頁面開始。這個入口頁面往往是網(wǎng)站的首頁或者sitemap頁面。從這個頁面通過鏈接分析,尋找并訪問后續(xù)頁面地址。
互聯(lián)網(wǎng)的鏈接結(jié)構(gòu)是一個典型的網(wǎng)狀結(jié)構(gòu)。在這個訪問過程中需要遵循一系列的算法。通常,網(wǎng)絡(luò)爬蟲對網(wǎng)站的訪問有訪問深度限制,一般在3~5層。遍歷策略多用數(shù)據(jù)結(jié)構(gòu)中典型的算法:廣度優(yōu)先和深度優(yōu)先。
從應(yīng)用角度來看,廣度優(yōu)先能盡快地比較平均的獲取不同網(wǎng)站的內(nèi)容,比較適合于大型搜索系統(tǒng)初期網(wǎng)頁庫的建立;深度優(yōu)先在設(shè)計的時候比較容易,對垂直搜索或者站內(nèi)搜索比較合適。
Java提供了多個訪問各種標(biāo)準(zhǔn)Internet的協(xié)議類庫,網(wǎng)絡(luò)爬蟲可以直接用Java的網(wǎng)絡(luò)開發(fā)包java.net.*函數(shù)調(diào)用來完成。
網(wǎng)絡(luò)爬蟲的設(shè)計思路是先確定需要下載的網(wǎng)頁URL,指定通信端口,創(chuàng)建一個用于網(wǎng)絡(luò)通信的Socket對象。結(jié)果通過流失輸出接口輸出,創(chuàng)建相應(yīng)的輸出對象。通過輸入接口,向Socket對象傳入HTTP下載請求。遠(yuǎn)端的目標(biāo)Web服務(wù)器得到請求后,發(fā)送應(yīng)答消息。本地Socket對象收到消息后緩存并輸出,就完成了整個網(wǎng)頁下載過程。傳輸過程中使用默認(rèn)的HTTP協(xié)議進(jìn)行。
網(wǎng)絡(luò)爬蟲的設(shè)計流程中,核心部分是獲取等待下載的URL列表、創(chuàng)建下載的客戶端、獲取并存儲得到的網(wǎng)頁結(jié)果。
大型搜索引擎系統(tǒng)需要抓取海量信息數(shù)據(jù)。為了有效的提高網(wǎng)絡(luò)爬蟲的性能和效率,并滿足系統(tǒng)數(shù)據(jù)下載需求,網(wǎng)絡(luò)爬蟲的設(shè)計通常包含以下一系列優(yōu)化策略和原則:
·對等待下載的URL進(jìn)行重排,避免重復(fù)下載。
·增加多個工作隊列,提高系統(tǒng)并發(fā)能力。工作隊列主要有4類:等待隊列、處理隊列、成功隊列、失敗隊列。
·利用網(wǎng)頁proxy緩沖,檢查是否需要從遠(yuǎn)程下載,減少不必要的傳輸。
·同一站點的URL盡量映射到同一個線程處理,避免同時訪問給被訪問站點帶來負(fù)擔(dān)。
參考文獻(xiàn):
[1]盧亮、張博文著,《搜索引擎原理、實踐與應(yīng)用》,電子工業(yè)出版社,2007,9.
[2]Jennifer Grappone,Gradiva Couzin著,楊明軍譯,《搜索引擎優(yōu)化》,清華大學(xué)出版社,2007,7.
[3]李剛、宋偉、邱群著,《Ajax+Lucene構(gòu)建搜索引擎》,人民郵電出版社,2006.
[4]Margaret H.Dunham著,郭崇惠、田風(fēng)占、靳曉明譯,《數(shù)據(jù)挖掘教程》,清華大學(xué)出版社,2005,5.
作者簡介:
楊松梅(1960-),吉林省四平市人,副教授,就職于長春市司法局培訓(xùn)中心。