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