張勇 常驍毅 蒿花 耿輝(通訊作者)
1. 西安交通大學第一附屬醫(yī)院國有資產(chǎn)管理辦公室 陜西 西安 710061;2. 西安交通大學第一附屬醫(yī)院體檢部 陜西 西安 710061
隨著大數(shù)據(jù)時代的來臨,數(shù)據(jù)規(guī)模、類型呈幾何式增長,為從海量的信息數(shù)據(jù)里獲取有價值的數(shù)據(jù),衍生了網(wǎng)絡爬蟲,這是一種按研究人員設定獲取信息源的規(guī)則,根據(jù)一定的算法編程實現(xiàn)自動地抓取網(wǎng)絡信息數(shù)據(jù)的程序,研究人員獲取到這些信息數(shù)據(jù)后,再進行數(shù)據(jù)清洗、加工,構建信息調查的信息數(shù)據(jù)基礎。本文在已發(fā)表的文獻的基礎上,介紹Python構建爬蟲獲取數(shù)據(jù)進行信息調查的過程。
本文以Emma等[1]2017年發(fā)表的信息調查“阿爾茨海默病患者及護理人員在網(wǎng)絡社區(qū)尋求解決方案和情感支持”為例,介紹Python爬蟲實現(xiàn)信息調查的方法。該研究的過程分為3個階段,第一階段使用以Python編程語言編寫爬蟲獲取從2012年4月至2016年10月在alzconnected.org的Caregiver論壇中公開的2500個帖子及其各自的解決方案,第二階段對這些帖子及其4219份回復進行了分析,第三階段對分析的結果進行描述,大多數(shù)帖子(26%)與阿爾茨海默癥癥狀的查詢有關,而最高比例的答案(45.56%)與照顧者的健康狀況有關。alzconnected.org網(wǎng)站有可能成為護理人員的情感支持渠道,但是,需要一個更加友好的界面來滿足大多數(shù)護理人員分享技術技能等的需求。
首先登錄網(wǎng)站分析網(wǎng)站結構,第一步獲取初始的URL,初始URL地址可以人為地指定,也可由研究人員指定的某個或某幾個目標網(wǎng)頁決定;第二步根據(jù)初始的URL爬取頁面并獲得新的URL,獲得新的URL地址后,爬取當前URL地址信息,解析網(wǎng)頁內(nèi)容,將網(wǎng)頁有價值信息數(shù)據(jù)存儲到CSV或數(shù)據(jù)庫等存儲介質中;第三步將上一步獲取的URL整理成隊列,從隊列中讀取新的URL,從而獲得新的網(wǎng)頁信息,解析新網(wǎng)頁內(nèi)容并單獨存儲;第四步設置爬蟲系線設置的停止條件, 條件滿足時停止獲取數(shù)據(jù)退出程序。為保證能夠快速搭建爬蟲應用,本文使用集成安裝環(huán)境Anaconda。
Anaconda是一個開源的Python發(fā)行版本,直接去官網(wǎng)https://www.anaconda.com 下載安裝就可以,安裝過程中需要注意的一點是鉤選Anaconda加入系統(tǒng)變量。
為方便瀏覽網(wǎng)頁中有價值信息數(shù)據(jù)的源代碼位置,需要使用Google Chrome瀏覽器的開發(fā)者工具。按F12(或快捷鍵Ctrl+Shift+i)調出開發(fā)者工具 。Chrome開發(fā)者工具最常用的4個功能模塊:ELements、Console、Sources、Network。Elements:可查看或修改HTML的屬性、CSS屬性、設置斷點、監(jiān)聽事件等。Console:用于執(zhí)行一次性代碼,查看動態(tài)數(shù)據(jù)對象,分析調試信息或異常信息等。Sources:用于查看需獲取數(shù)據(jù)頁面的HTML文件源代碼、CSS源代碼、JavaScript源代碼,也可以調試JavaScript源代碼,嘗試添加斷點給JS代碼等。Network:查看網(wǎng)頁數(shù)據(jù)與網(wǎng)絡連接加載的相關時間等信息。
因本文需要使用到Elements,下面詳細介紹Google Chrome瀏覽器的元素(Elements)使用方法及技巧,在網(wǎng)頁分析及爬蟲代碼編寫過程中,查看元素的代碼,實現(xiàn)網(wǎng)頁元素信息的快速定位是最關鍵的一點,使用Elements中左上角的箭頭圖標(或按快捷鍵Ctrl+Shift+C)進入選擇元素模式,滑動鼠標從網(wǎng)頁中選擇需要查看的元素,然后可以在開發(fā)者工具元素(Elements)一欄中定位到該元素源代碼的具體位置,從源代碼中讀出改元素的屬性。
Emma等[1]2017年發(fā)表的信息調查論文數(shù)據(jù)來源為:阿爾茨海默病患者及護理人員網(wǎng)絡社區(qū),即:該社區(qū)ALZConnected?(alzconnected.org)由阿爾茨海默氏癥協(xié)會?提供支持,是一個免費的在線交流社區(qū),面向受阿爾茨海默病或其他癡呆癥影響的每個人,包括:患有這種疾病的人及其照顧者、家庭成員、朋友等,其網(wǎng)絡地址為:https://www.alzconnected.org。
從首頁https://www.alzconnected.org/進入網(wǎng)站,點擊F12打開開發(fā)人員工具,Emma等研究信息數(shù)據(jù)主要來源于:Caregivers Forum(看護人論壇),用Elements標簽的快速定位工具定位后Caregivers Forum是包含在:一組源代碼的a標簽里,其中的href為加載在網(wǎng)絡地址后面的一組跳轉地址,即:https://www.alzconnected.org加上discussion.aspx?g=topics&f=151成為一個全鏈接可以跳轉到Caregivers Forum(看護人論壇)里,如圖1所示:

圖1 Elements標簽的快速定位示意圖
https://www.alzconnected.org/discussion.aspx?g=topics&f=15為點擊跳轉到Caregivers Forum(看護人論壇)的網(wǎng)絡地址,這點可以通過點擊Caregivers Forum按鍵跳轉后的網(wǎng)絡地址來驗證。進入Caregivers Forum(看護人論壇)后,依舊利用快速定位工具,查看文檔標題元素所在位置及其跳轉地址,如圖2所示:

圖2 標題元素所在位置及跳轉地址
文檔標題所在的table為:class=”content ekContent”的下拉地址里,XAPTH地址為:table class=”content ekContent”/tbody/tr/td[2]/a的a標簽里面,即:網(wǎng)絡地址和問題的text都可以在tbody標簽里tr標簽包含的第二個td的a標簽里找到相應的href屬性和text屬性。
接下來找到爬蟲程序的停止條件,當點擊網(wǎng)頁上的“l(fā)ast”跳轉到網(wǎng)站的最后一頁時,會出現(xiàn)“<<”樣的標識,用Elements標簽的定位,即“<<”和“<<”是等價的,在爬蟲程序里既可以使用“<<”也可以使用“<<”的出現(xiàn)作為爬蟲的停止條件。
爬取阿爾茨海默病網(wǎng)絡社區(qū)網(wǎng)站共分三步:第一步,指定爬蟲獲取信息數(shù)據(jù)入口;第二步,獲取討論主題下的問題目錄;第三步,獲取目錄下的文章內(nèi)容和回帖內(nèi)容;第四步,存儲以上內(nèi)容到CSV或SQL等存儲介質。
首先給爬蟲定義獲取信息數(shù)據(jù)入口的domain和需要抓取Caregivers Forum(看護人論壇)的url,分別定義為domain和base_url:domain = ‘https://www.alzconnected.org’,base_url = domain + ‘/discussion.aspx?g=topics&f=151’。
找到domain和base_url后根據(jù)題目所在網(wǎng)頁源碼位置,寫入相應代碼:etr_obj.xpath(‘//*[@id=“ctl00_ctl00_MainContent_ContentPlaceHolderRightSide_Forum1”]/table[2]/tbody/tr[7]/td[2]/a/font/font’)。定義需要爬取帖子目錄的url:board[‘board_url’] = columns[0].xpath(‘a(chǎn)’)[0].attrib[‘href’],定義需要爬取帖子所在位置board[‘board_name’] = columns[0].xpath(‘a(chǎn)’)[0].text。之后循環(huán)拿出所有帖子目錄,以及帖子所在的url(定義為board_url),再進入url獲取分目錄里的每一行的需要的信息:接著進入帖子目錄,拿到帖子標題、發(fā)表時間和一系列有用的信息,在獲取帖子目錄的時候先判斷目錄共有頁,只確定最后一頁作為爬蟲程序的停止條件即可:找到頁碼所在的位置,根據(jù)“<<”這個符號判斷是否最后一頁。確定了停止條件后進行循環(huán)抓取每頁的數(shù)據(jù),到最后一頁結束程序,獲取數(shù)據(jù)的主要代碼如下:

爬出每一頁的text就行。
獲取帖子目錄下的所有帖子及回帖內(nèi)容,首先爬蟲需獲取每個帖子的跳轉地址,地址用:topic_url進行定義,代碼為:def get_content(self, topic_url, page): querystring = {“ajax”:””,”p”:str(page)},得到的topic_url地址和domain結合構造出帖子及回帖的url地址:url = self.domain + topic_url,讓爬蟲查找源代碼獲取帖子及回帖內(nèi)容的文本代碼所在位置并下載數(shù)據(jù):c_eles = self.tree.xpath(‘//td class=”message ekMessage”’)。和獲取帖子目錄的方式一樣得到最大頁數(shù),執(zhí)行循環(huán),爬取到最后一頁為止跳出循環(huán),查找下一問題url,遍歷循環(huán),獲取所有內(nèi)容。
3.4.1 文本存儲。新建一個文本txt進行存儲,代碼為:with open(‘文本.text’,‘w’,encoding=‘utf-8’)as f: f.write(),寫入完成后關閉text文件: f.close()。
3.4.2 csv表格存儲。新建一個文本csv進行存儲,首先引入csv庫:import csv,with open(‘文本.csv’,‘w’, newline=‘’)as f,fieldname = [‘需要存儲的數(shù)據(jù)名稱’],writer = csv.DictWriter(f, fieldnames = fieldname),寫入存儲數(shù)據(jù)即可。
3.4.3 數(shù)據(jù)庫存儲。用Python命令創(chuàng)建數(shù)據(jù)庫和表,將數(shù)據(jù)逐條存入數(shù)據(jù)庫的表內(nèi),如圖3所示,將頁面上讀取到的有價值的信息或者將處理過的信息存儲到數(shù)據(jù)庫中,以便以后分析時使用。Python支持的數(shù)據(jù)庫包括Oracle、MySQL等所有主流數(shù)據(jù)庫。

圖3 Python命令創(chuàng)建數(shù)據(jù)庫和表示意圖
Emma等[1]使用了LIWC分析工具處理爬蟲獲取的數(shù)據(jù),LIWC分析工具是Pennebaker等人在研究情緒書寫的治療效果時發(fā)明了基于計算機軟件程序的文本分析工具—— 語言探索與字詞計數(shù)(簡稱 LIWC),一種可以對文本內(nèi)容的詞語類別(尤其是心理學類詞語)進行量化分析的軟件,它的英文版本下載地址為:http://liwc.wpengine.com,類似的中文LIWC分析網(wǎng)站為:http://ccpl.psych.ac.cn/textmind。將爬蟲爬取結果復制到LIWC分析工具里,點擊分析,得到分詞結果,進行分析,爬蟲獲取數(shù)據(jù)結果如圖4所示。將結果中的Topics列,復制進LIWC分析工具里進行分析,如圖5所示:

圖4 爬蟲獲取數(shù)據(jù)結果

圖5 數(shù)據(jù)進行LlWC分析
Emma等[1]獲取到阿爾茨海默病患者論壇的數(shù)據(jù)后,利用LIWC分析工具對帖子和回復都進行了分析,論壇上的帖子傳達最多的是照顧者從心碎到強烈憤怒的情感變化,分析還顯示大多數(shù)帖子(26%)與有關阿爾茨海默病癥狀的查詢有關,而最高比例的回復(45.56%)與照顧者的健康有關。
網(wǎng)絡爬蟲獲取數(shù)據(jù)非常高效便捷,并且可以更新實時數(shù)據(jù),2018年Python在IEEE頂級程序語言排行榜中排名第一,具有專業(yè)的數(shù)據(jù)統(tǒng)計和機器學習等高質量擴展庫,尤其是Python語言構建爬蟲獲取數(shù)據(jù)進行臨床研究,國內(nèi)學者已有廣泛應用:2017年學者卞偉瑋等運用聚焦網(wǎng)絡爬蟲技術快速、準確地獲得公共衛(wèi)生服務系統(tǒng)的醫(yī)療數(shù)據(jù),為健康風險評估模型提供數(shù)據(jù)基礎[2]。2018年學者熊丹妮等運用網(wǎng)絡爬蟲獲取醫(yī)療服務平臺信息與《2016中國衛(wèi)生和計劃生育統(tǒng)計年鑒》的相關數(shù)據(jù)進行對比[3]。2018年學者羅春花利用網(wǎng)絡爬蟲軟件搜集了全國30個地區(qū)的等級醫(yī)院數(shù)據(jù),從省級和經(jīng)濟區(qū)劃單元兩個層面對醫(yī)療服務能力的空間資源配置進行分析[4]。
研究人員通過Python爬蟲獲取到有價值信息數(shù)據(jù)后,進行數(shù)據(jù)清洗、加工,構建信息調查的數(shù)據(jù)基礎,本文在已發(fā)表文獻的基礎上,介紹Python構建爬蟲獲取數(shù)據(jù)進行信息調查的過程。主要是將頁面上讀取到的有價值的信息或者將處理過的信息存儲到數(shù)據(jù)庫中,以便以后分析、抓取時使用。研究人員運用Python語言進行信息調查的過程為:①Caregivers Forum(看護人論壇)后,依舊利用快速定位工具,查看文檔標題元素所在位置及其跳轉地址;②只確定最后一頁作為爬蟲程序的停止條件即可:找到頁碼所在的位置,根據(jù)“<<”這個符號判斷是否最后一頁。③用熟悉的方式存儲數(shù)據(jù),數(shù)據(jù)存儲格式姚方便后期處理數(shù)據(jù)。④運用LIWC分析工具處理爬蟲獲取的數(shù)據(jù),得到結果并分析。其中需要注意的是爬蟲獲取數(shù)據(jù)后存儲的格式要利于后期數(shù)據(jù)處理,否則還要進行數(shù)據(jù)轉換,避免增加不必要的工作量。