黃宇
(湖北工業(yè)大學(xué)圖書館,湖北 武漢430068)
網(wǎng)絡(luò)爬蟲又稱為網(wǎng)絡(luò)蜘蛛, 是按一定規(guī)則自動(dòng)抓取互聯(lián)網(wǎng)上信息的程序,它為搜索引擎的服務(wù)提供數(shù)據(jù)基礎(chǔ),它的性能直接決定著搜索引擎的好壞[1]。目前, 不光搜索引擎會(huì)用網(wǎng)絡(luò)爬蟲, 很多前沿研究領(lǐng)域都需要網(wǎng)絡(luò)爬蟲技術(shù)的支撐。大數(shù)據(jù)分析所需要的海量數(shù)據(jù)需要通過(guò)網(wǎng)絡(luò)爬蟲獲取。金融領(lǐng)域研究所需的大量精準(zhǔn)且實(shí)時(shí)的金融數(shù)據(jù)也需要通過(guò)爬蟲獲取。商戶通過(guò)抓取競(jìng)爭(zhēng)對(duì)手發(fā)布的商品信息調(diào)整自己的營(yíng)銷策略[2],網(wǎng)絡(luò)爬蟲的應(yīng)用已經(jīng)滲透到了各行各業(yè)。
網(wǎng)絡(luò)爬蟲是搜索引擎的重要組成部分, 其作用是根據(jù)既定的抓取策略為搜索引擎從互聯(lián)網(wǎng)上抓取數(shù)據(jù), 為用戶檢索提供數(shù)據(jù)基礎(chǔ)。主題網(wǎng)絡(luò)爬蟲在抓取數(shù)據(jù)時(shí)比普通網(wǎng)絡(luò)爬蟲多了兩道處理步驟,分別是頁(yè)面相關(guān)度評(píng)價(jià)與超鏈接相關(guān)度評(píng)估示。網(wǎng)頁(yè)抓取模塊從初始種子鏈接列表中的頁(yè)面開(kāi)始抓取數(shù)據(jù), 網(wǎng)頁(yè)分析模塊對(duì)抓取的數(shù)據(jù)分析后, 由頁(yè)面相關(guān)度評(píng)價(jià)模塊計(jì)算該數(shù)據(jù)是否與領(lǐng)域主題相關(guān),若相關(guān)則將所抓取數(shù)據(jù)過(guò)濾后存入網(wǎng)頁(yè)庫(kù)中,若無(wú)關(guān)則丟棄。與此同時(shí)從所抓取數(shù)據(jù)中提取超鏈接,并對(duì)其進(jìn)行相關(guān)度評(píng)價(jià),若有符合要求則將其按照相關(guān)度的高低排序后存入U(xiǎn)RL 庫(kù)中,等待下一次遍歷。
網(wǎng)絡(luò)爬蟲在網(wǎng)絡(luò)中抓取到相關(guān)頁(yè)面后, 首先提取該網(wǎng)頁(yè)的URL, 接著對(duì)去重后的URL繼續(xù)爬取。但隨著網(wǎng)頁(yè)數(shù)量的劇烈增長(zhǎng),噪聲鏈接也會(huì)隨之增多,若不進(jìn)行去噪,爬蟲將會(huì)耗費(fèi)大量資源在噪聲鏈接上。目標(biāo)鏈接提取的主要任務(wù)有兩個(gè),一個(gè)去除重復(fù)鏈接,另一剔除與內(nèi)容無(wú)關(guān)的鏈接,即噪聲鏈接。
2.2.1 待爬鏈接去重
在網(wǎng)絡(luò)爬蟲爬取資源的過(guò)程中, 會(huì)記錄下所有已爬過(guò)頁(yè)面的URL,當(dāng)有新的URL 時(shí)就會(huì)和這個(gè)集合比較,看看是否存在。在這個(gè)集合很大的時(shí)候,存儲(chǔ)這些URL 會(huì)耗費(fèi)很大的存儲(chǔ)空間,而且比對(duì)時(shí)遍歷過(guò)去,需要相當(dāng)多的時(shí)間和資源。針對(duì)這個(gè)問(wèn)題,可以采用布隆過(guò)濾器來(lái)解決。布隆過(guò)濾器是1970 年由布隆提出的。它實(shí)際上是一個(gè)很長(zhǎng)的二進(jìn)制向量和一系列隨機(jī)映射函數(shù),可以用于檢索一個(gè)元素是否在一個(gè)集合中。它的優(yōu)點(diǎn)是占用的內(nèi)存很少,查詢速度夠快,比一般的算法要好的多,缺點(diǎn)是存在一定的誤判率和刪除困難[3]。
2.2.2 相關(guān)鏈接提取
隨著媒體技術(shù)的不斷發(fā)展, 網(wǎng)頁(yè)上可承載的內(nèi)容類型也越來(lái)越多,比如說(shuō)與內(nèi)容無(wú)關(guān)的聲音、視頻等。若不采用有效的方法對(duì)這部分內(nèi)容即網(wǎng)頁(yè)噪聲進(jìn)行處理, 網(wǎng)絡(luò)爬蟲將會(huì)對(duì)網(wǎng)頁(yè)中所有的噪聲鏈接進(jìn)行爬取,這將極大地浪費(fèi)系統(tǒng)資。為解決這一問(wèn)題,需要網(wǎng)絡(luò)爬蟲能夠識(shí)別網(wǎng)頁(yè)中的噪聲鏈接。目前常用的方法有如下幾種:基于統(tǒng)計(jì)學(xué)的相關(guān)鏈接提取方法、基于DOM樹(shù)的相關(guān)鏈接提取方法、基于機(jī)器學(xué)習(xí)的相關(guān)鏈接提取方法、基于視覺(jué)的噪聲鏈接去除方法等。
2.3.1 頁(yè)面緩存
頁(yè)面緩存是將動(dòng)態(tài)頁(yè)面直接生成靜態(tài)的頁(yè)面放在服務(wù)器端,用戶調(diào)取相同頁(yè)面時(shí),靜態(tài)頁(yè)面將直接下載到客戶端,不再需要通過(guò)程序的運(yùn)行和數(shù)據(jù)庫(kù)的訪問(wèn),大大降低了服務(wù)器的負(fù)載[4]。網(wǎng)絡(luò)爬蟲在工作過(guò)程中, 需要根據(jù)服務(wù)器傳輸?shù)臄?shù)據(jù)量來(lái)動(dòng)態(tài)申請(qǐng)堆內(nèi)存保存網(wǎng)頁(yè)數(shù)據(jù),以便用于后續(xù)網(wǎng)頁(yè)的分析。常用的內(nèi)存管理模型有ptmalloc、tcmalloc、內(nèi)存池等。
2.3.2 DNS 緩存
DNS 是Domain Name System的縮寫,即域名系統(tǒng)。互聯(lián)網(wǎng)中的主機(jī)都被賦予了統(tǒng)一標(biāo)識(shí)IP 地址, 但I(xiàn)P 地址是一個(gè)32 位二進(jìn)制數(shù)字,不具備良好的可讀性。DNS 將域名和IP 地址相互映射的一個(gè)分布式數(shù)據(jù)庫(kù),能夠使人更方便的訪問(wèn)互聯(lián)網(wǎng),而不用去記住能夠被機(jī)器直接讀取的IP 數(shù)串[5]。由于有了DNS 緩存,網(wǎng)絡(luò)爬蟲不用每次訪問(wèn)頁(yè)面前都進(jìn)行域名解析,這極大地提高了工作效率,減少解析時(shí)間。
分布式是相對(duì)集中式而言。集中式系統(tǒng)是由一臺(tái)或多臺(tái)主計(jì)算機(jī)組成的中心節(jié)點(diǎn),數(shù)據(jù)集中存儲(chǔ)于這個(gè)中心節(jié)點(diǎn)[6],連接它的終端僅用來(lái)輸入和輸出。分布式系統(tǒng)則是依托網(wǎng)絡(luò)建立的一套系統(tǒng)。它是通過(guò)網(wǎng)絡(luò)將多個(gè)類似集中式系統(tǒng)聯(lián)系組織起來(lái),合作完成數(shù)據(jù)處理。分布式系統(tǒng)擁有多種通用的物理和邏輯資源,能夠動(dòng)態(tài)的分配任務(wù),分散的物理和邏輯資源通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)實(shí)現(xiàn)信息交換。目前常用的分布式系統(tǒng)根據(jù)各節(jié)點(diǎn)通信的方式不同,分為主從式、自治式和混合式[7]。主從式架構(gòu)的工作原理是在集群中選取一臺(tái)主機(jī)作為控制節(jié)點(diǎn),負(fù)責(zé)對(duì)集群中其他主機(jī)進(jìn)行管理,其他各主機(jī)是相互獨(dú)立的,彼此進(jìn)行通信必須經(jīng)過(guò)主機(jī)控制節(jié)點(diǎn)。自治式架構(gòu)則是集群中的主機(jī)沒(méi)有主次之分,每臺(tái)主機(jī)既要對(duì)完成數(shù)據(jù)的處理工作,也要完成與其他各節(jié)點(diǎn)進(jìn)行通信的功能。混合式架構(gòu)中的節(jié)點(diǎn)分為控制節(jié)點(diǎn)與數(shù)據(jù)處理節(jié)點(diǎn),控制節(jié)點(diǎn)主要是存儲(chǔ)數(shù)據(jù)處理節(jié)點(diǎn)的狀態(tài)并進(jìn)行作業(yè)分配,數(shù)據(jù)處理節(jié)點(diǎn)則是進(jìn)行數(shù)據(jù)處理與相互通信。
本系統(tǒng)的架構(gòu)采用的是混合式架構(gòu),控制節(jié)點(diǎn)的任務(wù)主要是存儲(chǔ)數(shù)據(jù)處理節(jié)點(diǎn)的狀態(tài),進(jìn)行各數(shù)據(jù)處理節(jié)點(diǎn)的作業(yè)分配,并對(duì)無(wú)法分配的作業(yè)進(jìn)行集中處理。
系統(tǒng)采用的是最小負(fù)載調(diào)度算法,每次進(jìn)行任務(wù)分配時(shí)總是選取當(dāng)前負(fù)載最小的節(jié)點(diǎn)作為任務(wù)執(zhí)行節(jié)點(diǎn),集群中所有數(shù)據(jù)處理節(jié)點(diǎn)的負(fù)載情況都記錄在控制節(jié)點(diǎn)的負(fù)載狀態(tài)表中。這種算法實(shí)現(xiàn)起來(lái)簡(jiǎn)單高效開(kāi)銷小,因此被許多分布式系統(tǒng)中調(diào)度器所采用。
分布式主題網(wǎng)絡(luò)爬蟲系統(tǒng)主要由六個(gè)功能模塊組成,分別是采集模塊、數(shù)據(jù)緩存模塊、分析模塊、提取模塊、存儲(chǔ)模塊以及日志模塊。采集模塊的任務(wù)是主題網(wǎng)絡(luò)爬蟲依據(jù)設(shè)定好的策略在互連網(wǎng)上抓取符合特定條件的頁(yè)面,并從已下載的頁(yè)面中提取與主題相關(guān)度高的鏈接地址加入到待抓取序列中。數(shù)據(jù)緩存模塊的主要功能是臨時(shí)存放抓取的數(shù)據(jù),這些數(shù)據(jù)包括兩部分,網(wǎng)頁(yè)數(shù)據(jù)與DNS數(shù)據(jù),以降低系統(tǒng)地資源消耗,提高數(shù)據(jù)的處理速度。分析模塊主要是對(duì)爬蟲抓取到頁(yè)面進(jìn)行分析,它直接決定主題爬蟲抓取信息的質(zhì)量和準(zhǔn)確率。對(duì)抓取得與主題相關(guān)的頁(yè)面信息,系統(tǒng)將提取頁(yè)面的鏈接、內(nèi)容等主要信息并轉(zhuǎn)化為結(jié)構(gòu)化數(shù)據(jù),以方便下一個(gè)模塊進(jìn)一步處理。存儲(chǔ)模塊是用來(lái)存儲(chǔ)主題網(wǎng)絡(luò)爬蟲所抓取的符合主題的網(wǎng)頁(yè)數(shù)據(jù)。日志模塊是用來(lái)記錄系統(tǒng)中軟硬件的信息,并同時(shí)監(jiān)視系統(tǒng)中發(fā)生事件及各自節(jié)點(diǎn)的負(fù)載情況。當(dāng)發(fā)生錯(cuò)誤時(shí),用戶可以通過(guò)系統(tǒng)日志來(lái)檢查錯(cuò)誤發(fā)生的原意,為后續(xù)的錯(cuò)誤排查提供幫助。分布式主題爬蟲在執(zhí)行數(shù)據(jù)采集任務(wù)時(shí),能同時(shí)對(duì)多個(gè)不同的相關(guān)主題進(jìn)行采集。控制節(jié)點(diǎn)通過(guò)負(fù)載狀態(tài)表給每個(gè)數(shù)據(jù)處理節(jié)點(diǎn)進(jìn)行動(dòng)態(tài)作業(yè)分配,每個(gè)數(shù)據(jù)處理節(jié)點(diǎn)無(wú)需考慮鏈接抓取任務(wù)的去重。此外,系統(tǒng)還能為提供伸縮服務(wù)。在數(shù)據(jù)采集的過(guò)程中,控制節(jié)點(diǎn)判斷現(xiàn)在進(jìn)行的某個(gè)主題數(shù)據(jù)采集資源不夠,需要更多的數(shù)據(jù)處理節(jié)點(diǎn)進(jìn)行工作時(shí),會(huì)將空載或是負(fù)載較低的數(shù)據(jù)處理節(jié)點(diǎn)調(diào)入進(jìn)來(lái)進(jìn)行工作。
信息化時(shí)代,互聯(lián)網(wǎng)的搜索越來(lái)越趨于領(lǐng)域化和多元化,人們對(duì)能夠準(zhǔn)確快速獲取自己想要的信息的需求越來(lái)越強(qiáng)烈,主題網(wǎng)路爬蟲在今后的一段時(shí)間內(nèi)都將是研究熱點(diǎn)。本文設(shè)計(jì)的一種分布式主題爬蟲,在一定程度上提高了搜索引擎的查準(zhǔn)率和查全率,優(yōu)化了系統(tǒng)負(fù)載。但由于技術(shù)水平有限,在新技術(shù)應(yīng)用方面還有所欠缺,這就需要在今后的工作中進(jìn)一步研究。