牟寧 郭英杰 陳杰 竇杰 余果芯 李攀攀
摘要:以豆瓣網(wǎng)站為代表的社交網(wǎng)絡(luò)空前繁榮,傳統(tǒng)的網(wǎng)絡(luò)爬蟲無(wú)法滿足人們對(duì)社交網(wǎng)絡(luò)信息的爬取及分析的需求,爬取與特定主題內(nèi)容相關(guān)網(wǎng)頁(yè)的主題網(wǎng)絡(luò)爬蟲便應(yīng)運(yùn)而生,該文設(shè)計(jì)并實(shí)現(xiàn)了面向豆瓣網(wǎng)站的主題網(wǎng)絡(luò)爬蟲,實(shí)現(xiàn)對(duì)豆瓣網(wǎng)站的特定主題頁(yè)面的爬取。最后,驗(yàn)證了主題網(wǎng)絡(luò)爬蟲設(shè)計(jì)方案的可行性。
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)32-0251-03
1 背景
隨著信息技術(shù)的高速發(fā)展,社交網(wǎng)絡(luò)如Facebook、Twitter、豆瓣網(wǎng)等也逐步地滲透到網(wǎng)民生活的方方面面,用戶可以在社交網(wǎng)絡(luò)上表達(dá)自己的意見、態(tài)度、看法或情感[1]。社交網(wǎng)絡(luò)承載著大量的輿情信息,使用網(wǎng)絡(luò)爬蟲可以對(duì)社交網(wǎng)絡(luò)輿情信息進(jìn)行有效地采集、組織和管理。然而,通用的網(wǎng)絡(luò)爬蟲面臨著爬取信息內(nèi)容繁雜、主題不清晰等弊端,為了以主題相關(guān)性地爬取頁(yè)面,面向垂直領(lǐng)域的主題網(wǎng)絡(luò)爬蟲便應(yīng)運(yùn)而生[2]。
一般來(lái)講,網(wǎng)絡(luò)爬蟲是一種能夠自動(dòng)爬取網(wǎng)頁(yè)并提取網(wǎng)頁(yè)內(nèi)容的程序,是構(gòu)建搜索引擎的支撐技術(shù)之一[3]。在爬行策略上,主題網(wǎng)絡(luò)爬蟲與通用網(wǎng)絡(luò)爬蟲不同,主題網(wǎng)絡(luò)爬蟲通常以主題性和頁(yè)面內(nèi)容相關(guān)性作為網(wǎng)頁(yè)搜索和爬取的依據(jù),即能按照用戶預(yù)定義的主題策略進(jìn)行信息采集,其爬取頁(yè)面具有大量相關(guān)性,頁(yè)面的利用率更高[4]。
豆瓣網(wǎng)站作為社交網(wǎng)站的典型代表,對(duì)社交網(wǎng)絡(luò)產(chǎn)生了深刻的影響,該文以豆瓣網(wǎng)站為例,設(shè)計(jì)并實(shí)現(xiàn)了主題網(wǎng)絡(luò)爬蟲,能依據(jù)指定的主題采集豆瓣網(wǎng)站的相關(guān)信息。
2 主題爬蟲設(shè)計(jì)及實(shí)現(xiàn)
2.1 主題網(wǎng)絡(luò)爬蟲的過(guò)程主要框架
主題網(wǎng)絡(luò)爬蟲的系統(tǒng)架構(gòu)如圖1所示,主要包括頁(yè)面下載模塊、主題判別模塊、調(diào)度模塊等核心部分。頁(yè)面下載模塊主要完成從指定的Web站點(diǎn)中將頁(yè)面下載到本地,主題判別模塊是主題網(wǎng)絡(luò)爬蟲的關(guān)鍵核心模塊,主要負(fù)責(zé)將判別待提取的頁(yè)面是否與制定主體相關(guān),將相關(guān)度高于一定閾值的頁(yè)面加入下載隊(duì)列。
2.2 主題網(wǎng)絡(luò)爬蟲工作流程
主題網(wǎng)絡(luò)爬蟲過(guò)程中,調(diào)度器、URL管理器、下載器、解析器與應(yīng)用各功能模塊相互配合協(xié)同工作。調(diào)度器在循環(huán)地向URL管理器發(fā)送命令,判斷是否有待爬取的URL列表、在得到URL管理器的一個(gè)待爬取的URL時(shí),啟動(dòng)下載器執(zhí)行下載流程,下載URL所指向的頁(yè)面,并使用解析器解析URL列表,獲取有用的信息,調(diào)度器將爬取的信息傳送給應(yīng)用,使爬蟲程序循環(huán)地執(zhí)行,在循環(huán)的調(diào)度過(guò)程中,網(wǎng)絡(luò)爬出持久化保存相關(guān)主題的頁(yè)面數(shù)據(jù)。
2.3 網(wǎng)絡(luò)爬蟲的URL管理器
URL管理器管理待爬取的URL列表和已爬取的URL列表,防止重復(fù)爬取與循環(huán)爬取。URL管理器較好地避免了爬蟲程序采集信息的冗余度,給爬蟲的效率帶來(lái)負(fù)面影響,具體來(lái)講,URL管理器的主要功能如圖2所示。
爬蟲程序使用關(guān)系型數(shù)據(jù)庫(kù)如MySQL、Oracle等保存所爬取的頁(yè)面,采用標(biāo)準(zhǔn)的SQL接口與數(shù)據(jù)庫(kù)連接,使用Python內(nèi)置的set( )方法對(duì)重復(fù)的數(shù)據(jù)項(xiàng)進(jìn)行去重處理[5]。
3 面向豆瓣網(wǎng)站的爬蟲設(shè)計(jì)及實(shí)現(xiàn)
3.1 爬蟲的網(wǎng)頁(yè)下載器
爬蟲下載器主要使用Python自帶的Urllib庫(kù)進(jìn)行開發(fā),在Python 2.7.8版本中,所使用的是Urllib2庫(kù)中的Urlopen函數(shù),在網(wǎng)絡(luò)爬蟲的過(guò)程中設(shè)置response = urllib2.urlopen(request)語(yǔ)句,以取得網(wǎng)頁(yè)的響應(yīng)。Urlopen函數(shù)可用于打開URL,并獲取URL數(shù)據(jù)。Urlopen函數(shù)的參數(shù)可以是URL鏈接,也可以使Request對(duì)象,對(duì)于簡(jiǎn)單的網(wǎng)頁(yè),直接使用URL字符串做參數(shù),但對(duì)于復(fù)雜的網(wǎng)頁(yè),設(shè)有防爬蟲機(jī)制的網(wǎng)頁(yè),在使用Urlopen函數(shù)時(shí),需要添加Http header。對(duì)于帶有登錄功能的站點(diǎn),需要設(shè)置Cookie,并模擬瀏覽器登錄,之后再進(jìn)行網(wǎng)頁(yè)下載。
3.2 爬蟲的網(wǎng)頁(yè)解析器
網(wǎng)頁(yè)解析器從網(wǎng)頁(yè)下載器下載到的URL(Uniform Resource Locator,統(tǒng)一資源定位符)隊(duì)列中提取有價(jià)值的數(shù)據(jù)和新的URL。對(duì)于特定數(shù)據(jù)的抽取,可以使用正則表達(dá)式或Python BeautifulSoup庫(kù)等方法。正則表達(dá)式使用基于字符串的模糊匹配,適用于目標(biāo)數(shù)據(jù)格式特征比較清晰和明確的場(chǎng)景,這也使得正則表達(dá)式方法在網(wǎng)頁(yè)解析時(shí)的通用性不高,比如,每一項(xiàng)正則表達(dá)式都要重新設(shè)計(jì),無(wú)法使用針對(duì)電影板塊開發(fā)的爬蟲程序爬取其他板塊。而Python BeautifulSoup屬于第三方模塊,用于結(jié)構(gòu)化解析URL內(nèi)容。將下載到的網(wǎng)頁(yè)解析為DOM(Document Object Model,文檔對(duì)象模型)樹,進(jìn)而結(jié)構(gòu)化解析URL。
網(wǎng)絡(luò)爬蟲系統(tǒng)中頁(yè)面解析流程如圖3所示,詳細(xì)步驟如下:
1)首先訪問網(wǎng)頁(yè)初始種子URL,爬蟲系統(tǒng)發(fā)出訪問請(qǐng)求,取得服務(wù)器的信息并獲取相關(guān)數(shù)據(jù)。為了爬蟲的健壯性,若通過(guò)URL訪問服務(wù)器,無(wú)法取得網(wǎng)頁(yè)返回信息時(shí),則返回錯(cuò)誤;
2)主題相關(guān)性判斷,包括特征提取與權(quán)值計(jì)算階段。在特征提取階段,通過(guò)頁(yè)面關(guān)鍵詞頻率,獲得文檔的特征,達(dá)到降維和提高分類精度的效果。該文采用支持向量機(jī)的基于文字內(nèi)容來(lái)判斷網(wǎng)頁(yè)與主題的相關(guān)性;
3)當(dāng)網(wǎng)頁(yè)訪問成功后,網(wǎng)絡(luò)爬蟲開始爬取符合正則表達(dá)式的數(shù)據(jù)信息,并刪除重復(fù)的冗余信息;
4)在本地?cái)?shù)據(jù)庫(kù)中創(chuàng)建數(shù)據(jù)庫(kù)表,將爬取到的信息持久化存儲(chǔ)到本地?cái)?shù)據(jù)庫(kù)中;
5)重復(fù)上述步驟,直到頁(yè)面全部爬取完畢。
主題網(wǎng)絡(luò)爬蟲程序具體實(shí)現(xiàn)過(guò)程中,網(wǎng)絡(luò)爬蟲爬取頁(yè)面的過(guò)程如圖4所示,詳細(xì)步驟如下:
1)設(shè)置askURL(url)方法,并將URL作為Request()方法的參數(shù),構(gòu)造Request對(duì)象;
2)將Request對(duì)象作為urlopen()方法的參數(shù),發(fā)送給遠(yuǎn)程服務(wù)器,獲取網(wǎng)頁(yè)內(nèi)容返回列表;
3)使用read( )方法讀取遠(yuǎn)程服務(wù)器返回的頁(yè)面信息;
4)若在執(zhí)行過(guò)程中未發(fā)生任何異常,則在執(zhí)行完后返回HTML網(wǎng)頁(yè)內(nèi)容;
5)若在執(zhí)行過(guò)程中發(fā)生異常,則中斷當(dāng)前的執(zhí)行語(yǔ)句的執(zhí)行,跳轉(zhuǎn)到對(duì)應(yīng)的異常處理塊中開始執(zhí)行,終止應(yīng)用程序并打印錯(cuò)誤代碼及其原因提要。
4 系統(tǒng)測(cè)試
為了驗(yàn)證該文爬蟲的有效性,使用Python2.7在Win10操作系統(tǒng)上開發(fā)爬蟲程序。網(wǎng)絡(luò)環(huán)境是100Mbps帶寬,以豆瓣網(wǎng)站為例,使用爬蟲程序?qū)Χ拱昃W(wǎng)站的指定主題進(jìn)行爬取,分別選取讀書、電影、音樂3個(gè)頻道,對(duì)應(yīng)的主題分別是“讀書”、“電影”、和“音樂”,爬取的網(wǎng)頁(yè)數(shù)量如表1所示。
從上表可以看出,根據(jù)用戶自定義主題和指定的初始URL,該文的主題網(wǎng)絡(luò)爬蟲能夠爬取豆瓣網(wǎng)站的相關(guān)主題頁(yè)面,這就驗(yàn)證了該文所設(shè)計(jì)的爬蟲程序具有可用性。還可以進(jìn)一步看出,在讀書社區(qū)爬取的頁(yè)面多達(dá)3萬(wàn)余條,驗(yàn)證了網(wǎng)絡(luò)爬蟲程序的穩(wěn)定性。
5 結(jié)束語(yǔ)
不同于傳統(tǒng)的網(wǎng)絡(luò)爬蟲,主題網(wǎng)絡(luò)爬蟲能針對(duì)特定主題提供個(gè)性化的信息爬取服務(wù),是面向垂直領(lǐng)域的搜索引擎采集信息的基礎(chǔ)支撐技術(shù)。該文首先研究了主題網(wǎng)絡(luò)爬蟲的工作原理及其流程,接著設(shè)計(jì)并實(shí)現(xiàn)了面向豆瓣網(wǎng)站的主題網(wǎng)絡(luò)爬蟲,最后實(shí)驗(yàn)驗(yàn)證了網(wǎng)絡(luò)爬蟲的可行性。
參考文獻(xiàn)
[1] 胡亞楠. 社交網(wǎng)絡(luò)數(shù)據(jù)獲取技術(shù)與實(shí)現(xiàn)[D]. 哈爾濱: 哈爾濱工業(yè)大學(xué), 2011.
[2] 孫立偉, 何國(guó)輝, 吳禮發(fā). 網(wǎng)絡(luò)爬蟲技術(shù)的研究[J]. 電腦知識(shí)與技術(shù), 2010, 6(15): 4112-4115.
[3] 于娟, 劉強(qiáng). 主題網(wǎng)絡(luò)爬蟲研究綜述[J]. 計(jì)算機(jī)工程與科學(xué), 2015, 37(2): 231-237.
[4] 黃永軍. 面向垂直搜索的網(wǎng)絡(luò)爬蟲設(shè)計(jì)與實(shí)現(xiàn)[D]. 北京: 北京郵電大學(xué), 2013.
[5] 錢程, 陽(yáng)小蘭, 朱福喜. 基于Python的網(wǎng)絡(luò)爬蟲技術(shù)[J]. 黑龍江科技信息, 2016(36): 273.
【通聯(lián)編輯:謝媛媛】