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