• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      結(jié)合有監(jiān)督廣度優(yōu)先搜索策略的通用垂直爬蟲方法

      2018-11-20 06:43:08峰,劉震,b,高輝,b
      計(jì)算機(jī)工程 2018年11期
      關(guān)鍵詞:爬蟲權(quán)值網(wǎng)頁

      高 峰,劉 震,b,高 輝,b

      (電子科技大學(xué) a.計(jì)算機(jī)科學(xué)與工程學(xué)院; b.大數(shù)據(jù)研究中心,成都 611731)

      0 概述

      隨著互聯(lián)網(wǎng)的蓬勃發(fā)展,互聯(lián)網(wǎng)信息數(shù)量呈現(xiàn)爆炸性的增長。對(duì)互聯(lián)網(wǎng)用戶來說,一個(gè)很重要的問題就是如何才能快速的找到其想要的網(wǎng)頁內(nèi)容。信息增長的速度越快,用戶的這種需求就越迫切。

      傳統(tǒng)的垂直爬蟲是獲取特定網(wǎng)站或特定主題內(nèi)容數(shù)據(jù)較為普遍的方法,但是垂直爬蟲的一大弊端就是無法實(shí)現(xiàn)通用的爬取,需要針對(duì)不同的網(wǎng)站重新設(shè)計(jì)程序,而且人工查找URL隊(duì)列及人工提取數(shù)據(jù)解析路徑的工作更為繁瑣,大大影響了工作效率。一般情況下,一個(gè)單獨(dú)的爬蟲程序只能處理某個(gè)獨(dú)立站點(diǎn)的某一類型結(jié)構(gòu)的頁面數(shù)據(jù)。而用戶對(duì)于數(shù)據(jù)的需求是多種多樣的,如果對(duì)于每一個(gè)網(wǎng)站的數(shù)據(jù)需求都需要一個(gè)相應(yīng)的爬蟲程序比較費(fèi)時(shí)費(fèi)力,同時(shí)也會(huì)影響對(duì)應(yīng)工作或項(xiàng)目的推進(jìn)速度。

      針對(duì)上述問題,本文提出一種配置簡單、高效且可移植性高的通用爬蟲設(shè)計(jì)方法。其核心思想是將通用型爬蟲分為配置信息、初始化和正式爬取3個(gè)階段。在配置信息階段,用戶針對(duì)待爬取網(wǎng)站完成基本信息配置;在初始化階段,自動(dòng)識(shí)別主題相關(guān)目標(biāo)頁面URL和目錄頁面URL,生成解析路徑模板并且采用URL聚類的方法抽取出URL正則表達(dá)式過濾器;在正式的網(wǎng)頁爬取階段,利用初始化階段生成的正則表達(dá)式過濾器和解析路徑模板,以及有監(jiān)督的廣度優(yōu)先與網(wǎng)頁賦權(quán)搜索策略,實(shí)現(xiàn)對(duì)目標(biāo)頁面數(shù)據(jù)的快速準(zhǔn)確提取。在此基礎(chǔ)上,本文提出一種GWC(General Web Crawler)原型系統(tǒng),并且在該原型系統(tǒng)上進(jìn)行了廣泛的實(shí)驗(yàn)。

      1 相關(guān)研究

      目前比較流行的自動(dòng)化信息抽取工具有RoadRunner[1]、MDR[2]以及基于MDR的改進(jìn)方法Depta[3-6]等。但這些工具的目標(biāo)都是從結(jié)構(gòu)相似的網(wǎng)頁,如目錄列表頁面、查詢結(jié)果頁面或表格中,抽取信息,因?yàn)檫@類頁面中的數(shù)據(jù)記錄子樹具有相似的結(jié)構(gòu),所以利用子樹相似度算法的研究可達(dá)到較好的數(shù)據(jù)抽取效果,但是該類方法對(duì)待抽取網(wǎng)頁中信息的結(jié)構(gòu)化程度要求比較嚴(yán)格,這也是該類抽取方法最大的局限。文獻(xiàn)[7-8]對(duì)于評(píng)論信息的抽取也屬于該類抽取方法,文獻(xiàn)[9]利用深層的匹配節(jié)點(diǎn)越多,2棵樹的相似度越大的思想,提出一種高效的深度加權(quán)的樹相似性算法,其對(duì)于每一個(gè)評(píng)論記錄中具體數(shù)據(jù)項(xiàng)的抽取進(jìn)行了詳細(xì)深入的研究,但是同樣也僅適用于評(píng)論信息的抽取。同時(shí),這些方法僅利用HTML標(biāo)簽及結(jié)構(gòu)信息,缺乏語義表達(dá)能力,最近很多研究已經(jīng)注意到這個(gè)問題,并且利用頁面的視覺信息來實(shí)現(xiàn)Web數(shù)據(jù)的抽取[10,11]。

      目前,國內(nèi)外對(duì)正文信息的抽取也有較多的研究。文獻(xiàn)[12]設(shè)計(jì)的Crunch系統(tǒng)利用區(qū)域中鏈接文本/普通文本(link/text)的比值與某個(gè)既定閾值的大小關(guān)系來確定網(wǎng)頁的正文區(qū)域。文獻(xiàn)[13]改進(jìn)文獻(xiàn)[12]方法,將基于鏈接/文本比率和基于文本量的方法以類似于信息論中信息量計(jì)算的方式進(jìn)行結(jié)合,對(duì)博客類網(wǎng)頁的信息抽取達(dá)到較好的效果。目前對(duì)正文信息抽取的研究大多適用于信息量較大的網(wǎng)頁,如新聞、博客、論壇等,對(duì)于正文信息量較少的網(wǎng)頁抽取效果并不好,如大眾點(diǎn)評(píng)網(wǎng)等。而且有些方法對(duì)于一些閾值的設(shè)置介紹并不明確,存在依靠經(jīng)驗(yàn)設(shè)置的不足。

      針對(duì)上述研究的不足,設(shè)計(jì)一種通用的垂直爬蟲技術(shù)是非常有必要的,而本文設(shè)計(jì)方法能夠?qū)Σ煌W(wǎng)站不同類型的網(wǎng)頁實(shí)現(xiàn)快速、準(zhǔn)確的數(shù)據(jù)爬取和閾值的動(dòng)態(tài)自動(dòng)設(shè)置。

      2 GWC原型系統(tǒng)整體框架

      通過配置簡單少量的信息,指導(dǎo)爬蟲搜索策略的設(shè)計(jì)和數(shù)據(jù)解析路徑自動(dòng)提取,是本文通用型垂直爬蟲的設(shè)計(jì)前提。本文研究方法將用到的幾個(gè)基本配置信息如表1所示。

      表1 基本配置信息

      GWC原型系統(tǒng)的整體框架如圖1所示,根據(jù)預(yù)先配置的少量基本信息,從不同網(wǎng)站中快速實(shí)現(xiàn)定制化數(shù)據(jù)精確提取,無需二次處理,并將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫。

      圖1 GWC原型系統(tǒng)的整體框架

      GWC原型系統(tǒng)主要模塊的功能介紹如下:

      1)配置模塊:完成少量基本信息的配置,如入口鏈接、關(guān)鍵詞和目標(biāo)爬取數(shù)據(jù),指導(dǎo)爬蟲實(shí)現(xiàn)定制化數(shù)據(jù)抓取。

      2)初始化模塊:在初始化階段預(yù)先爬取一定數(shù)量的URL,并自動(dòng)識(shí)別出目標(biāo)頁面URL和目錄頁面URL,同時(shí)生成URL正則表達(dá)式過濾器和數(shù)據(jù)精確解析路徑模板(Wrapper),其中,URL正則表達(dá)式過濾器包括目錄頁面正則表達(dá)式過濾器和目標(biāo)頁面正則表達(dá)式過濾器。

      3)正式爬取模塊:依據(jù)有監(jiān)督的廣度優(yōu)先與網(wǎng)頁帶權(quán)搜索策略實(shí)現(xiàn)目標(biāo)頁面的抓取,使用數(shù)據(jù)精確解析路徑模板實(shí)現(xiàn)數(shù)據(jù)自動(dòng)準(zhǔn)確抽取。

      在不需要修改源代碼的前提下,僅通過修改少量配置信息即可對(duì)不同網(wǎng)站實(shí)現(xiàn)快速、準(zhǔn)確的定制化信息爬取存在兩大難點(diǎn):1)如何設(shè)計(jì)高效準(zhǔn)確的通用型爬蟲搜索策略;2)如何實(shí)現(xiàn)數(shù)據(jù)解析路徑自動(dòng)提取。針對(duì)以上2個(gè)難點(diǎn),本文提出一種較為有效的通用型垂直爬蟲設(shè)計(jì)方法。

      3 有監(jiān)督的廣度優(yōu)先網(wǎng)頁帶權(quán)搜索策略

      網(wǎng)頁的抓取策略通??梢苑譃樯疃葍?yōu)先、廣度優(yōu)先和最佳優(yōu)先3種。深度優(yōu)先在很多情況下會(huì)導(dǎo)致爬蟲的陷入問題,目前常見的是廣度優(yōu)先和最佳優(yōu)先方法。本文采用的是有監(jiān)督的廣度優(yōu)先網(wǎng)頁帶權(quán)搜索策略,利用正則表達(dá)式過濾器廣度優(yōu)先大范圍搜索相關(guān)頁面,同時(shí)輔以基于隧道技術(shù)的網(wǎng)頁權(quán)值計(jì)算達(dá)到有監(jiān)督的最佳優(yōu)先效果。本文設(shè)計(jì)的搜索策略能夠保證爬蟲充分、快速、準(zhǔn)確的對(duì)相關(guān)頁面進(jìn)行定位及下載。

      在很多情況下,垂直爬蟲都是被設(shè)計(jì)用來只抓取某個(gè)指定網(wǎng)站中的特定主題網(wǎng)頁,而對(duì)于這些頁面的搜索通常設(shè)計(jì)人員會(huì)預(yù)先在網(wǎng)頁源碼中人工分析出所要解析的URL,將這些URL的解析路徑預(yù)先寫入到程序中,并且通??赡軙?huì)預(yù)先人工維護(hù)一個(gè)初始爬取URL隊(duì)列,以保證爬蟲程序在運(yùn)行過程中充分、精準(zhǔn)的從頁面中解析出相關(guān)的URL,從而過濾掉所有的噪音URL,這些工作耗費(fèi)大量時(shí)間和精力。合理的搜索策略將保證爬蟲減少無關(guān)頁面的下載和避免陷入的問題,將極大地保證爬蟲的爬取效率和爬取數(shù)據(jù)的準(zhǔn)確性。為此,本文采用一種高效的有監(jiān)督的廣度優(yōu)先網(wǎng)頁帶權(quán)搜索策略。

      3.1 正則表達(dá)式過濾器

      正則表達(dá)式過濾器包括目錄頁面正則表達(dá)式過濾器和目標(biāo)頁面正則表達(dá)式過濾器。它的作用包括2個(gè)方面:一是當(dāng)解析頁面的HTML文件獲取到URL時(shí),先用過濾器進(jìn)行判斷,如果URL與正則表達(dá)式匹配,則放入待爬取隊(duì)列,如果不匹配,則過濾掉該URL,同時(shí)用以區(qū)分目標(biāo)頁面和目錄頁面進(jìn)行不同的網(wǎng)頁解析;二是在計(jì)算頁面權(quán)值時(shí)作為一個(gè)計(jì)算參數(shù),用來判斷頁面是否包含目標(biāo)頁面URL。

      在初始化階段,利用預(yù)先配置的有限的入口鏈接和關(guān)鍵詞信息,使程序在預(yù)爬取一定數(shù)量的頁面后可以自動(dòng)準(zhǔn)確的找到目標(biāo)頁面URL和目錄頁面URL并為目錄URL分類,最后將每一類URL抽取出正則表達(dá)式,實(shí)現(xiàn)過程如下描述。

      預(yù)配置的入口鏈接一般都是初始目錄頁面鏈接,而需要通過這個(gè)入口在網(wǎng)站中找到所有的目標(biāo)頁面URL,因?yàn)橹皼]有配置目標(biāo)頁面URL信息,所以初始時(shí)程序并不知道待爬取的目標(biāo)頁面URL的格式,相關(guān)信息只有預(yù)先配置的少量關(guān)鍵詞信息(關(guān)鍵詞是目標(biāo)頁面的標(biāo)識(shí)信息),同時(shí)目標(biāo)頁面與目錄頁面中所包含的URL數(shù)量存在較大差異,而且目標(biāo)頁面在網(wǎng)站中數(shù)量也通常是較大的,利用這些有限信息完成對(duì)目標(biāo)頁面URL的識(shí)別和相關(guān)目錄頁面的分類。

      初始化階段預(yù)先從入口鏈接廣度優(yōu)先爬取一定數(shù)量的頁面(一般4 000個(gè)~5 000個(gè)就可以滿足需求),并且在爬取過程中每下載一個(gè)URL則判斷該頁面是否包含關(guān)鍵詞信息,如果包含則將頁面權(quán)值置為0,否則在父頁面權(quán)值的基礎(chǔ)上加1(在后續(xù)部分會(huì)有帶權(quán)網(wǎng)頁計(jì)算的詳細(xì)介紹,而此部分只利用關(guān)鍵詞作為網(wǎng)頁權(quán)值計(jì)算參數(shù)),然后將帶權(quán)值的網(wǎng)頁URL加入到爬取隊(duì)列中,在程序進(jìn)行下一次爬取時(shí)會(huì)優(yōu)先下載權(quán)值低的URL,這樣會(huì)保證程序在有限的預(yù)爬取時(shí)間里盡可能多地爬取到與主題相關(guān)的目標(biāo)頁面和目錄頁面URL。同時(shí)在下載頁面時(shí)會(huì)統(tǒng)計(jì)并保存該頁面所包含的URL數(shù)量。當(dāng)預(yù)設(shè)數(shù)量的頁面爬取結(jié)束后,通過計(jì)算入口鏈接頁面包含的URL數(shù)量與這些下載頁面包含的URL數(shù)量的差值,并取差值的平均值作為區(qū)分目錄頁面和目標(biāo)頁面的閾值,然后程序?qū)@些URL數(shù)量差值大于這個(gè)閾值頁面URL進(jìn)行聚類,最大的類則為預(yù)期的目標(biāo)頁面URL類,再通過URL正則表達(dá)式的生成規(guī)則抽取出目標(biāo)頁面正則表達(dá)式過濾器。最后將預(yù)爬取到的所有URL進(jìn)行聚類,剔除掉目標(biāo)頁面URL類,則剩下的URL類即是目標(biāo)頁面URL類。而通常聚類的數(shù)量很多,通過大量實(shí)驗(yàn)證明本文只取前10個(gè)最大的類即可包含所有主要目錄頁面類別,并分別抽取出正則表達(dá)式作為目錄頁面URL正則表達(dá)式過濾器。

      本文將這一階段定義為初始化階段,在初始化階段抽取出URL正則表達(dá)式過濾器和提取數(shù)據(jù)解析路徑模板。

      3.1.1 URL正則表達(dá)式的生成規(guī)則

      首先介紹URL的數(shù)據(jù)結(jié)構(gòu)。把一個(gè)URL分成3個(gè)部分(去掉http協(xié)議部分):Host,Path和Query。其中,Path由一系列directory參數(shù)組成,Query由一系列鍵值對(duì)組成。例如URL為http://news.qq.com/a/20150415/044667.htm?tu_biz=1.114.1.0&du=1,其中,Host為news.qq.com,Path為/a/20150415/044667.htm,Query為tu_biz=1.114.1.0&du=1,組成該Query的鍵值對(duì)為(tu_biz,1.114.1.0)和(du,1)。

      由于本文設(shè)計(jì)的通用型垂直爬蟲每次的爬取都是針對(duì)某個(gè)特定網(wǎng)站,所解析到的URL都是該網(wǎng)站中的URL,因此無論是對(duì)于每一類的目標(biāo)頁面還是目錄頁面的正則表達(dá)式生成,都會(huì)將Host部分直接保留下來,而Path和Query部分都是將其細(xì)分,然后對(duì)每一個(gè)參數(shù)都在同類URL中提取共有的正則表達(dá)式規(guī)則。通過對(duì)大量網(wǎng)站的觀察,本文總結(jié)出常見的URL正則表達(dá)式生成規(guī)則,如表2所示,其基本包括了URL常見的參數(shù)形式。

      表2 正則表達(dá)式生成規(guī)則

      3.1.2 URL聚類

      由于可獲取到的主題相關(guān)目錄頁面不止一個(gè),這些目錄頁面依據(jù)它們的URL結(jié)構(gòu)特點(diǎn)可以劃分聚合成不同的種類,而每一類可以將其依據(jù)URL正則表達(dá)式的生成規(guī)則自動(dòng)抽取出這一類URL的正則表達(dá)式作為其過濾器。

      每條URL本質(zhì)就是一個(gè)由簡單字符組成的字符串,URL聚類的實(shí)質(zhì)就是將相似的URL字符串劃分為同一類,因此URL聚類的關(guān)鍵就是URL字符串相似度的計(jì)算。根據(jù)URL的結(jié)構(gòu),由于本文針對(duì)的是特定網(wǎng)站的爬取,因此每一類的Host部分必然是相同的,Path部分不同數(shù)量的directory參數(shù)和參數(shù)值的不同決定了該條URL所指向的同一網(wǎng)站不同類型的網(wǎng)頁,而Query部分的距離不用于對(duì)2條URL距離的判斷,如果2條URL除了Query其他部分都相同,則這2個(gè)鏈接指向的頁面基本是由同一個(gè)模板產(chǎn)生或?qū)儆谕恢黝},因此URL相似度計(jì)算的關(guān)鍵就是Path部分相似度的計(jì)算。而Path部分的每一個(gè)directory參數(shù)都具有不同的實(shí)際意義,參數(shù)之間也通常會(huì)有較大的差別,并且每一位置的相似度對(duì)于整條URL的相似度貢獻(xiàn)值是不同的,位置越靠前的參數(shù)相似度越高也就意味著URL的相似度越高。因此,將Path部分整體作為一個(gè)字符串進(jìn)行比較顯然是不合理的,需要將Path部分按directory參數(shù)進(jìn)行拆分,對(duì)每一個(gè)參數(shù)分別進(jìn)行相似度計(jì)算,再將參數(shù)的相似度進(jìn)行整合從而得到2條URL的相似度。經(jīng)過大量網(wǎng)站的觀察發(fā)現(xiàn),Path部分的directory參數(shù)基本都是非常短的字符串,長度基本在20個(gè)字符以內(nèi)。常見的字符串相似度算法有編輯距離算法、最長公共子串算法、貪心字符串匹配算法等,對(duì)于較短字符串的相似度計(jì)算,算法之間的時(shí)間效率差別不大,因此本文選擇了常見的計(jì)算簡單的編輯距離算法進(jìn)行URL的相似度計(jì)算。

      基于上文中介紹的URL數(shù)據(jù)結(jié)構(gòu),本文利用各個(gè)部分的距離來計(jì)算URL之間的相似度。2條URLi、j的相似度用sURLij表示,首先要判斷2條URL的Host部分是否相同,若Hosti≠Hostj,則直接將sURLij值置為0,若Hosti=Hostj,判斷Path部分的長度(即參數(shù)個(gè)數(shù))是否相等,如果Path_Lengthi≠Path_Lengthj,也將sURLij直接置為0,這兩步的計(jì)算是為了保證將Host部分不同的URL以及Host部分相同但Path部分長度不同的URL直接聚合成不同的類,即聚成的每一個(gè)URL類都必須保證Host部分相同而且Path部分長度也相同。

      當(dāng)Hosti=Hostj且Path_Lengthi=Path_Lengthj時(shí),分別計(jì)算出2條URL的Path部分每一位置directory參數(shù)的編輯距離edit,并做歸一化處理,將每一部分參數(shù)的編輯距離與該部分參數(shù)的理論上最大編輯距離(即2條待比較串最長串的長度)做比值,URL之間越相似其相似度的值應(yīng)該越大,因此將URL比值加1再取倒數(shù)。同時(shí),由于Path部分每一位置的directory參數(shù)具有實(shí)際意義,而且每一位置的參數(shù)對(duì)于整條URL相似度的貢獻(xiàn)度是不同的,位置越靠前的參數(shù)相似度越高就意味著整個(gè)URL的相似度越高,因此將每一部分directory參數(shù)設(shè)置不同的URL相似度參數(shù),如果Path有m個(gè)參數(shù),則第一個(gè)位置的參數(shù)對(duì)應(yīng)的URL相似度參數(shù)為m,其余部分參數(shù)的URL相似度參數(shù)值依次遞減,最后將所有位置參數(shù)得到的編輯距離比值倒數(shù)與對(duì)應(yīng)位置參數(shù)的URL相似度參數(shù)乘積求和即為2條URL的相似度。若2個(gè)URL的Path部分有m個(gè)參數(shù),則URL距離計(jì)算公式如下所示:

      (1)

      其中,m為每條URL Path部分的directory個(gè)數(shù),editk為2條URL第k個(gè)位置對(duì)應(yīng)的2個(gè)directory參數(shù)的編輯距離,而max_editk則表示對(duì)應(yīng)的2個(gè)directory參數(shù)理論上最大的編輯距離,即長度最大的directory參數(shù)的長度。

      在聚類時(shí)通過URL相似度計(jì)算公式得到2條URL的相似度,而聚為一類的URL之間的相似度都不小于一個(gè)閾值h,本文對(duì)于相似度閾值的設(shè)定是自動(dòng)動(dòng)態(tài)設(shè)定的,相似度的閾值計(jì)算公式為:

      (2)

      其中,m為每條URL Path部分的directory個(gè)數(shù)。若滿足閾值條件則聚為一類,如果小于閾值則以該條URL為基準(zhǔn)新建一個(gè)類。URL聚類算法描述如下:

      算法1URL聚類算法

      輸入U(xiǎn)RL_Queue;//輸入為一個(gè)URL隊(duì)列

      輸出URL_Regex_Queue;//輸出URL正則表達(dá)式//隊(duì)列

      1.創(chuàng)建一個(gè)URL聚類隊(duì)列URL_Cluster_Queue;

      2.while(URL_Queue不為空){

      3.從URL_Queue取出一個(gè)Url;

      4.If(URL_Cluster_Queue 為空){

      5.初始化一個(gè)僅包含該Url的聚類URL_Cluster;

      6.將該聚類添加到隊(duì)列URL_Cluster_Queue;

      7.}

      8.Else{

      9.Boolean flag=false;

      10.foreach(URL_Cluster in URL_Cluster_Queue){

      11.sURL= Url與URL_Cluster中每個(gè)url的相似度均值;

      12.If(sURL>=h){

      13.將Url添加到該聚類URL_Cluster;

      14.flag=true;

      15.break;

      16.}

      17.}

      18.If(flag==false){

      19.初始化僅包含該url的新聚類URL_Cluster;

      20.將新URL_Cluster 添加到URL_Cluster_Queue;

      21.}

      22.}

      23.}

      24.對(duì)URL_Cluster_Queue中的每個(gè)聚類生成對(duì)一個(gè)正則表達(dá)式,輸出到URL_Regex_Queue

      在所有的URL聚類結(jié)束后,使用URL正則表達(dá)式的生成規(guī)則為每一類URL抽取出對(duì)應(yīng)類的URL正則表達(dá)式,作為目錄頁面正則表達(dá)式過濾器,其示例為:

      [http://www.dianping.com/shop/[0-9]+(.[a-zA-Z]+)?/?,http://www.dianping.com/search/category/[0-9]+/[0-9]+/w+(.[a-zA-Z]+)?/?,http://www.dianping.com/mylist/[0-9]+(.[a-zA-Z]+)?/?,http://www.dianping.com/member/[0-9]+(.[a-zA-Z]+)?/?,http://www.dianping.com/search/keyword/[0-9]+/.*(.[a-zA-Z]+)?/?,http://www.dianping.com/[a-zA-Z]+/food(.[a-zA-Z]+)?/?,http://www.dianping.com/member/[0-9]+/badge/[0-9]+(.[a-zA-Z]+)?/?]

      3.2 帶權(quán)網(wǎng)頁計(jì)算

      大部分網(wǎng)站都可以看作3層結(jié)構(gòu)(如圖2所示):初始種子頁面,目錄頁面,目標(biāo)頁面(無關(guān)頁面)。網(wǎng)絡(luò)爬蟲在這種網(wǎng)頁結(jié)構(gòu)上不斷的向深度和廣度游走,搜索與目標(biāo)主題相關(guān)的頁面,最終目標(biāo)是搜索到全部目標(biāo)頁面,而在這個(gè)過程中將會(huì)經(jīng)過大量的無關(guān)頁面和相關(guān)的目錄頁面。如果爬蟲沿著無關(guān)頁面深度搜索下去將遠(yuǎn)遠(yuǎn)偏離目標(biāo)頁面,極大地影響爬蟲的工作效率和爬取數(shù)據(jù)的準(zhǔn)確性。為此,本文提出有監(jiān)督的廣度優(yōu)先與網(wǎng)頁帶權(quán)搜索策略,以保證爬蟲能夠在網(wǎng)站3層結(jié)構(gòu)中沿著正確的方向游走,減少無關(guān)頁面的下載,提高搜索效率,而該策略最關(guān)鍵的就是帶權(quán)網(wǎng)頁的計(jì)算。

      圖2 網(wǎng)站3層結(jié)構(gòu)

      基于這種網(wǎng)站3層結(jié)構(gòu),通用型垂直爬蟲的設(shè)計(jì)在爬取時(shí)將其劃分為2個(gè)階段,初始化階段和正式爬取階段。在初始化階段,預(yù)爬取大量URL找到盡可能多地與目標(biāo)頁面相關(guān)的目錄頁面,從而生成目錄頁面正則表達(dá)式過濾器。對(duì)于確定一個(gè)頁面是否是目錄頁面,本文采用目標(biāo)頁面正則表達(dá)式和目標(biāo)頁面關(guān)鍵詞相結(jié)合的方法,如下文詳細(xì)介紹。

      3.2.1 主題孤島問題

      文獻(xiàn)[14]提出在實(shí)際的網(wǎng)絡(luò)中主題相關(guān)的網(wǎng)頁并不總是連在一起的,從一個(gè)主題相關(guān)的頁面鏈接到另一個(gè)主題相關(guān)頁面經(jīng)常需要穿過多個(gè)無關(guān)頁面,因此也造成網(wǎng)絡(luò)中存在主題孤島的現(xiàn)象,即一個(gè)主題島周圍往往會(huì)被一些主題無關(guān)頁面包圍致使與其他主題島分割。

      文獻(xiàn)[15]提出了一種簡單的隧道技術(shù)來解決主題孤島問題,它們將每個(gè)頁面設(shè)置一個(gè)權(quán)值,如果該頁面是主題相關(guān)頁面,則它的權(quán)值置為0,如果是主題無關(guān)頁面,則該頁面的權(quán)值在其父頁面的權(quán)值基礎(chǔ)上加1。如圖3所示,節(jié)點(diǎn)代表頁面,加黑節(jié)點(diǎn)代表主題相關(guān)頁面,其他節(jié)點(diǎn)代表主題無關(guān)頁面,箭頭代表一張頁面到另一張頁面的鏈接。根據(jù)隧道技術(shù),節(jié)點(diǎn)1代表的頁面的權(quán)值為0,節(jié)點(diǎn)2、3、4代表的頁面的權(quán)值為1,節(jié)點(diǎn)5代表的頁面的權(quán)值為0,節(jié)點(diǎn)6、7、8代表的頁面的權(quán)值為2,節(jié)點(diǎn)9代表的頁面的權(quán)值為0,而節(jié)點(diǎn)10代表的頁面的權(quán)值為1。垂直爬蟲在爬取時(shí)只抓取權(quán)值小于一個(gè)閾值的頁面,如閾值為2,則節(jié)點(diǎn)6、7、8、9、10代表的頁面都不會(huì)被抓取,如果閥值設(shè)為大于2,那么圖3中的所有頁面都將會(huì)被抓取。

      圖3 頁面距離示意圖

      3.2.2 基于隧道技術(shù)的網(wǎng)頁權(quán)值計(jì)算

      本文在上述隧道技術(shù)的基礎(chǔ)上,明確了與目標(biāo)頁面相關(guān)網(wǎng)頁的判斷和權(quán)值計(jì)算:對(duì)于任意頁面URL1,如果URL1對(duì)應(yīng)的HTML文檔包含指向目標(biāo)頁面的URL即有可通過目標(biāo)頁面正則表達(dá)式過濾器的URL,或者該HTML文檔中包含配置文件中的關(guān)鍵詞,則將該URL1的權(quán)值置0,當(dāng)沒有關(guān)鍵詞,而且不指向相關(guān)頁面時(shí),則URL1的權(quán)值在指向它的頁面的權(quán)值基礎(chǔ)上加1。例如,設(shè)URL1中指向其他頁面的任意一個(gè)URL為URL2,若URL2對(duì)應(yīng)的HTML文檔包含指向目標(biāo)頁面的URL或者包含關(guān)鍵詞,則權(quán)值置0,否則在URL1權(quán)值的基礎(chǔ)上加1。

      URLWeight=

      (3)

      其中,URLWeight表示網(wǎng)頁的權(quán)值。

      按照上述定義,URL權(quán)值越大代表該URL與目標(biāo)頁面關(guān)系越小。設(shè)置不同的閾值爬取的效果一般是不同的,以預(yù)爬取5 000個(gè)頁面為例,其中,隨機(jī)選取新浪股票網(wǎng)站抓取股票相關(guān)的頁面和大眾點(diǎn)評(píng)網(wǎng)抓取川菜主題相關(guān)的店鋪信息頁面結(jié)果為示例(此處只關(guān)心抓取到的與主題相關(guān)的頁面數(shù)量),不同閾值和條件爬取結(jié)果如表3所示。

      表3 不同閾值和條件爬取結(jié)果

      由表3可知,設(shè)置不同閾值對(duì)于爬取到的相關(guān)頁面數(shù)量是有影響的,其中新浪股票的結(jié)果不是很顯著,因?yàn)檫@是一個(gè)相對(duì)較大的專題,在開始爬取時(shí)就會(huì)有大量的相關(guān)頁面,而大眾點(diǎn)評(píng)的川菜專題相對(duì)較小,爬取時(shí)會(huì)遇到大量無關(guān)頁面。因?yàn)殚撝档南薅梢詭椭绦蛘业礁嗟南嚓P(guān)頁面,所以大眾點(diǎn)評(píng)的結(jié)果就更為顯著一些。而本文是利用初始化階段預(yù)爬取的效果使程序自動(dòng)預(yù)設(shè)一個(gè)URL權(quán)值的閾值,該閾值是所有預(yù)爬取頁面權(quán)值的平均值并取四舍五入后的值。

      系統(tǒng)在進(jìn)行關(guān)鍵字判斷時(shí),首先會(huì)剔除HTML文檔中所有a[href]標(biāo)簽的屬性值和文本內(nèi)容,因?yàn)檫@樣可以大大減少因跳轉(zhuǎn)鏈接的不相關(guān)內(nèi)容導(dǎo)致爬取到其他無關(guān)頁面,從而得到更準(zhǔn)確的判斷且去除干擾使結(jié)果更加干凈,而且也會(huì)使保存異常結(jié)果的文件中的異常結(jié)果大大減少。

      4 數(shù)據(jù)解析路徑模板自動(dòng)抽取

      每一個(gè)實(shí)體數(shù)據(jù)節(jié)點(diǎn)在網(wǎng)頁中都對(duì)應(yīng)一條唯一的XPath路徑,爬蟲在解析實(shí)體數(shù)據(jù)時(shí)就是根據(jù)這條解析路徑抽取出對(duì)應(yīng)數(shù)據(jù)項(xiàng),而實(shí)體數(shù)據(jù)的XPath路徑通常需要開發(fā)人員在網(wǎng)頁源碼中人工分析,或者借助其他工具提取。為實(shí)現(xiàn)爬蟲程序自動(dòng)提取數(shù)據(jù)解析路徑,生成所需實(shí)體數(shù)據(jù)標(biāo)簽的提取路徑模板,本文設(shè)計(jì)了有效的數(shù)據(jù)解析路徑抽取算法。例如大眾點(diǎn)評(píng)網(wǎng)中北京新世紀(jì)日航飯店這個(gè)目標(biāo)頁面,輸入標(biāo)題“北京新世紀(jì)日航飯店”,可以得到標(biāo)題所在的路徑,之后所有的目標(biāo)頁面都可以從該路徑中提取標(biāo)題信息。

      目標(biāo)頁面模板生成基本流程如圖4所示。

      圖4 目標(biāo)頁面模板生成流程

      從預(yù)先配置的基本信息中讀取前2條目標(biāo)頁面URL(可先分別記為A、B),并將它們的HTML文件下載下來,以這2個(gè)頁面為模板,將它們的HTML文件解析成HTML樹形結(jié)構(gòu),然后取出2棵樹中相同的結(jié)點(diǎn),形成一棵新的樹,新生成的樹即為該頁面類型的模板。對(duì)于2棵樹A和B,先只遍歷樹A,將A中結(jié)點(diǎn)放入節(jié)點(diǎn)隊(duì)列的同時(shí)將該節(jié)點(diǎn)的父節(jié)點(diǎn)路徑也放入隊(duì)列。這里定義的路徑是符合jsoup查詢語法的從根節(jié)點(diǎn)到該節(jié)點(diǎn)的路徑,這樣做的好處是將路徑保存起來之后可以直接使用。從隊(duì)列中提取節(jié)點(diǎn)時(shí),先用jsoup查找樹B中相同路徑下是否存在相同的節(jié)點(diǎn),若存在,就把該節(jié)點(diǎn)和該節(jié)點(diǎn)的路徑放入隊(duì)列,且對(duì)于葉子節(jié)點(diǎn)和非葉子節(jié)點(diǎn)需存在不同隊(duì)列。遍歷完后便得到了2棵樹所有相同葉子節(jié)點(diǎn)的路徑,這樣便形成了一棵樹,即形成了網(wǎng)頁模板。

      在得到公共節(jié)點(diǎn)及節(jié)點(diǎn)路徑的模板后,需要根據(jù)預(yù)先配置的目標(biāo)爬取實(shí)體數(shù)據(jù)信息確定待爬取數(shù)據(jù)的精確解析路徑,實(shí)現(xiàn)數(shù)據(jù)的定制化爬取。其實(shí)現(xiàn)思想是:依次從預(yù)先配置的目標(biāo)爬取數(shù)據(jù)文件中取出每個(gè)需爬取的實(shí)體數(shù)據(jù)標(biāo)簽內(nèi)容,并以標(biāo)簽內(nèi)容為依據(jù)先遍歷已保存的葉子節(jié)點(diǎn)隊(duì)列,若找到了一個(gè)葉子節(jié)點(diǎn)的文本內(nèi)容或?qū)傩灾蹬c標(biāo)簽內(nèi)容相等,則將該葉子節(jié)點(diǎn)及該節(jié)點(diǎn)的路徑保存到相應(yīng)的隊(duì)列中,如果葉子節(jié)點(diǎn)沒有所需的標(biāo)簽,則自底向上遍歷非葉子結(jié)點(diǎn)完成同樣的動(dòng)作,若葉子節(jié)點(diǎn)和非葉子節(jié)點(diǎn)隊(duì)列中都沒有找到與標(biāo)簽內(nèi)容相等的節(jié)點(diǎn),則查找包含實(shí)體數(shù)據(jù)標(biāo)簽內(nèi)容的節(jié)點(diǎn);然后將找到的節(jié)點(diǎn)路徑向根節(jié)點(diǎn)回溯,每回溯一個(gè)節(jié)點(diǎn)時(shí),如果該節(jié)點(diǎn)在同一層兄弟節(jié)點(diǎn)中沒有同名節(jié)點(diǎn),則在節(jié)點(diǎn)路徑中直接保存其節(jié)點(diǎn)名即可,若同一層中有同名節(jié)點(diǎn),需先判斷是否有能區(qū)分其他同名節(jié)點(diǎn)的屬性值(包括id、class及其他屬性),如果有則在路徑中保存該節(jié)點(diǎn)名的同時(shí)保存該屬性名及屬性值,若同名節(jié)點(diǎn)中沒有這種屬性,則需保存該節(jié)點(diǎn)在這層同名中的相對(duì)位置,以便其他節(jié)點(diǎn)準(zhǔn)確找到該節(jié)點(diǎn)。

      當(dāng)所需爬取的標(biāo)簽內(nèi)容數(shù)量不固定的時(shí)候(如評(píng)論),在提取準(zhǔn)確路徑時(shí),將這2個(gè)標(biāo)簽的路徑都提取出來,如以下2條路徑:

      1)div[class=tent]>li:nth-of-type(1)>p[class=info]>span:nth-of-type(2)。

      2)div[class=tent]>li:nth-of-type(2)>p[class=info]>span:nth-of-type(2)。

      然后從路徑的最后一個(gè)節(jié)點(diǎn)往根節(jié)點(diǎn)回溯,并同時(shí)判斷2條路徑對(duì)應(yīng)的節(jié)點(diǎn)是否是兄弟節(jié)點(diǎn),如果不是則繼續(xù)回溯,如果是則將路徑的對(duì)應(yīng)節(jié)點(diǎn)直接用節(jié)點(diǎn)名表示并停止回溯。

      3)div[class=tent]> li>p[class=info]>span:nth-of-type(2)。

      路徑3)是1)、2)這2條路徑的公共路徑,同時(shí)也代表了這類標(biāo)簽的公共路徑,依據(jù)這條路徑,在正式爬取階段就可以將該類標(biāo)簽內(nèi)容全部解析出來。

      經(jīng)過以上流程,最終會(huì)得到需爬取標(biāo)簽的通用解析路徑即通用模板,而這些路徑是以json格式保存到數(shù)據(jù)解析路徑模板文件中。其中,key是“標(biāo)簽名稱#標(biāo)簽內(nèi)容所在部分”的形式表示,標(biāo)簽內(nèi)容所在部分指出了該標(biāo)簽內(nèi)容在節(jié)點(diǎn)中的位置,如果為text說明在節(jié)點(diǎn)的內(nèi)容部分,如果為某一屬性(如id),則說明標(biāo)簽內(nèi)容在節(jié)點(diǎn)中該屬性的值(如id="top"中的top)的部分,value則是符合jsoup解析規(guī)則的標(biāo)簽的通用路徑。示例如圖5所示。

      圖5 通用路徑示例

      依據(jù)上述描述,本文數(shù)據(jù)解析路徑模板自動(dòng)抽取算法包括2部分,如下所示:

      算法2公共網(wǎng)頁模板提取

      輸入Dom_Tree1,Dom_Tree2

      //預(yù)先配置的2個(gè)目標(biāo)頁面的DOM樹

      輸出Leaf_queue,Non_leaf_queue

      //保存葉節(jié)點(diǎn)路徑的隊(duì)列和非葉節(jié)點(diǎn)路徑的隊(duì)列

      1.取Dom_Tree1根節(jié)點(diǎn)root1;

      2.將root1和空路徑加入新建節(jié)點(diǎn)隊(duì)列Nodequeue;

      3.//隊(duì)列Nodequeue中每個(gè)元素保存一個(gè)節(jié)點(diǎn)和父節(jié)點(diǎn)//路徑

      4.While(Nodequeue不為空){

      5.取Nodequeue隊(duì)頭節(jié)點(diǎn)node和父節(jié)點(diǎn)路徑;

      6.計(jì)算node節(jié)點(diǎn)路徑NodePath =父節(jié)點(diǎn)路徑+">"+node節(jié)點(diǎn)名;

      7.If(用NodePath在Dom_Tree2找到相同節(jié)點(diǎn)node{

      8.If(node沒有孩子節(jié)點(diǎn))

      9.將node節(jié)點(diǎn)和節(jié)點(diǎn)路徑NodePath加入葉節(jié)點(diǎn)路徑隊(duì)列Leaf_queue;

      10.Else{

      11.將node節(jié)點(diǎn)和節(jié)點(diǎn)路徑NodePath加入非葉節(jié)點(diǎn)路徑隊(duì)列Non_leaf_queue;

      12.foreach(childNode in node孩子節(jié)點(diǎn)){

      13.將childNode和node節(jié)點(diǎn)路徑NodePath同時(shí)加入Nodequeue;

      14.}

      15.}

      16.}

      17.}

      18.return Leaf_queue,Non_leaf_queue;

      算法3精確節(jié)點(diǎn)路徑提取

      輸入tags.json,Leaf_queue,Non_leaf_queue

      //tags.json為預(yù)先配置的目標(biāo)爬取實(shí)體數(shù)據(jù)

      輸出accurate_nodepath_queue

      //精確的節(jié)點(diǎn)解析路徑隊(duì)列

      1.foreach(targetData in tags.json){

      2.int flag1=0,flag2=0;

      3.Node Tnode=null;

      4.foreach(leafNode in Leaf_queue){ //遍歷葉子節(jié)點(diǎn)

      5.If(leafNode文本數(shù)據(jù)或者屬性值等于targetData){

      6.Tnode=leafNode;

      7.flag1=1;

      8.break;

      9.}

      10.else if(leafNod文本數(shù)據(jù)或者屬性值包含targetData){

      11.Tnode=leafNode;

      12.flag2=1;

      13.continue;

      14.}

      15.}

      16.While(flag1=0){

      17.foreach(nonLeafNode in Non_leaf_queue){//遍歷非//葉子節(jié)點(diǎn)

      18.If(nonLeafNode的文本數(shù)據(jù)或者屬性值等于 targetData){

      19.Tnode=nonLeafNode;

      20.flag1=1;

      21.break;

      22.}

      23.else if(flag2==0&& nonLeafNode的文本數(shù)據(jù)或者屬性值包含targetData){

      24.Tnode=nonLeafNode;

      25.continue;

      26.}

      27.}

      28.}

      29.取Tnode 節(jié)點(diǎn)路徑TnodePath;

      30.foreach(node in TnodePath){//反向遍歷節(jié)點(diǎn)路徑//TnodePath上的節(jié)點(diǎn)

      31.If(node的兄弟節(jié)點(diǎn)中不存在同名節(jié)點(diǎn)){

      32.在節(jié)點(diǎn)路徑TnodePath直接保留node節(jié)點(diǎn)名;

      33.Continue;

      34.}else if(node在兄弟同名節(jié)點(diǎn)中存在不同的屬性值)//{優(yōu)先考慮ID和class屬性

      35.在節(jié)點(diǎn)路徑TnodePath中對(duì)應(yīng)的node節(jié)點(diǎn)名后面加上此屬性及屬性值;

      36.Continue;

      37.}else{

      38.計(jì)算該節(jié)點(diǎn)node在兄弟同名節(jié)點(diǎn)中的相對(duì)位置并加入TnodePath中;

      39.}

      40.}

      41.將遍歷修改后的TnodePath加入到精確解析路徑隊(duì)列accurate_nodepath_queue;

      42.}

      43.Ruturn accurate_NodePath_queue;

      5 實(shí)驗(yàn)結(jié)果與分析

      5.1 實(shí)驗(yàn)爬蟲設(shè)計(jì)

      在概述部分介紹的信息抽取工具和方法都是針對(duì)某一類型的網(wǎng)頁實(shí)現(xiàn)數(shù)據(jù)的抓取,并不是可以對(duì)不同網(wǎng)站不同網(wǎng)頁實(shí)現(xiàn)抓取的通用信息抽取模型,并且對(duì)數(shù)據(jù)的抽取也較為粗略。而本文所設(shè)計(jì)的通用型垂直爬蟲設(shè)計(jì)方法,能夠?qū)Σ煌愋偷木W(wǎng)站實(shí)現(xiàn)快速精確的定制化數(shù)據(jù)爬取。兩者的實(shí)現(xiàn)方法和目標(biāo)都不同,因此不適合進(jìn)行實(shí)驗(yàn)比較,并且目前對(duì)于通用型數(shù)據(jù)抽取方法研究的相關(guān)文獻(xiàn)較少,沒有找到合適的對(duì)比方法。但是本文發(fā)現(xiàn)了目前較為流行的一個(gè)數(shù)據(jù)采集應(yīng)用產(chǎn)品——八爪魚數(shù)據(jù)采集器,該產(chǎn)品的應(yīng)用目標(biāo)和實(shí)現(xiàn)方法與本文提出的通用型垂直爬蟲設(shè)計(jì)方法較為相似,因此本文選擇與該產(chǎn)品進(jìn)行實(shí)驗(yàn)對(duì)比,以驗(yàn)證本文方法的可行性和有效性。

      本文設(shè)計(jì)的通用型垂直爬蟲GWC原型系統(tǒng)包括3個(gè)模塊:配置模塊——配置基本信息,預(yù)爬取模塊——在目標(biāo)網(wǎng)站預(yù)先爬取4 000條URL,正式爬取模塊——完成定制化數(shù)據(jù)的正式爬取。該爬蟲程序由Java程序語言完成,并應(yīng)用了HttpClient來模擬瀏覽器完成頁面的下載,使用Jsoup實(shí)現(xiàn)頁面的數(shù)據(jù)解析工作,而Redis則用來實(shí)現(xiàn)數(shù)據(jù)的去重處理和數(shù)據(jù)的存儲(chǔ)。實(shí)驗(yàn)的軟硬件環(huán)境為Windows 7操作系統(tǒng)、AMD A8-5600K APU with Radeon(tm)HD Graphics 3.60 GHz處理器、8 GB安裝內(nèi)存(RAM)、64位操作系統(tǒng)。

      5.2 初始化階段實(shí)驗(yàn)結(jié)果及分析

      當(dāng)配置信息配置完成后,GWC原型系統(tǒng)則開始進(jìn)行初始化,預(yù)下載4 000個(gè)頁面即4 000條URL,完成URL正則表達(dá)式過濾器和通用路徑模板的生成。當(dāng)達(dá)到預(yù)設(shè)的4 000個(gè)頁面閾值時(shí),系統(tǒng)則會(huì)自動(dòng)停止。GWC原型系統(tǒng)在初始化階段的爬取情況如圖6~圖8所示。

      圖6 預(yù)爬取時(shí)間對(duì)比

      圖7 頁面權(quán)值平均值對(duì)比

      圖8 目標(biāo)頁面URL識(shí)別準(zhǔn)確率

      由圖6可以看出,預(yù)爬取4 000個(gè)頁面基本可維持在11 min~13 min左右,不會(huì)耗費(fèi)大量時(shí)間,偶爾也會(huì)因?yàn)榫W(wǎng)速等網(wǎng)絡(luò)環(huán)境原因達(dá)到15 min以上。但總體來說,僅需要十幾至二十分鐘的時(shí)間即可完成初始化的工作,為正式爬取階段做好必要的準(zhǔn)備,具有較高的效率。

      由圖7可以看出,每個(gè)網(wǎng)站爬取到相關(guān)頁面的頁面平均權(quán)值保持在一個(gè)穩(wěn)定的閾值,不同的網(wǎng)站閾值分布也有差異,由于本文在網(wǎng)頁權(quán)值計(jì)算時(shí)將權(quán)值設(shè)置為整數(shù),因此對(duì)頁面權(quán)值的平均值進(jìn)行四舍五入取整即可,根據(jù)爬取結(jié)果以上測(cè)試的幾個(gè)網(wǎng)站在正式爬取階段均可將網(wǎng)頁權(quán)值閾值設(shè)置為1,在后續(xù)實(shí)驗(yàn)中也證明了本文閾值的設(shè)置是合理的,可以保證程序充分準(zhǔn)確的爬取到主題相關(guān)目標(biāo)頁面。同時(shí),圖8目標(biāo)頁面URL識(shí)別準(zhǔn)確率的結(jié)果也充分證明本文對(duì)目標(biāo)頁面URL識(shí)別的方法完全可以保證識(shí)別的準(zhǔn)確率,而且對(duì)于目錄頁面URL的分類和選取也同樣可以保證系統(tǒng)對(duì)于目標(biāo)頁面的充分爬取(在正式爬取階段的結(jié)果可以體現(xiàn))。

      綜上實(shí)驗(yàn)結(jié)果,本文設(shè)計(jì)的搜索策略可以保證爬蟲系統(tǒng)在短時(shí)間內(nèi)抓取到足夠數(shù)量的相關(guān)目錄頁面,并且可以自動(dòng)準(zhǔn)確的識(shí)別出目標(biāo)頁面URL,完成頁面權(quán)值閾值的設(shè)置,能夠準(zhǔn)確的生成足夠數(shù)量的目錄頁面正則表達(dá)式過濾器以及目標(biāo)爬取數(shù)據(jù)的通用路徑模板,為正式爬取階段做好準(zhǔn)備。

      5.3 正式爬取階段與現(xiàn)有通用爬蟲技術(shù)實(shí)驗(yàn)對(duì)比

      依據(jù)本文的實(shí)現(xiàn)策略設(shè)計(jì)的爬蟲系統(tǒng)與八爪魚數(shù)據(jù)采集器從爬取效率、數(shù)據(jù)完整性和數(shù)據(jù)準(zhǔn)確性3個(gè)方面進(jìn)行對(duì)比。

      5.3.1 爬取效率

      八爪魚僅可以爬取具有分頁列表的頁面,而且在爬取的過程中是以翻頁的方式進(jìn)行采集,因此其在總爬取時(shí)間上是占優(yōu)勢(shì)的。而GWC原型系統(tǒng)的批量爬取是采取有監(jiān)督的廣度優(yōu)先與網(wǎng)頁帶權(quán)搜索策略以全網(wǎng)站搜索的方式進(jìn)行,因此總的爬取時(shí)間要慢一些,但也不是絕對(duì)的,有些時(shí)候在總的爬取時(shí)間上該系統(tǒng)還是會(huì)更快一些。一旦程序定位到了目標(biāo)頁面的目錄頁面,GWC原型系統(tǒng)對(duì)于該目錄頁面的目標(biāo)頁面數(shù)據(jù)抓取相對(duì)更快,而且單位時(shí)間內(nèi)的網(wǎng)頁抓取效率也更優(yōu)。

      在爬取眾籌網(wǎng)數(shù)據(jù)時(shí)(30 min),GWC原型系統(tǒng)可以爬取2 000~3 000多條數(shù)據(jù),而八爪魚即使是以翻頁的方式進(jìn)行爬取,也只能爬取500~600多條數(shù)據(jù)。

      當(dāng)爬取新浪股票數(shù)據(jù)時(shí)(5 h),GWC原型系統(tǒng)可以爬取2 300~2 500條數(shù)據(jù),雖然在正式爬取時(shí)其爬取總時(shí)間是15 h左右,而在實(shí)際爬取工作中,5 h~6 h即可爬取到近85%的數(shù)據(jù)量,剩余的10 h時(shí)間是為了保證爬取數(shù)據(jù)的數(shù)據(jù)量足夠多,以保證數(shù)據(jù)的完整性。而八爪魚在5 h的時(shí)間只抓取到了1 500多條數(shù)據(jù),而且隨著爬取時(shí)間的增長,可以明顯觀察到其爬取速度在減慢。雖然GWC原型系統(tǒng)有時(shí)在總爬取時(shí)間上要慢一些,但是全網(wǎng)站搜索可以保證數(shù)據(jù)的完整性。

      5.3.2 數(shù)據(jù)完整性

      在前文提到,八爪魚僅可以爬取具有分頁列表的頁面,而一旦要爬取的目標(biāo)頁面沒有給出分頁列表或者分頁列表數(shù)據(jù)不全時(shí),就無法對(duì)數(shù)據(jù)進(jìn)行批量采集或者采集的數(shù)據(jù)有大量的遺漏缺失。

      以大眾點(diǎn)評(píng)網(wǎng)數(shù)據(jù)為例,爬取川菜專題時(shí),網(wǎng)站顯示的總店鋪數(shù)量有近17 000家(而實(shí)際存在的只有14 000~15 000家左右,因?yàn)閰^(qū)域重疊和分類重疊的原因造成店鋪有重疊),而其分頁列表中則一共只給出了1 000多家店鋪,用八爪魚進(jìn)行爬取只采集到了700多條數(shù)據(jù),而GWC原型系統(tǒng)則采集到了14 000多條數(shù)據(jù),但是要去掉2 000多條異常數(shù)據(jù),在很大程度上保證了數(shù)據(jù)量的完整。對(duì)于八爪魚遺漏的數(shù)據(jù),當(dāng)然用戶可以花費(fèi)一定時(shí)間去尋找其他分頁列表再次進(jìn)行配置和爬取,但是對(duì)于其通用性和效率來說是有一定影響的,且進(jìn)行再次爬取時(shí)會(huì)爬取到大量已下載的重復(fù)數(shù)據(jù)。即使分頁列表中給出了所有的數(shù)據(jù)量,經(jīng)過幾次抓取測(cè)試,八爪魚也不會(huì)將數(shù)據(jù)爬取完全,仍然有大量數(shù)據(jù)遺漏丟失。

      在爬取眾籌網(wǎng)數(shù)據(jù)(預(yù)期約4 400條)時(shí),八爪魚在進(jìn)行了1 h后即停止了爬取,但是其只爬到800多條數(shù)據(jù),而經(jīng)過幾次測(cè)試GWC原型系統(tǒng)則是在2 h后完成了爬取,與預(yù)期數(shù)據(jù)量相比數(shù)據(jù)誤差沒有超過20條數(shù)據(jù)。對(duì)于GWC原型系統(tǒng)而言,利用本文設(shè)計(jì)的搜索策略,采用全網(wǎng)站搜索的方式,因此在充分時(shí)間爬取后數(shù)據(jù)量基本可以達(dá)到預(yù)期效果,不會(huì)大量遺漏數(shù)據(jù)。

      在爬取新浪股票數(shù)據(jù)(預(yù)期約4 400條)時(shí),八爪魚在近11 h的時(shí)間爬取了2 600多條數(shù)據(jù),而GWC原型系統(tǒng)則最終能夠爬取到近3 050條數(shù)據(jù)。圖9所示為3個(gè)例子的數(shù)據(jù)完整性對(duì)比圖。

      圖9 3個(gè)例子的數(shù)據(jù)完整性對(duì)比

      對(duì)于八爪魚而言,無法完成一個(gè)目標(biāo)頁面中的數(shù)量不固定標(biāo)簽數(shù)據(jù)(如評(píng)論)的爬取,只能一次爬取其中一條數(shù)據(jù),如果強(qiáng)迫一次爬取所有數(shù)據(jù)則會(huì)增加大量無關(guān)的雜質(zhì)數(shù)據(jù)。有些數(shù)據(jù)在HTML樹中的節(jié)點(diǎn)定位也不如GWC原型系統(tǒng)準(zhǔn)確,即會(huì)造成在爬取數(shù)據(jù)時(shí)增加部分雜質(zhì)數(shù)據(jù)。而GWC原型系統(tǒng)利用在初始化階段生成的目標(biāo)爬取數(shù)據(jù)精確解析路徑模板,在正式爬取階段能夠準(zhǔn)確直接的從目標(biāo)頁面中找到目標(biāo)數(shù)據(jù)節(jié)點(diǎn),從而能夠準(zhǔn)確的抽取出干凈的目標(biāo)數(shù)據(jù)。因此,本系統(tǒng)的數(shù)據(jù)爬取相對(duì)更加完整干凈。

      5.3.3 數(shù)據(jù)準(zhǔn)確性

      數(shù)據(jù)準(zhǔn)確性是指是否爬取到主題目標(biāo)頁面數(shù)據(jù)。八爪魚以翻頁的形式下載頁面,爬取數(shù)據(jù)的準(zhǔn)確率很高,只要爬取的分頁列表中給出的目標(biāo)頁面都是準(zhǔn)確的,其準(zhǔn)確率都可以達(dá)到100%,而對(duì)于大眾點(diǎn)評(píng)網(wǎng),在川菜列表中同樣出現(xiàn)了很多火鍋、小吃快餐、西餐等其他類別的店鋪,八爪魚無法對(duì)這些非目標(biāo)頁面過濾掉而是全部爬取下來,此時(shí)準(zhǔn)確率也會(huì)降低。

      GWC原型系統(tǒng)是采取有監(jiān)督的廣度優(yōu)先與網(wǎng)頁帶權(quán)搜索策略的形式隨機(jī)下載頁面爬取數(shù)據(jù),因此,其數(shù)據(jù)的準(zhǔn)確性對(duì)于不同的網(wǎng)站難以全部達(dá)到100%的準(zhǔn)確性,但是經(jīng)過大量測(cè)試,其也可以達(dá)到很高的準(zhǔn)確率,有部分網(wǎng)站是可以達(dá)到100%。如果該網(wǎng)站的URL格式對(duì)于區(qū)分不同類別的頁面有很好的效果,則可以使系統(tǒng)生成一個(gè)非常準(zhǔn)確的目標(biāo)頁面正則表達(dá)式過濾器,再增加關(guān)鍵詞的輔助判斷,系統(tǒng)就能保證非常高的準(zhǔn)確性。反之,如果該網(wǎng)站的URL格式不能很好地區(qū)分不同類別的頁面,準(zhǔn)確性就會(huì)降低。但是關(guān)鍵詞如果選取合適,則可以保持或增加準(zhǔn)確性。

      表4和表5是每個(gè)網(wǎng)站爬取2次的結(jié)果,且隨機(jī)抽取20 min的爬取結(jié)果作為統(tǒng)計(jì)量。因?yàn)?0 min的爬取時(shí)間較短,且每次程序都是隨機(jī)下載頁面,所以每個(gè)網(wǎng)站的2次爬取總量會(huì)有不定的差距。

      表4 八爪魚數(shù)據(jù)準(zhǔn)確性測(cè)試實(shí)例

      表5 GWC原型系統(tǒng)數(shù)據(jù)準(zhǔn)確性測(cè)試實(shí)例

      從表4、表5可以看出,系統(tǒng)對(duì)于新浪股票、搜狐軍事、眾籌網(wǎng)等網(wǎng)站的爬取效果很好,準(zhǔn)確性很高,對(duì)于這幾個(gè)大專題基本是可以達(dá)到100%的準(zhǔn)確性,因?yàn)檫@些網(wǎng)站都有很好的URL格式,對(duì)于區(qū)分不同類別的網(wǎng)頁有決定性的效果,加上關(guān)鍵詞的判斷,所以準(zhǔn)確率非常高。而對(duì)于大眾點(diǎn)評(píng)網(wǎng)這一類網(wǎng)站,許多類別頁面的URL格式是相同或類似的,程序不能生成一個(gè)準(zhǔn)確的目標(biāo)頁面正則表達(dá)式過濾器,對(duì)于有些網(wǎng)站,可以通過選擇準(zhǔn)確合適的關(guān)鍵詞來進(jìn)行輔助定位,也可以維持和提高準(zhǔn)確性,例如爬取天涯論壇中的股市談?wù)?其URL也不能做一個(gè)準(zhǔn)確的區(qū)分,但是輔以“股市”和“股票”的關(guān)鍵詞就可以幫助程序較為準(zhǔn)確的抓取目標(biāo)頁面。本文對(duì)于大眾點(diǎn)評(píng)網(wǎng)是用了“成都&&川菜”的關(guān)鍵詞,但是由于其他類別的店鋪頁面(如火鍋、小吃快餐、西餐和外地的川菜店鋪等)也具有目標(biāo)頁面的URL格式,而且在頁面的評(píng)論區(qū)或其他文本位置也都可能會(huì)出現(xiàn)這2個(gè)關(guān)鍵詞,導(dǎo)致程序無法將這些無關(guān)頁面過濾掉,因此造成了準(zhǔn)確性的下降。

      6 結(jié)束語

      研究一種高可移植性的通用型自動(dòng)化垂直爬蟲設(shè)計(jì)方法具有重要的應(yīng)用價(jià)值。通過分析總結(jié)傳統(tǒng)垂直爬蟲的弊端和實(shí)現(xiàn)通用化的難點(diǎn),本文提出一種高效的有監(jiān)督的廣度優(yōu)先與網(wǎng)頁帶權(quán)搜索策略和數(shù)據(jù)解析路徑模板自動(dòng)提取方法。實(shí)驗(yàn)結(jié)果證明,該方法的通用性效果較好,可以對(duì)不同類型的網(wǎng)站實(shí)現(xiàn)快速爬取,爬取數(shù)據(jù)的效率較高,數(shù)據(jù)完整性很好,且對(duì)于大部分網(wǎng)站也能保證很高的準(zhǔn)確性。下一步將在本文研究的基礎(chǔ)上,繼續(xù)對(duì)搜索策略進(jìn)行優(yōu)化,并提升通用型垂直爬蟲自動(dòng)化程度。

      猜你喜歡
      爬蟲權(quán)值網(wǎng)頁
      利用網(wǎng)絡(luò)爬蟲技術(shù)驗(yàn)證房地產(chǎn)灰犀牛之說
      一種融合時(shí)間權(quán)值和用戶行為序列的電影推薦模型
      基于Python的網(wǎng)絡(luò)爬蟲和反爬蟲技術(shù)研究
      CONTENTS
      基于CSS的網(wǎng)頁導(dǎo)航欄的設(shè)計(jì)
      電子制作(2018年10期)2018-08-04 03:24:38
      利用爬蟲技術(shù)的Geo-Gnutel la VANET流量采集
      基于URL和網(wǎng)頁類型的網(wǎng)頁信息采集研究
      電子制作(2017年2期)2017-05-17 03:54:56
      基于權(quán)值動(dòng)量的RBM加速學(xué)習(xí)算法研究
      大數(shù)據(jù)環(huán)境下基于python的網(wǎng)絡(luò)爬蟲技術(shù)
      電子制作(2017年9期)2017-04-17 03:00:46
      網(wǎng)頁制作在英語教學(xué)中的應(yīng)用
      启东市| 长岛县| 兰坪| 昌平区| 巴彦淖尔市| 白玉县| 洪雅县| 南开区| 如皋市| 长阳| 万全县| 太仆寺旗| 大关县| 江城| 南江县| 黄陵县| 高碑店市| 肇州县| 滨海县| 铜陵市| 准格尔旗| 融水| 勐海县| 周至县| 美姑县| 英德市| 肇州县| 靖西县| 巨野县| 玉环县| 星座| 剑川县| 无棣县| 晋宁县| 于都县| 张家川| 南康市| 呼图壁县| 赫章县| 青冈县| 壤塘县|