雷才峰 田仁杰 王建鋒
摘 要:網(wǎng)絡(luò)爬蟲(又被稱為網(wǎng)頁蜘蛛,網(wǎng)絡(luò)機(jī)器人,在FOFA社區(qū)中間,更經(jīng)常被稱為網(wǎng)頁追逐者)是一種按照一定的規(guī)則,自動(dòng)的抓取萬維網(wǎng)信息的程序或者腳本。本文從網(wǎng)絡(luò)爬蟲的介紹出發(fā), 闡述了網(wǎng)絡(luò)爬蟲的搜索策略以及相關(guān)算法,包括頁面解析,重復(fù)鏈接分析,以及多線程等等
關(guān)鍵詞:搜索引擎 網(wǎng)絡(luò)爬蟲
一、引言
隨著信息時(shí)代的到來,網(wǎng)絡(luò)飛速發(fā)展,規(guī)模無限擴(kuò)大,信息量呈爆炸式的增長。網(wǎng)絡(luò)給人們帶來了豐富和動(dòng)態(tài)的網(wǎng)絡(luò)信息,但是因?yàn)镮nternet上的信息是極其分散,無序,毫無規(guī)則。所以很難被利用。因此如何在 Internet 這個(gè)巨大的信息海洋中快速并且準(zhǔn)確的找到有用的信息,是 Internet 用戶的所共同面對(duì)的難題。而網(wǎng)絡(luò)搜索引擎的出現(xiàn)則解決了這一困難,加強(qiáng)了Internet用戶定位和收集網(wǎng)絡(luò)信息的能力,引擎通過收集眾多網(wǎng)絡(luò)站點(diǎn)上的網(wǎng)絡(luò)信息來為幫助用戶更方便的尋找所需信息。而在整個(gè)搜索引擎中,網(wǎng)絡(luò)爬蟲起著重要的作用,它是整個(gè)搜索引擎的數(shù)據(jù)來源,爬蟲設(shè)計(jì)的好壞直接決定著整個(gè)引擎系統(tǒng)的內(nèi)容是否豐富,信息能否得到及時(shí)的更新。
二、網(wǎng)絡(luò)爬蟲的種類
幾年來隨著對(duì)網(wǎng)絡(luò)爬蟲的不斷研究與探索,備種各樣的爬蟲層出不窮?,F(xiàn)在常見的優(yōu)秀網(wǎng)給爬蟲有:批量型網(wǎng)絡(luò)爬蟲、增量型網(wǎng)絡(luò)爬蟲、通用網(wǎng)絡(luò)爬蟲、垂直網(wǎng)絡(luò)爬蟲、聚焦網(wǎng)絡(luò)爬蟲。這幾種爬蟲功能不一,使用的領(lǐng)域也不同。比如谷歌、百度等大型搜索引擎都是非常典型的增量型網(wǎng)絡(luò)爬蟲,可以提供非常大量的數(shù)據(jù)。而如淘寶、蘇寧易購等店鋪進(jìn)行爬取就需要用到批量型網(wǎng)絡(luò)爬蟲,它們經(jīng)常會(huì)對(duì)各種內(nèi)容設(shè)限或屏蔽防止外來的爬取。
三、網(wǎng)絡(luò)爬蟲的基本原理
網(wǎng)絡(luò)爬蟲是一個(gè)自動(dòng)提取網(wǎng)頁的程序,它為搜索引擎從Internet 上下載網(wǎng)頁,是搜索引擎的重要組成。爬蟲從一個(gè)或若干初始網(wǎng)頁的URL開始,通過分析該URL的源文件,提取出新的網(wǎng)頁鏈接,繼而通過這些鏈接繼續(xù)尋找新的鏈接,這樣一直循環(huán)下去,直到抓取并分析完所有的網(wǎng)頁為止。當(dāng)然這是理想狀態(tài)下爬蟲的執(zhí)行過程,但是實(shí)際上要抓取Internet上所有的網(wǎng)頁是不可能完成的。從目前公布的數(shù)據(jù)來看,最好的搜索引擎也只不過抓取了整個(gè) Internet40%的網(wǎng)頁。這有兩個(gè)原因,其一是網(wǎng)絡(luò)爬蟲設(shè)計(jì)時(shí)的抓取技術(shù)瓶頸造成的,無法遍歷所有的網(wǎng)頁,很多網(wǎng)頁鏈接不能從其他網(wǎng)頁中得到。其二是存儲(chǔ)技術(shù)和處理技術(shù)造成的,如果按照每個(gè)頁面的平均的大小是 20K,那么 100 億個(gè)頁面的大小就是200000G,對(duì)于現(xiàn)在的存儲(chǔ)技術(shù)來說是個(gè)挑戰(zhàn)。
四、 網(wǎng)絡(luò)爬蟲的爬行策略
網(wǎng)絡(luò)爬蟲的爬行策略可以分成深度優(yōu)先和廣度優(yōu)先。
(一)深度優(yōu)先策略:其本質(zhì)就是將網(wǎng)頁鏈接按照深度由低到高的順序依次進(jìn)行爬取直到最底層為止。通俗點(diǎn)講就是“一條道走到黑”,當(dāng)一條路完全走完后再去返回來去走另?xiàng)l道。這種策略作為早期最為流行的算法比較適合于垂直搜索等需要深度搜索的引擎,但又因?yàn)橥鶗?huì)爬取的過深會(huì)而耗時(shí)耗力產(chǎn)生大量的浪費(fèi)。
(二)廣度優(yōu)先策略:廣度優(yōu)先策略又被稱為寬度優(yōu)先策略。其原理就是從個(gè)初始點(diǎn)出發(fā),將所有檢測(cè)到的路徑全部都訪間一遍,每當(dāng)全部路徑都訪問結(jié)束卻沒有發(fā)現(xiàn)目標(biāo)時(shí),那么就會(huì)把所有走兩步可以到達(dá)的位置全部訪問一遍。如果任然沒有發(fā)現(xiàn)目標(biāo),就以此類推將所有走三步可以達(dá)到的位置全部訪問一遍。這種方法聽起來非常的笨,而且極為的耗時(shí),但可以保證一定能找到一條最短路徑。
五、爬蟲的具體實(shí)現(xiàn)
(一)基本流程。
如果是第一次運(yùn)行,爬蟲根據(jù)編碼過程中給定的起始網(wǎng)頁,開始分析網(wǎng)頁源文件,把分析出來的鏈接放進(jìn)待爬取隊(duì)列,把已經(jīng)處理過的原始網(wǎng)頁放進(jìn)已爬行隊(duì)列,并根據(jù)網(wǎng)頁鏈接在哈希表中添加一個(gè)新元素,然后各個(gè)工作線程從待爬行
隊(duì)列中取出鏈接繼續(xù)分析,提取鏈接,把提取出的新鏈接與哈希表中已存在的元素進(jìn)行對(duì)比,如果已在哈希表中存在,則放棄該鏈接,如果不存在,則在哈希表中生成一個(gè)新元素,并且把該鏈接放入待爬行隊(duì)列,然后工作線程繼續(xù)取出鏈接進(jìn)行爬行這樣一直循環(huán)下去,直到滿足系統(tǒng)停止條件,如果系統(tǒng)運(yùn)行期間人為的關(guān)閉了系統(tǒng),則系統(tǒng)會(huì)自動(dòng)在關(guān)閉時(shí)把相關(guān)記錄保存到文本文件中。如果系統(tǒng)不是第一次運(yùn)行,則在啟動(dòng)系統(tǒng)后,系統(tǒng)不是分析編碼過程中指定的起始網(wǎng)頁,而是先讀取保存在文本文件中的信息,然后生成和上一次運(yùn)行時(shí)同樣的哈希表,待爬行隊(duì)列,已爬行隊(duì)列,然后從待爬行對(duì)列中取出鏈接執(zhí)行。
(二)爬蟲主要數(shù)據(jù)結(jié)構(gòu)。
1. CHashTable類:這個(gè)類根據(jù)一定的算法為每一個(gè)鏈接(鏈接對(duì)應(yīng)的網(wǎng)址)生成一個(gè)唯一對(duì)應(yīng)的數(shù)字,然后把這個(gè)數(shù)字作為該鏈接在哈希表中的位置,并把該位置的值設(shè)置為 1,表示該位置已經(jīng)有一個(gè)鏈接對(duì)應(yīng)了。當(dāng)有新的鏈接要放入哈希表中時(shí),則只需檢查新鏈接所對(duì)應(yīng)的哈希表中的位置的值,如果為 0 則表示該鏈接以前未出現(xiàn),如果為 1則表示是重復(fù)鏈接,不需要處理了。
2. CURLParse類:該類主要負(fù)責(zé)得到鏈接的源文件,并從中提取出源文件中的所有鏈接,然后把不重復(fù)的鏈接放入到待爬行隊(duì)列中去,供工作線程使用。在提取源文件鏈接的過程中,本系統(tǒng)沒有使用正則表達(dá)式,而是直接利用 CString 類來尋找鏈接,個(gè)人覺得這樣操作的準(zhǔn)確性更高。由于提取出來的鏈接很多都不完整,而是相對(duì)路徑,因此,還需要對(duì)此類鏈接進(jìn)行一些操作,使其變成完整路徑后才能放入待爬行隊(duì)列。
3.CURLQueue 類:該類用來存儲(chǔ)待爬行鏈接和已爬行鏈接,并提供了一些可以操作隊(duì)列的接口以及一些返回隊(duì)列相關(guān)信息的接口。
4. URLStruct 結(jié)構(gòu)體:該結(jié)構(gòu)體用來控制系統(tǒng)的執(zhí)行層級(jí)。如果某個(gè)鏈接的層級(jí)為 1,則由它分析出的鏈接的層級(jí)為 2。當(dāng)鏈接的層級(jí)大于系統(tǒng)設(shè)定的層級(jí)時(shí),就不對(duì)此鏈接做任何處理,既不從該鏈接中提取新的鏈接。
五、系統(tǒng)運(yùn)行
操作系統(tǒng)Windows7及以上。但是根據(jù)實(shí)際使用情況,建議使用Windows10。因?yàn)閃indows10做為目前主流的操作系統(tǒng)具有更好的服務(wù)器性能、更強(qiáng)的安全性、更輕的管理工作負(fù)擔(dān)。
參考文獻(xiàn)
[1] 孟時(shí),王彥,larbin網(wǎng)絡(luò)爬蟲的體系結(jié)構(gòu)[J]. 電腦學(xué)習(xí),2010
[2] 高波,Linux網(wǎng)絡(luò)編程[M]. 程序設(shè)計(jì)2000
[3] 王芳,陳海建 深入解析Web主題爬蟲的關(guān)鍵性原理[J]. 微型電腦應(yīng)用,2011