于韜 李偉 代麗偉
摘要 隨著大數(shù)據(jù)時(shí)代的到來(lái),數(shù)據(jù)量呈幾何倍增長(zhǎng)。以新浪新聞為代表的一系列新聞檢索網(wǎng)站蘊(yùn)含著大量的數(shù)據(jù)資源。本文以新浪新聞為研究對(duì)象,利用Python爬蟲技術(shù)實(shí)現(xiàn)網(wǎng)頁(yè)下載與網(wǎng)頁(yè)解析,完成了對(duì)目標(biāo)數(shù)據(jù)的高效獲取,并將獲取的信息進(jìn)行格式化存儲(chǔ)。實(shí)驗(yàn)結(jié)果表明,本文所提出的程序?qū)崿F(xiàn)了網(wǎng)頁(yè)數(shù)據(jù)的快速獲取,為后續(xù)的數(shù)據(jù)挖掘提供支持。
【關(guān)鍵詞】大數(shù)據(jù) Python 爬蟲 新浪新聞
1 引言
新浪新聞?dòng)尚吕斯俜匠銎?,及時(shí)發(fā)布全球新聞資訊,國(guó)內(nèi)國(guó)外要聞,精彩的體育賽事報(bào)道,金融財(cái)經(jīng)動(dòng)向,影視娛樂(lè)事件,還有獨(dú)家微博“微”新聞,精彩隨你看,新聞、星座、笑話一個(gè)都不少。新聞是我們生活中的一部分,通過(guò)新浪的新聞板塊可以坐在家里看世界。如此多的新聞信息,其中蘊(yùn)含的巨大信息量是不言而喻的,因此如何獲取是十分關(guān)鍵的。本文我們將通過(guò)爬蟲技術(shù)獲取相關(guān)新聞信息。
Python作為一種語(yǔ)法簡(jiǎn)潔的程序設(shè)計(jì)語(yǔ)言,對(duì)于爬蟲開(kāi)發(fā)上有很多優(yōu)勢(shì),在發(fā)送HTTP請(qǐng)求時(shí),Python提供優(yōu)秀的第三方包譬如Requests,極大簡(jiǎn)化了對(duì)網(wǎng)站的訪問(wèn)請(qǐng)求。在解析HTML源碼時(shí),提供的BeautifuISoup庫(kù)能用極簡(jiǎn)短的代碼完成過(guò)濾html標(biāo)簽并提取文本的工作。利用Python中的pandas可以對(duì)獲取到的數(shù)據(jù)進(jìn)行整理、儲(chǔ)存。對(duì)于網(wǎng)站的反爬機(jī)制,Python提供了更為簡(jiǎn)便的解決方案,可以使用Requests庫(kù)得到一個(gè)代理IP。Python擁有足夠多的簡(jiǎn)潔的語(yǔ)法和庫(kù)的支持,使得它在爬蟲開(kāi)發(fā)上具有很高的效率。
本文提出的爬蟲程序通過(guò)獲取相關(guān)新聞信息,并將數(shù)據(jù)保存到本地,方便對(duì)數(shù)據(jù)的挖掘與分析。使用本程序可以節(jié)省獲取數(shù)據(jù)的時(shí)間,使用戶可以將更多精力放在數(shù)據(jù)分析上面。
2 基于Python的新浪新聞爬蟲設(shè)計(jì)
2.1 爬蟲系統(tǒng)設(shè)計(jì)需求
設(shè)計(jì)爬蟲系統(tǒng)需要解決以下幾個(gè)問(wèn)題:
(1)評(píng)論數(shù)的獲取:通過(guò)頁(yè)面鏈接獲取新聞id,然后傳遞獲取評(píng)論數(shù)。
(2)頁(yè)面信息的提?。喉?yè)面上有我們需要的標(biāo)題、作者、摘要等信息。
(3)分頁(yè)鏈接的獲取:獲取不同分頁(yè)的鏈接,以便獲取更多頁(yè)面信息。
(4)網(wǎng)頁(yè)內(nèi)容的分析和管理:提取網(wǎng)頁(yè)信息,并將其存入數(shù)據(jù)庫(kù)或其他數(shù)據(jù)文件中。
2.2 與爬蟲相關(guān)的python模塊
2.2.1 網(wǎng)址管理器
實(shí)現(xiàn)網(wǎng)址管理的方法有以下3類:
(1) Python內(nèi)存儲(chǔ)存:適合存儲(chǔ)少量信息,將網(wǎng)址在儲(chǔ)存時(shí)分為兩類:已爬取和待爬取,放入兩個(gè)集合中進(jìn)行管理。
(2)關(guān)系數(shù)據(jù)庫(kù)儲(chǔ)存:適合網(wǎng)址信息進(jìn)行永久性儲(chǔ)存,可以存到表中,建立兩個(gè)字段用來(lái)辨別是否爬取。
(3)緩存數(shù)據(jù)庫(kù)儲(chǔ)存:適合儲(chǔ)存大量的網(wǎng)址信息
2.2.2 網(wǎng)頁(yè)下載器
網(wǎng)頁(yè)下載器是爬蟲程序的主要核心模塊。網(wǎng)頁(yè)的內(nèi)容一般是HTML格式,Python支持的網(wǎng)頁(yè)下載工具有兩類:
(1) Python官方支持的基礎(chǔ)模塊中的urllib包
(2) requests第三方工具包,功能強(qiáng)大。
2.2.3 網(wǎng)頁(yè)解析器
網(wǎng)頁(yè)解析器是對(duì)網(wǎng)頁(yè)內(nèi)容中進(jìn)行數(shù)據(jù)解析的工具。Python支持的網(wǎng)頁(yè)解析器有兩種:一種利用正則表達(dá)式可以將整個(gè)網(wǎng)頁(yè)文檔當(dāng)成一個(gè)字符串,使用模糊匹配的方式來(lái)提取出有價(jià)值的數(shù)據(jù);另一種是根據(jù)Html網(wǎng)頁(yè)創(chuàng)建成一個(gè)DOM樹,以樹的形式進(jìn)行各種節(jié)點(diǎn)的搜索遍歷。DOM的樹形結(jié)構(gòu)根據(jù)上下級(jí)關(guān)系,可以很方便的定位到各個(gè)元素。
2.2.4 數(shù)據(jù)導(dǎo)出
利用Python可以將數(shù)據(jù)導(dǎo)出為Excel格式或其它格式文件。導(dǎo)出數(shù)據(jù)時(shí)應(yīng)注意數(shù)據(jù)編碼問(wèn)題,否則導(dǎo)出的文件可能會(huì)出現(xiàn)亂碼。如圖1所示。
3 實(shí)驗(yàn)設(shè)計(jì)
我們通過(guò)新浪新聞API: http://news.smacom.cn/china/進(jìn)行抓取。爬蟲代碼由3個(gè)功能函數(shù)和一個(gè)主函數(shù)構(gòu)成:
3.1 獲取詳細(xì)頁(yè)面內(nèi)文函數(shù)( getNews Detail)
首先對(duì)詳細(xì)頁(yè)面的鏈接進(jìn)行下載:通過(guò)requests方法下載html文檔,接著通過(guò)BeautifulSoup進(jìn)行解析。然后通過(guò)select方法獲取文章標(biāo)題、來(lái)源以及編輯信息,由于時(shí)間的格式的特殊性,利用datatime獲取新聞發(fā)表的時(shí)間。對(duì)于新聞主體,通過(guò)for依次取段落,再通過(guò)jom方法將所有段落信息整合在一起。取評(píng)論數(shù)我們通過(guò)getCommentCounts方法進(jìn)行獲取。最后定義一個(gè)字典,將頁(yè)面的標(biāo)題、來(lái)源、時(shí)間等信息存儲(chǔ)到字典中。
3.2 獲取評(píng)論數(shù)函數(shù)( getCommentCounts)
由于通過(guò)直接觀察元素信息時(shí)找不到評(píng)論數(shù)信息,可能是通過(guò)JS方式添加上去的,因此需要對(duì)評(píng)論數(shù)鏈接進(jìn)行處理,而評(píng)論數(shù)鏈接與新聞id有關(guān),因此我們首先對(duì)新聞id進(jìn)行獲取。通過(guò)正則表達(dá)式獲取新聞id,在將新聞id放入評(píng)論數(shù)鏈接中,對(duì)此鏈接進(jìn)行解析,即可得到相應(yīng)的評(píng)論數(shù)。
3.3 剖析清單鏈接函數(shù)( parseListLinks)
在前兩個(gè)函數(shù)中我們已經(jīng)獲取到了頁(yè)面的詳細(xì)信息,利用parseListLinks函數(shù),我們獲取不同清單的鏈接,并結(jié)合getNewsDetail函數(shù)獲取清單上所有新聞信息。接著定義一個(gè)列表newsdetails,并將getNewsDetail函數(shù)獲取的信息儲(chǔ)存在列表中。
3.4 主函數(shù)
在主函數(shù)中可以自定義想要獲取的新聞頁(yè)數(shù)。由于每個(gè)清單有許多數(shù)據(jù)頁(yè),我們加了一個(gè)for循環(huán)獲得分頁(yè)鏈接,通過(guò)parseListLinks方法依次獲取新聞信息,我們利用pandas中DataFrame方法對(duì)數(shù)據(jù)進(jìn)行整理,最后用to excel方法將數(shù)據(jù)保存為Excel格式。
爬取流程圖如圖2所示。
4 實(shí)驗(yàn)結(jié)果
通過(guò)實(shí)驗(yàn)獲取新浪新聞的論文信息,運(yùn)行結(jié)果如圖3所示,實(shí)驗(yàn)采集了7500條信息,為后期的數(shù)據(jù)處理提供了有力支撐。
5 結(jié)語(yǔ)
文章分析了新浪爬蟲獲取數(shù)據(jù)時(shí)的細(xì)節(jié)實(shí)現(xiàn),對(duì)國(guó)內(nèi)新聞API進(jìn)行爬取,使用requests方法下載網(wǎng)頁(yè)html文檔,并用BeautifulSoup進(jìn)行解析,進(jìn)而獲得相關(guān)的數(shù)據(jù)信息。總體來(lái)說(shuō),爬蟲技術(shù)具有較高的應(yīng)用價(jià)值與無(wú)限的潛在價(jià)值,通過(guò)抓取數(shù)據(jù),可以挖掘出更有價(jià)值的信息。
參考文獻(xiàn)
[1]魏冬梅,何忠秀等,基于Python的Web信息獲取方法研究[J].軟件導(dǎo)刊,2018(01).
[2]孫立偉,何國(guó)輝等,網(wǎng)絡(luò)爬蟲技術(shù)的研究[J].電腦知識(shí)與技術(shù),2010 (05).
[3]周中華,張惠,然謝江,基于Python的新浪微博數(shù)據(jù)爬蟲[J].計(jì)算機(jī)應(yīng)用2014 (11).
[4]張明杰,基于網(wǎng)絡(luò)爬蟲技術(shù)的輿情數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J],現(xiàn)代計(jì)算機(jī)(專業(yè)版)2015 (06).
[5]朱燁行,張明杰,微博數(shù)據(jù)采集的設(shè)計(jì)與實(shí)現(xiàn)[J].電腦編程技巧與維護(hù),2017 (09).