高 宇,楊小兵
(中國計量大學(xué) 信息工程學(xué)院,浙江 杭州 310018)
大數(shù)據(jù)和云計算等新一代互聯(lián)網(wǎng)技術(shù)的迅速發(fā)展,使得如何從大量數(shù)據(jù)中提取有效信息,挖掘其中的價值成為當(dāng)前的研究熱點.然而,很多用戶通過搜索引擎獲取數(shù)據(jù)的過程中,經(jīng)常會出現(xiàn)很多不需要的信息,這加劇了有限的搜索引擎服務(wù)器資源與無限的網(wǎng)絡(luò)數(shù)據(jù)資源之間的矛盾.在通過傳統(tǒng)的搜索引擎進(jìn)行數(shù)據(jù)獲取的過程中,還需要用戶對搜索到的信息進(jìn)行分析,最終找到自己需要的信息.就目前的網(wǎng)絡(luò)現(xiàn)狀,這樣的搜索引擎是非常浪費時間的,而且準(zhǔn)確度不高.
本文在通用爬蟲的基礎(chǔ)上,實現(xiàn)了一個基于python的聚焦型網(wǎng)絡(luò)爬蟲系統(tǒng),它根據(jù)既定的抓取目標(biāo),有選擇的訪問網(wǎng)絡(luò)上的網(wǎng)頁和相關(guān)的鏈接,從而獲取所需信息.實驗中,爬蟲程序模擬登陸豆瓣電影網(wǎng)址獲取最新上映電影的影評,并將爬取到的數(shù)據(jù)以JSON的格式存儲到本地,以便能夠后期進(jìn)行數(shù)據(jù)分析.最后對影評信息使用Jieba分詞,將出現(xiàn)頻率高的詞語以詞云的形式直觀展現(xiàn)出來.使用本文爬蟲程序可以節(jié)省數(shù)據(jù)分析人員的開發(fā)時間,實現(xiàn)對海量數(shù)據(jù)起到針對性的提取.
網(wǎng)絡(luò)爬蟲是一種按照一定的規(guī)則,自動的抓取萬維網(wǎng)上數(shù)據(jù)的程序或者腳本.網(wǎng)絡(luò)爬蟲主要分為兩類:一類是搜索引擎服務(wù)商設(shè)計的通用爬蟲,這類爬蟲通過網(wǎng)頁鏈接采集互聯(lián)網(wǎng)信息,然后返回的信息供搜索引擎建立索引.所以,當(dāng)用戶在搜索引擎中輸入文字搜索時,引擎會根據(jù)輸入信息進(jìn)行檢索,找到搜索文字的相關(guān)內(nèi)容并返回.另一類是對確切指定的網(wǎng)址進(jìn)行數(shù)據(jù)抓取,獲得所需信息.
搜索引擎中網(wǎng)絡(luò)爬蟲的基本工作流程如下.
1)確定初始種子URL集合.
2)從集合中取出待抓取的URL隊列,將其對應(yīng)的網(wǎng)頁下載下來,存儲到已下載網(wǎng)頁中,再將對應(yīng)的URL放進(jìn)已抓取URL隊列中.
3)分析下載的網(wǎng)頁數(shù)據(jù),從中獲取新網(wǎng)站的URL.若新的URL不在已抓取的URL隊列中,就將其加入到待抓取URL集合中.
4)不斷循環(huán)(2)、(3)步驟,直到待抓取URL隊列中所有的URL已經(jīng)完全抓取.
5)清洗數(shù)據(jù),根據(jù)使用者文字搜索,展示相應(yīng)頁面.
整個通用的網(wǎng)絡(luò)爬蟲的基本工作流程圖,如圖1.
圖1 網(wǎng)絡(luò)爬蟲結(jié)構(gòu)Figure 1 Structure of web crawler
聚焦型網(wǎng)絡(luò)爬蟲是“面向特定主體需求”的一種網(wǎng)絡(luò)爬蟲程序,在實施網(wǎng)頁抓取時會對內(nèi)容進(jìn)行處理篩選,盡量保證只抓取與需求相關(guān)的網(wǎng)頁信息.相對于通用網(wǎng)絡(luò)爬蟲,聚焦型網(wǎng)絡(luò)爬蟲還需要解決三個主要問題:
1)對抓取目標(biāo)的描述或定義;
2)對網(wǎng)頁或數(shù)據(jù)的分析與過濾;
3)對URL的搜索策略.
目前聚焦爬蟲對抓取目標(biāo)的選取可分為基于目標(biāo)網(wǎng)頁特征、基于目標(biāo)數(shù)據(jù)模式和基于領(lǐng)域概念三類.基于目標(biāo)網(wǎng)頁特征的爬蟲所獲取、存儲并搜索的對象一般為網(wǎng)站或者網(wǎng)頁.基于目標(biāo)數(shù)據(jù)模式的爬蟲主要針對網(wǎng)頁上的數(shù)據(jù),所抓取的數(shù)據(jù)一般要符合一定的模式,或者可以轉(zhuǎn)化或映射為目標(biāo)數(shù)據(jù)模式.另一種描述方式是建立目標(biāo)領(lǐng)域的本體或者詞典,用于從語義角度分析不同特征在某一主題中的重要性.
Python語言是一門功能強大、語法簡潔的開源編程語言,可以運行在Windows、Mac和Linux等各種操作系統(tǒng)上.它繼承了傳統(tǒng)編譯語言的強大性和通用性,同時也借鑒了簡單腳本和解釋語言的易用性.其次,Python非常擅長處理文本和字符串,它包含了常用的文本處理函數(shù),支持正則表達(dá)式.可以方便地處理文本內(nèi)容.更重要的是,Python具有豐富的標(biāo)準(zhǔn)庫和可以添加大量的第三方庫.它又被稱為膠水語言,能夠和其他語言模塊輕松結(jié)合起來.
爬蟲中最主要的模塊是網(wǎng)頁下載模塊、網(wǎng)頁解析模塊和數(shù)據(jù)存儲模塊.網(wǎng)頁下載器中urllib和urllib2是python中的內(nèi)置下載模塊.本實驗中采用的是Requests第三方庫,支持HTTP連接保持和連接池,支持使用cookie保持會話,支持文件上傳和確定響應(yīng)內(nèi)容的編碼等.相比較內(nèi)置模塊,其對HTTP請求更加簡單,操作也更加人性化.
網(wǎng)頁解析器用來處理下載的網(wǎng)頁內(nèi)容,針對性地提取我們需要的數(shù)據(jù).網(wǎng)頁的內(nèi)容一般是HTML格式,本實驗采用Beautiful Soup解析網(wǎng)頁和正則表達(dá)式匹配文本.Beautiful Soup可以將復(fù)雜HTML文檔轉(zhuǎn)換成一個簡單的樹型結(jié)構(gòu),通過節(jié)點進(jìn)行搜索遍歷所需要的內(nèi)容.在編寫處理網(wǎng)頁文本的程序時,經(jīng)常會出現(xiàn)查找符合某些復(fù)雜規(guī)則的字符串的需要,而正則表達(dá)式通常作為一個模板,可以將某個字符模式與所搜索的字符串進(jìn)行匹配.
最后就是數(shù)據(jù)存儲,利用python可以將數(shù)據(jù)轉(zhuǎn)為JSON、CSV或者其他格式文件.為了便于后期進(jìn)一步的數(shù)據(jù)分析,實驗中將爬取的數(shù)據(jù)以JSON格式存儲.為了防止亂碼出現(xiàn),存儲時要特別注意數(shù)據(jù)的編碼方式.
網(wǎng)絡(luò)爬蟲系統(tǒng)主要通過模塊化進(jìn)行設(shè)計,一般每個功能都需要獨立的模塊.這樣能夠方便以后進(jìn)行代碼的維護(hù),而且還能提高代碼的可讀性.各種模塊的功能實現(xiàn)之后,整個網(wǎng)絡(luò)爬蟲體系的功能也就已經(jīng)完成.本實驗以爬取豆瓣最新電影影評為例,詳細(xì)講解Python聚焦型爬蟲的實現(xiàn)原理.
根據(jù)指定的URL,抓取豆瓣網(wǎng)最新上映電影頁面.通過建立連接,發(fā)送HTTP請求.利用Requests建立與服務(wù)器的連接,當(dāng)服務(wù)器接收到請求后,返回相應(yīng)的HTTP應(yīng)答.
進(jìn)行頁面處理時,首先需要對HTML相關(guān)的源代碼進(jìn)行過濾和處理,分析出需要的信息,然后再對分析出的結(jié)果進(jìn)行整合.對應(yīng)網(wǎng)頁的HTML結(jié)構(gòu)文檔如圖2.
圖2 網(wǎng)頁的HTML結(jié)構(gòu)文檔Figure 2 HTML structure document of the web page
通過上文的HTML文檔,能夠查看電影的相關(guān)信息,比如片名、評分、演員和時長等.然而爬蟲最終需要抓取的是影評信息,而電影影評對應(yīng)的網(wǎng)址為:https://movie. douban. com/subject/*******/comments?start=##&limit=20.
其中*******對應(yīng)的是電影的ID,##對應(yīng)的是影評的頁數(shù).由此可知,實驗中先要根據(jù)初始URL爬取到對應(yīng)電影的ID,然后再爬取新的網(wǎng)址獲取相應(yīng)的影評信息.需要定位的DOM樹節(jié)點及屬性流程圖如圖3.
圖3 DOM樹節(jié)點流程圖Figure 3 Flow chart of DOM tree node
正如上文介紹的,使用Beautiful Soup解析HTML網(wǎng)頁標(biāo)簽,并提供定位內(nèi)容的便捷接口.部分代碼及注釋為:
#獲取所有正在上映電影的ID和片名,并以列表的形式存儲
contents = soup. find_all(‘div’,id = ‘nowplaying’)
content = contents[0]. find_all(‘li’,class_ = ‘list-item’)
獲取到相應(yīng)電影的ID,就可以根據(jù)新的網(wǎng)址定位到其影評頁面.對應(yīng)的頁面解析如圖4.
圖4 影評頁面解析Figure 4 Analysis of review page
由圖4可知,對應(yīng)的影評信息在div節(jié)點,class屬性為comment-item下,相應(yīng)代碼如下:
#包含影評及其他信息的代碼
Comment_later = soup.find_all(‘div’,class_=’comment’)item
#提取出影評信息
Comment_later. find_all(‘p’)[0]. string
#在爬取影評信息的代碼中,通過自定義列表索引,就可以獲取不同的電影評論
Comment_list = getCByld (nowplaying_list[*][‘id’]
其中,*代表索引值,對應(yīng)著不同電影,getCByld是爬取影評的函數(shù).
運行上述代碼可以爬取到影評信息,然后將這些數(shù)據(jù)以JSON的格式保存到本地.此外,本實驗可以從輸入端自定義索引,就可以獲取相應(yīng)的電影影評及詞云展示,無需再通過搜索引擎查詢,從而加快了我們對數(shù)據(jù)的獲取能力.本實驗爬取了網(wǎng)站的前10頁影評,保存結(jié)果為圖5,可以看到這些評論和網(wǎng)頁中的電影評論完全一致.
數(shù)據(jù)可視化是數(shù)據(jù)分析很重要的一部分,它能夠從繁雜的數(shù)據(jù)中更直觀更有效的獲取信息.當(dāng)獲取到影評信息之后,需要對數(shù)據(jù)進(jìn)行可視化,首先需要做的是數(shù)據(jù)的清洗.
圖5爬取的電影影評
Figure 5 Film review crawled
1)將所有的評論轉(zhuǎn)化為字符串格式.代碼為:
String_num=’’
for k in range(len(comment_list)):
String_num=String_num+str(comment_list[k]. strip()
2)利用正則表達(dá)式匹配中文,去掉所有的標(biāo)點符號.匹配中文的代碼為
pattern = re. compile(r’[u4e00-u9fa5]+).
3)對數(shù)據(jù)進(jìn)行中文分詞操作,并去掉數(shù)據(jù)中沒有參考價值的虛詞,實驗中使用的是Jieba分詞.
4)調(diào)用pandas包的groupby、agg和sort_values函數(shù)進(jìn)行分組排序處理,以便用于后面詞云顯示.
5)最后調(diào)用WordCloud詞云包,將數(shù)據(jù)用詞云進(jìn)行顯示:plt. show(). 如圖6.
圖6 影評的詞云顯示Figure 6 Cloud display of movie reviews
隨著網(wǎng)絡(luò)上的數(shù)據(jù)資源日益龐大,有效獲取所需數(shù)據(jù)變得尤為重要.聚焦型網(wǎng)絡(luò)爬蟲作為一種自動獲取相關(guān)數(shù)據(jù)的手段,有著較高的應(yīng)用價值.本實驗中,針對性地爬取某一電影的影評數(shù)據(jù),確保了數(shù)據(jù)的真實性與最新性,避免了無關(guān)數(shù)據(jù)的干擾.這樣的話,接下來的數(shù)據(jù)分析結(jié)果,才有參考價值.不過,若爬取的內(nèi)容過多,Python執(zhí)行會花費很多時間,如果結(jié)合Python的多線程技術(shù),并考慮下載緩存優(yōu)化和并發(fā)性,則將會使性能達(dá)到極大改善.