程增輝 夏林旭 劉茂福
摘 要:在網(wǎng)絡(luò)健康資訊研究中,數(shù)據(jù)獲取是首先要解決的問題,但傳統(tǒng)抓取工具無法滿足多變的數(shù)據(jù)源,研究高效爬取健康資訊內(nèi)容新方法迫在眉睫?;赑ython的網(wǎng)絡(luò)健康資訊抓取方案,整合多個數(shù)據(jù)源,抓取內(nèi)容更為全面;利用WebDriver和Python的Selenium庫,能夠較好地應(yīng)對復(fù)雜網(wǎng)絡(luò)狀況,通過多線程技術(shù)極大提高爬蟲效率。對抓取的癌癥數(shù)據(jù)進行統(tǒng)計分析,對多線程效率進行對比分析,顯示爬蟲具有良好的適應(yīng)性?;赑ython的網(wǎng)絡(luò)健康咨詢抓取方案能快速抓取網(wǎng)絡(luò)資訊,為后續(xù)科研打下基礎(chǔ)。
關(guān)鍵詞:爬蟲;多數(shù)據(jù)源;Python;網(wǎng)頁解析
DOI:10. 11907/rjdk. 181626
中圖分類號:TP319文獻標(biāo)識碼:A文章編號:1672-7800(2019)002-0060-04
Abstract: During the research of online health data, the data acquirement is the first problem to be solved, however the traditional data crawlers cannot be adapted to the current various data sources. Therefore, a new approach should be adopted to parse health data efficiently from Weibo, Web portals and other platforms. This article tries to design a new data crawler based on one Web driver offered from selenium library and implement using Python and its related network library. This data clawer can handle complex net environment and improve efficiency with the multithread technique. In the end, we analyze the obtained data on topic of cancer and compare the efficiency under the multithread programming. It shows that the data crawler designed in this article can adapt the net environment well and be a lot of helps in the further research of online health data.
Key Words:crawler; various data source; Python; Web page parsing
0 引言
隨著生活水平的不斷提高和計算機技術(shù)的迅速發(fā)展,互聯(lián)網(wǎng)已經(jīng)成為大眾獲取資訊的主要渠道[1],網(wǎng)絡(luò)資訊形式與內(nèi)容也伴隨著時代發(fā)展產(chǎn)生了巨大變化。在資訊形式方面,典型的門戶網(wǎng)站仍以圖文形式的文章為主,新興平臺的資訊形式則更為豐富,出現(xiàn)了微博、短視頻、移動新聞客戶端等格式。在資訊內(nèi)容方面,除傳統(tǒng)的時事新聞外,健康、娛樂等方面的內(nèi)容更受年輕人追捧。新型資訊形式的出現(xiàn),意味著對于網(wǎng)絡(luò)數(shù)據(jù)的研究方法必須作出相應(yīng)改變。網(wǎng)絡(luò)數(shù)據(jù)內(nèi)容的變更,意味著數(shù)據(jù)挖掘與研究工作的重心也要隨之變化。
國外針對社交平臺(如Facebook、Twitter)的研究與分析[2-4]較多,而國內(nèi)針對這一領(lǐng)域的研究還較欠缺。一方面,相關(guān)研究剛剛起步,缺乏相關(guān)研究方法;另一方面,缺乏相關(guān)研究數(shù)據(jù),深入研究難以展開[5]。新浪微博占據(jù)了社交平臺87%的份額,聚集了大量年輕用戶和海量資訊內(nèi)容,是中國微博產(chǎn)業(yè)的主導(dǎo)力量[6]。微博具有用戶基數(shù)大、傳播速度快、內(nèi)容時效性強和數(shù)據(jù)量極大的特點,是非常好的數(shù)據(jù)來源。另外,主流門戶網(wǎng)站如網(wǎng)易、新浪、騰訊、搜狐等,作為老牌的“網(wǎng)絡(luò)新聞集散地”,仍是用戶獲取資訊的主要來源。這些平臺擁有大量用戶,每天產(chǎn)生海量數(shù)據(jù),并且新聞形式較為統(tǒng)一,是非常方便且有價值的研究對象。
網(wǎng)民對健康問題較為重視,“微信計步”、“悅跑圈”等一些健康類型手機應(yīng)用風(fēng)靡社交平臺,健康類資訊成為人們分享的熱點。醫(yī)療衛(wèi)生信息化使醫(yī)療衛(wèi)生數(shù)據(jù)以驚人的幾何速度增長[7]。目前,已有針對網(wǎng)絡(luò)健康數(shù)據(jù)的相關(guān)研究[8-11],如果能及時抓取網(wǎng)絡(luò)上的健康資訊并加以深入分析與挖掘,或許能對網(wǎng)絡(luò)輿情進行有效檢測和引導(dǎo),同時能分析出不同平臺用戶特點和關(guān)注點,使之更為個性化和人性化。然而,網(wǎng)絡(luò)上的健康資訊十分零散,無法做到有效整合,而且因為資訊來源和平臺不同導(dǎo)致不同資訊在結(jié)構(gòu)上具有較大差異。因此,健康領(lǐng)域的網(wǎng)絡(luò)數(shù)據(jù)研究具有很大的潛力可以挖掘。
已經(jīng)開發(fā)出一些爬蟲工具獲取研究數(shù)據(jù),但這些爬蟲對社交平臺和門戶網(wǎng)站的新型網(wǎng)頁結(jié)構(gòu)支持不夠,在研究中容易出現(xiàn)各種問題。其往往只針對特定平臺進行適配,不具備普適性。除此之外,由于開發(fā)時間較長,缺乏對新技術(shù)的支持,很難適應(yīng)當(dāng)前的網(wǎng)絡(luò)環(huán)境。
本文爬蟲通過對各平臺網(wǎng)頁結(jié)構(gòu)的分析,支持微博、門戶網(wǎng)站等主流數(shù)據(jù)源,在一定程度上保證了數(shù)據(jù)的完整性。Python提供了針對網(wǎng)絡(luò)協(xié)議標(biāo)準(zhǔn)庫,對網(wǎng)絡(luò)協(xié)議的各個層次進行了抽象封裝[12],因而十分適合于網(wǎng)絡(luò)爬蟲開發(fā)。本文爬蟲以Python為技術(shù)基礎(chǔ)進行開發(fā), 綜合運用多個Python網(wǎng)絡(luò)函數(shù)庫,能夠很好地適應(yīng)當(dāng)前的網(wǎng)絡(luò)環(huán)境。
1 微博爬蟲
微博用戶基數(shù)大,資訊的更新與傳播速度遠(yuǎn)遠(yuǎn)高于一般網(wǎng)絡(luò)媒體,是非常好的數(shù)據(jù)來源。目前針對微博平臺的數(shù)據(jù)爬蟲研究[13-16]大致可分為基于API、基于網(wǎng)絡(luò)爬蟲和基于網(wǎng)絡(luò)數(shù)據(jù)流3種獲取技術(shù)[17]。然而,微博登錄機制復(fù)雜,其提供的API存在訪問數(shù)量、頻率等方面的限制。此外,微博的網(wǎng)頁結(jié)構(gòu)與傳統(tǒng)網(wǎng)頁區(qū)別很大,結(jié)構(gòu)更加細(xì)碎繁瑣。因此,如果要大規(guī)模爬取微博數(shù)據(jù),傳統(tǒng)爬取方法可能不再有效,需另辟蹊徑。Selenium是一個自動化測試工具,具有以下幾個特性:①可對多種瀏覽器進行測試,如IE、Firefox、Safari、Chrome、Android手機瀏覽器等;②支持多種語言,如Java、C#、Python、Ruby、PHP等;③跨平臺,如Windows、Linux、iOS、Android等;④開源免費[18]。本文爬蟲利用Python中Selenium開源庫的模擬特性,期望實現(xiàn)微博數(shù)據(jù)的高效爬取,同時將數(shù)據(jù)進行結(jié)構(gòu)化存儲,使數(shù)據(jù)更加條理清晰。
1.1 爬取流程
微博爬蟲工作流程如圖1所示。與傳統(tǒng)網(wǎng)站不同,由于新浪微博的限制,需要首先進行登錄,之后才可進行數(shù)據(jù)抓取。登錄以后,選定 “新浪健康”賬戶為種子用戶,逐步解析并獲取微博內(nèi)容,更新用戶隊列作為后續(xù)爬取對象。最后對微博進行結(jié)構(gòu)化存儲,方便后續(xù)使用。
1.2 微博登錄
登錄微博后才能爬取數(shù)據(jù),因而首先要解決微博登錄問題。與傳統(tǒng)的會話方式不同,本文通過模擬用戶的登錄動作實現(xiàn)微博登錄,這會使新浪微博系統(tǒng)將爬蟲程序當(dāng)作真正的用戶,從而省去諸多麻煩。Python的Selenium庫擁有成熟的模擬特性,其提供了方便的接口用以定位網(wǎng)頁上的按鈕與文本框。
微博登錄步驟:①初始化Selenium庫中的driver,利用driver.get(url)函數(shù)獲取頁面信息;②通過driver.get_element_by_name()函數(shù)定位“用戶名”及“密碼”輸入框,通過driver.get_element_by_xpath()函數(shù)定位“登錄”按鈕,利用send_keys()函數(shù)輸入用戶名及密碼;③利用click()函數(shù)模擬點擊“登錄”按鈕。登錄成功之后,只需維持driver便可方便地訪問微博數(shù)據(jù)。
1.3 內(nèi)容獲取
登錄之后便可進行內(nèi)容獲取。微博網(wǎng)頁包含各種內(nèi)容及對象,結(jié)構(gòu)復(fù)雜,但是每條微博形式類似,一般包括作者、正文、點贊量、轉(zhuǎn)發(fā)量、評論量等。首先通過Selenium開源庫中的driver.page_source()函數(shù)進行頁面源碼抓取,然后利用正則表達式對網(wǎng)頁內(nèi)容進行篩選。為了方便存儲,將作者、正文、評論量、點贊量、轉(zhuǎn)發(fā)量等作為一條記錄存儲在數(shù)據(jù)庫中。
為保證微博爬取的完整性和高效性,本文采取一種基于深度優(yōu)先的爬取策略。于娟等[19]對主題爬蟲進行了綜述研究,闡述了多種主題爬蟲的抓取策略。本文爬蟲以“健康”為主題進行內(nèi)容篩選,采用基于文字內(nèi)容的啟發(fā)式策略。首先選擇“新浪健康”微博用戶作為種子用戶,獲取其所有的微博內(nèi)容并存儲。在與其關(guān)聯(lián)的用戶中,以“健康”、“醫(yī)生”、“醫(yī)藥”等關(guān)鍵詞進行篩選,依次爬取并存儲該用戶的微博,如此反復(fù),即可獲得大量的健康微博資訊。
2 門戶網(wǎng)站爬蟲
門戶網(wǎng)站頁面內(nèi)容包羅萬象,包含文字、圖片甚至音頻、視頻等,頁面結(jié)構(gòu)及源碼較為復(fù)雜。但是,門戶網(wǎng)站往往對相同主題內(nèi)容作了歸類,因此不需要對資訊內(nèi)容進行篩選。利用Python的Selenium庫、BeautifulSoup和正則表達式可以實現(xiàn)對內(nèi)容的準(zhǔn)確定位,以期實現(xiàn)高效爬取。
2.1 內(nèi)容獲取
爬蟲的首要任務(wù)是獲取目標(biāo)網(wǎng)頁內(nèi)容,以便后續(xù)分析和研究。傳統(tǒng)的HTTP請求方式獲取網(wǎng)頁HTML源碼,由于存在編碼格式和網(wǎng)站自身的訪問限制等問題,極易出現(xiàn)錯誤,如編碼格式差異導(dǎo)致的字符亂碼、爬取速度過快導(dǎo)致的網(wǎng)站封鎖訪問等等。本文爬蟲通過模擬用戶瀏覽,利用Selenium庫提供的函數(shù)對HTML源碼進行獲取,通過正則表達式提取源碼,可有效避免上述問題。
門戶網(wǎng)站通常將同類新聞放在同一頻道中,健康內(nèi)容獲取分為兩步:①獲取健康新聞列表;②根據(jù)列表獲取詳細(xì)的資訊內(nèi)容。因此,爬取過程需要維護一個新聞列表隊列和多個爬取線程。在初始狀態(tài)下,首先依據(jù)新聞列表獲取健康資訊地址并存入隊列中。多個爬取線程根據(jù)新聞隊列情況讀取隊列中的地址爬取健康資訊。利用Selenium庫中的driver.page_source()獲取源碼,然后利用BeautifulSoup對頁面進行解析。BeautifulSoup能夠從HTML或XML文件中提取數(shù)據(jù),能夠通過用戶指定的轉(zhuǎn)換器實現(xiàn)通用的文檔瀏覽、查找和修改[20]。篩選出資訊的標(biāo)題、作者、發(fā)表時間、來源、正文等信息后,作為一條記錄存儲到相應(yīng)的數(shù)據(jù)庫中,一旦隊列為空則結(jié)束線程停止爬取。
2.2 相關(guān)問題
在實踐過程中,為了增強程序的健壯性,使之面對各種問題時仍能高效穩(wěn)定運行,本文對爬蟲細(xì)節(jié)作了諸多修改:①為了更真實地模擬網(wǎng)頁瀏覽過程,防止因頻繁訪問而被網(wǎng)站封鎖,本文爬蟲設(shè)置了隨機時間間隔。在兼顧效率和穩(wěn)定性的情況下,根據(jù)實驗結(jié)果,將間隔設(shè)置為2~5s;②為了更好地處理因網(wǎng)絡(luò)狀況不佳而出現(xiàn)的爬蟲中斷,為爬蟲設(shè)計了斷點記錄功能。在獲取新聞列表和詳細(xì)資訊內(nèi)容的同時,將正在爬取的地址和其在新聞列表中的位置保存起來。爬蟲重新啟動時,根據(jù)斷點位置繼續(xù)運行,無需從頭開始,這一功能可節(jié)省大量時間;③為了提高效率,采用了多線程技術(shù),多個線程同時爬取新聞內(nèi)容可大幅提高效率。
3 實驗分析
本實驗分為3部分:①對爬蟲的多線程效率進行對比分析;②對爬取的數(shù)據(jù)依據(jù)年月進行統(tǒng)計分析;③對以“癌癥”為關(guān)鍵詞的資訊進行統(tǒng)計分析。
在爬蟲效率測試中,選取騰訊健康頻道作為數(shù)據(jù)源,通過設(shè)置不同的線程數(shù)量進行多次速度測試,時間效率統(tǒng)計如表1和圖2所示。
經(jīng)計算:從單線程到雙線程,爬蟲速度提升了33.75%;從雙線程到三線程,爬蟲速度再次提升了20.45%;而從三線程到四線程,爬蟲速度的提升微乎其微,僅僅有0.8%。直接對比單線程與三線程,爬蟲速度則提升了47.36%。
不難看出,多線程技術(shù)的引入極大提升了爬蟲效率。然而當(dāng)線程較多時,系統(tǒng)需要分配出一定資源維護各個線程;同時考慮到網(wǎng)絡(luò)帶寬等因素,此時增加線程對爬蟲速度的影響已不明顯。因此,多線程技術(shù)的使用對計算機本身的計算能力也是一種考驗,需要綜合考慮機器性能、網(wǎng)絡(luò)帶寬等各種因素。
本實驗針對新浪、網(wǎng)易、騰訊三大門戶網(wǎng)站,爬取了2015年1月至2016年12月期間總計9 422篇健康類文章。對這些文章按照年月進行統(tǒng)計,如圖3所示。
由圖3可知,按月份計算,2015年的文章數(shù)量始終多于或等于2016年同期。與此同時,微博、移動新聞客戶端等資訊平臺因其傳播便捷性、內(nèi)容時效性和與傳統(tǒng)平臺不同的社交屬性,更加符合移動互聯(lián)網(wǎng)特點,越來越受到年輕用戶的關(guān)注與喜愛,不斷搶占傳統(tǒng)門戶網(wǎng)站市場。作為研究者應(yīng)敏感地覺察到這一趨勢,及時調(diào)整未來的研究方向。
對這些文章的主體進行關(guān)鍵字匹配與分析,主要匹配了“癌”、“腫瘤”這兩個關(guān)鍵詞,并按照年月對這些文章進行統(tǒng)計,如圖4所示。
從圖4可知,以“癌癥”為主題的健康文章數(shù)量每月始終在140篇上下波動,其始終是人們關(guān)注的焦點。比較2016年與2015年兩年的情況,兩條曲線擬合較好,并未受到微博、移動新聞客戶端等平臺沖擊,進一步佐證了“癌癥”健康資訊的焦點屬性。
4 結(jié)語
本文提供了健康數(shù)據(jù)爬取工具,集成了門戶網(wǎng)站、微博等多數(shù)據(jù)源,使得爬取內(nèi)容較為全面;另外,本文爬蟲支持多線程技術(shù),能夠達到較高的爬取效率。然而,面對復(fù)雜的網(wǎng)絡(luò),本文爬蟲仍存在一些問題,有進一步優(yōu)化的空間。例如,通過緩存與多進程技術(shù)可以再次提升爬蟲效率,建立分布式爬蟲以應(yīng)對海量數(shù)據(jù)。本文爬蟲工具的實現(xiàn),為后續(xù)研究工作奠定了基礎(chǔ)。
參考文獻:
[1] 中國互聯(lián)網(wǎng)絡(luò)信息中心(CNNIC). 第41次中國互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r統(tǒng)計報告[R]. 2018.
[2] CARLISLE J, PATTON R. Is social media changing how we understand political engagement?an analysis of Facebook and the 2008 presidential election[J].? Political Research Quarterly,2013,66(4):883-895.
[3] STRAFLING N,KRAMER N C. The influence of social aspects and personality on the usage of social media for study related exchange[J]. Gruppendynamik und Organisationsberatung,2013,44(4):402-403.
[4] CUNLIFFE D,MORRIS D,PRYS C. Young bilinguals language behaviour in social networking sites: the use of welsh on facebook[J]. Journal of Computer-Mediated Communication,2013,18(3):339-361.
[5] 周中華,張惠然. 基于Python的新浪微博數(shù)據(jù)爬蟲[J]. 計算機應(yīng)用,2014,34(11):3131-3134.
[6] 廉捷,周欣. 新浪微博數(shù)據(jù)挖掘方案[J]. 清華大學(xué)學(xué)報:自然科學(xué)版,2011,51(10):1300-1305.
[7] 卞偉瑋,王永超. 基于網(wǎng)絡(luò)爬蟲技術(shù)的健康醫(yī)療大數(shù)據(jù)采集整理系統(tǒng)[J]. 山東大學(xué)學(xué)報:醫(yī)學(xué)版,2017,55(6):1-9.
[8] 黃曉琴. 醫(yī)療健康大數(shù)據(jù)關(guān)鍵問題及對策研究[J].? 中國數(shù)字醫(yī)學(xué),2016(5):81-83.
[9] 顏延,秦興彬,樊建平,等. 醫(yī)療健康大數(shù)據(jù)研究綜述[J].? 科研信息化技術(shù)與應(yīng)用,2014(6):3-16.
[10] 董誠,林立,金海,等. 醫(yī)療健康大數(shù)據(jù):應(yīng)用實例與系統(tǒng)分析[J]. 大數(shù)據(jù),2015(2):78-89.
[11] 代濤. 健康醫(yī)療大數(shù)據(jù)發(fā)展應(yīng)用的思考[J]. 醫(yī)學(xué)信息學(xué)雜志,2016,37(2):2-8.
[12] 陳琳,任芳. 基于Python的新浪微博數(shù)據(jù)爬蟲程序設(shè)計[J].? 信息系統(tǒng)工程,2016(9):97-99.
[13] 盧楊,李華康,孫國梓.? 一種基于P2P技術(shù)的分布式微博爬蟲系統(tǒng)[J].? 江蘇大學(xué)學(xué)報:自然科學(xué)版,2016(3):296-301.
[14] 李學(xué)龍,龔海剛.? 大數(shù)據(jù)系統(tǒng)綜述[J].? 中國科學(xué):信息科學(xué),2015(1):1-44.
[15] 程學(xué)旗,靳小龍,王元卓,等.? 大數(shù)據(jù)系統(tǒng)和分析技術(shù)綜述[J].? 軟件學(xué)報,2014(9):1889-1908.
[16] 彭希羨,朱慶華,劉璇.? 微博客用戶特征分析及分類研究——以“新浪微博”為例[J].? 情報科學(xué),2015 (1):69-75.
[17] 余容,李光強. 微博文本挖掘研究綜述[J],情報探索,2017(5):97-103.
[18] 盧晨. 基于Selenium進行Web應(yīng)用測試研究[J]. 軟件導(dǎo)刊,2015,14(1):154-155.
[19] 于娟,劉強. 主題網(wǎng)絡(luò)爬蟲研究綜述[J]. 計算機工程與科學(xué),2015,37(2):231-237.
[20] 時永坤. 基于WebDriver的定向網(wǎng)絡(luò)爬蟲設(shè)計與實現(xiàn)[J]. 軟件,2016,37(9):94-97.
(責(zé)任編輯:杜能鋼)