?

淺析Python爬蟲獲取數據實現調查研究的應用*

2021-06-03 04:55張勇常驍毅蒿花耿輝通訊作者
科學與信息化 2021年14期
關鍵詞:源代碼爬蟲帖子

張勇 常驍毅 蒿花 耿輝(通訊作者)

1. 西安交通大學第一附屬醫院國有資產管理辦公室 陜西 西安 710061;2. 西安交通大學第一附屬醫院體檢部 陜西 西安 710061

隨著大數據時代的來臨,數據規模、類型呈幾何式增長,為從海量的信息數據里獲取有價值的數據,衍生了網絡爬蟲,這是一種按研究人員設定獲取信息源的規則,根據一定的算法編程實現自動地抓取網絡信息數據的程序,研究人員獲取到這些信息數據后,再進行數據清洗、加工,構建信息調查的信息數據基礎。本文在已發表的文獻的基礎上,介紹Python構建爬蟲獲取數據進行信息調查的過程。

1 示例數據簡介

本文以Emma等[1]2017年發表的信息調查“阿爾茨海默病患者及護理人員在網絡社區尋求解決方案和情感支持”為例,介紹Python爬蟲實現信息調查的方法。該研究的過程分為3個階段,第一階段使用以Python編程語言編寫爬蟲獲取從2012年4月至2016年10月在alzconnected.org的Caregiver論壇中公開的2500個帖子及其各自的解決方案,第二階段對這些帖子及其4219份回復進行了分析,第三階段對分析的結果進行描述,大多數帖子(26%)與阿爾茨海默癥癥狀的查詢有關,而最高比例的答案(45.56%)與照顧者的健康狀況有關。alzconnected.org網站有可能成為護理人員的情感支持渠道,但是,需要一個更加友好的界面來滿足大多數護理人員分享技術技能等的需求。

2 Python構建爬蟲的準備工作

首先登錄網站分析網站結構,第一步獲取初始的URL,初始URL地址可以人為地指定,也可由研究人員指定的某個或某幾個目標網頁決定;第二步根據初始的URL爬取頁面并獲得新的URL,獲得新的URL地址后,爬取當前URL地址信息,解析網頁內容,將網頁有價值信息數據存儲到CSV或數據庫等存儲介質中;第三步將上一步獲取的URL整理成隊列,從隊列中讀取新的URL,從而獲得新的網頁信息,解析新網頁內容并單獨存儲;第四步設置爬蟲系線設置的停止條件, 條件滿足時停止獲取數據退出程序。為保證能夠快速搭建爬蟲應用,本文使用集成安裝環境Anaconda。

2.1 Anaconda的安裝

Anaconda是一個開源的Python發行版本,直接去官網https://www.anaconda.com 下載安裝就可以,安裝過程中需要注意的一點是鉤選Anaconda加入系統變量。

2.2 Google Chrome瀏覽器的開發者工具介紹

為方便瀏覽網頁中有價值信息數據的源代碼位置,需要使用Google Chrome瀏覽器的開發者工具。按F12(或快捷鍵Ctrl+Shift+i)調出開發者工具 。Chrome開發者工具最常用的4個功能模塊:ELements、Console、Sources、Network。Elements:可查看或修改HTML的屬性、CSS屬性、設置斷點、監聽事件等。Console:用于執行一次性代碼,查看動態數據對象,分析調試信息或異常信息等。Sources:用于查看需獲取數據頁面的HTML文件源代碼、CSS源代碼、JavaScript源代碼,也可以調試JavaScript源代碼,嘗試添加斷點給JS代碼等。Network:查看網頁數據與網絡連接加載的相關時間等信息。

因本文需要使用到Elements,下面詳細介紹Google Chrome瀏覽器的元素(Elements)使用方法及技巧,在網頁分析及爬蟲代碼編寫過程中,查看元素的代碼,實現網頁元素信息的快速定位是最關鍵的一點,使用Elements中左上角的箭頭圖標(或按快捷鍵Ctrl+Shift+C)進入選擇元素模式,滑動鼠標從網頁中選擇需要查看的元素,然后可以在開發者工具元素(Elements)一欄中定位到該元素源代碼的具體位置,從源代碼中讀出改元素的屬性。

2.3 網頁架構分析

Emma等[1]2017年發表的信息調查論文數據來源為:阿爾茨海默病患者及護理人員網絡社區,即:該社區ALZConnected?(alzconnected.org)由阿爾茨海默氏癥協會?提供支持,是一個免費的在線交流社區,面向受阿爾茨海默病或其他癡呆癥影響的每個人,包括:患有這種疾病的人及其照顧者、家庭成員、朋友等,其網絡地址為:https://www.alzconnected.org。

從首頁https://www.alzconnected.org/進入網站,點擊F12打開開發人員工具,Emma等研究信息數據主要來源于:Caregivers Forum(看護人論壇),用Elements標簽的快速定位工具定位后Caregivers Forum是包含在:一組源代碼的a標簽里,其中的href為加載在網絡地址后面的一組跳轉地址,即: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(看護人論壇)的網絡地址,這點可以通過點擊Caregivers Forum按鍵跳轉后的網絡地址來驗證。進入Caregivers Forum(看護人論壇)后,依舊利用快速定位工具,查看文檔標題元素所在位置及其跳轉地址,如圖2所示:

圖2 標題元素所在位置及跳轉地址

文檔標題所在的table為:class=”content ekContent”的下拉地址里,XAPTH地址為:table class=”content ekContent”/tbody/tr/td[2]/a的a標簽里面,即:網絡地址和問題的text都可以在tbody標簽里tr標簽包含的第二個td的a標簽里找到相應的href屬性和text屬性。

接下來找到爬蟲程序的停止條件,當點擊網頁上的“last”跳轉到網站的最后一頁時,會出現“<<”樣的標識,用Elements標簽的定位,即“<<”和“<<”是等價的,在爬蟲程序里既可以使用“<<”也可以使用“<<”的出現作為爬蟲的停止條件。

3 依據網頁的架構設計Python爬蟲的核心技術

爬取阿爾茨海默病網絡社區網站共分三步:第一步,指定爬蟲獲取信息數據入口;第二步,獲取討論主題下的問題目錄;第三步,獲取目錄下的文章內容和回帖內容;第四步,存儲以上內容到CSV或SQL等存儲介質。

3.1 Python爬蟲指定爬蟲獲取信息數據入口

首先給爬蟲定義獲取信息數據入口的domain和需要抓取Caregivers Forum(看護人論壇)的url,分別定義為domain和base_url:domain = ‘https://www.alzconnected.org’,base_url = domain + ‘/discussion.aspx?g=topics&f=151’。

3.2 獲取Caregivers Forum論壇下的帖子目錄

找到domain和base_url后根據題目所在網頁源碼位置,寫入相應代碼: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’)[0].attrib[‘href’],定義需要爬取帖子所在位置board[‘board_name’] = columns[0].xpath(‘a’)[0].text。之后循環拿出所有帖子目錄,以及帖子所在的url(定義為board_url),再進入url獲取分目錄里的每一行的需要的信息:接著進入帖子目錄,拿到帖子標題、發表時間和一系列有用的信息,在獲取帖子目錄的時候先判斷目錄共有頁,只確定最后一頁作為爬蟲程序的停止條件即可:找到頁碼所在的位置,根據“<<”這個符號判斷是否最后一頁。確定了停止條件后進行循環抓取每頁的數據,到最后一頁結束程序,獲取數據的主要代碼如下:

爬出每一頁的text就行。

3.3 獲取目錄下的帖子內容和回帖內容

獲取帖子目錄下的所有帖子及回帖內容,首先爬蟲需獲取每個帖子的跳轉地址,地址用:topic_url進行定義,代碼為:def get_content(self, topic_url, page): querystring = {“ajax”:””,”p”:str(page)},得到的topic_url地址和domain結合構造出帖子及回帖的url地址:url = self.domain + topic_url,讓爬蟲查找源代碼獲取帖子及回帖內容的文本代碼所在位置并下載數據:c_eles = self.tree.xpath(‘//td class=”message ekMessage”’)。和獲取帖子目錄的方式一樣得到最大頁數,執行循環,爬取到最后一頁為止跳出循環,查找下一問題url,遍歷循環,獲取所有內容。

3.4 爬蟲的數據存儲模塊分類

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 = [‘需要存儲的數據名稱’],writer = csv.DictWriter(f, fieldnames = fieldname),寫入存儲數據即可。

3.4.3 數據庫存儲。用Python命令創建數據庫和表,將數據逐條存入數據庫的表內,如圖3所示,將頁面上讀取到的有價值的信息或者將處理過的信息存儲到數據庫中,以便以后分析時使用。Python支持的數據庫包括Oracle、MySQL等所有主流數據庫。

圖3 Python命令創建數據庫和表示意圖

3.5 對爬蟲獲取數據進行處理

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

圖4 爬蟲獲取數據結果

圖5 數據進行LlWC分析

Emma等[1]獲取到阿爾茨海默病患者論壇的數據后,利用LIWC分析工具對帖子和回復都進行了分析,論壇上的帖子傳達最多的是照顧者從心碎到強烈憤怒的情感變化,分析還顯示大多數帖子(26%)與有關阿爾茨海默病癥狀的查詢有關,而最高比例的回復(45.56%)與照顧者的健康有關。

4 結束語

網絡爬蟲獲取數據非常高效便捷,并且可以更新實時數據,2018年Python在IEEE頂級程序語言排行榜中排名第一,具有專業的數據統計和機器學習等高質量擴展庫,尤其是Python語言構建爬蟲獲取數據進行臨床研究,國內學者已有廣泛應用:2017年學者卞偉瑋等運用聚焦網絡爬蟲技術快速、準確地獲得公共衛生服務系統的醫療數據,為健康風險評估模型提供數據基礎[2]。2018年學者熊丹妮等運用網絡爬蟲獲取醫療服務平臺信息與《2016中國衛生和計劃生育統計年鑒》的相關數據進行對比[3]。2018年學者羅春花利用網絡爬蟲軟件搜集了全國30個地區的等級醫院數據,從省級和經濟區劃單元兩個層面對醫療服務能力的空間資源配置進行分析[4]。

研究人員通過Python爬蟲獲取到有價值信息數據后,進行數據清洗、加工,構建信息調查的數據基礎,本文在已發表文獻的基礎上,介紹Python構建爬蟲獲取數據進行信息調查的過程。主要是將頁面上讀取到的有價值的信息或者將處理過的信息存儲到數據庫中,以便以后分析、抓取時使用。研究人員運用Python語言進行信息調查的過程為:①Caregivers Forum(看護人論壇)后,依舊利用快速定位工具,查看文檔標題元素所在位置及其跳轉地址;②只確定最后一頁作為爬蟲程序的停止條件即可:找到頁碼所在的位置,根據“<<”這個符號判斷是否最后一頁。③用熟悉的方式存儲數據,數據存儲格式姚方便后期處理數據。④運用LIWC分析工具處理爬蟲獲取的數據,得到結果并分析。其中需要注意的是爬蟲獲取數據后存儲的格式要利于后期數據處理,否則還要進行數據轉換,避免增加不必要的工作量。

猜你喜歡
源代碼爬蟲帖子
利用網絡爬蟲技術驗證房地產灰犀牛之說
基于TXL的源代碼插樁技術研究
基于Python的網絡爬蟲和反爬蟲技術研究
目前互聯網中的網絡爬蟲的原理和影響
大數據背景下校園輿情的爬蟲應用研究
保護好自己的“源代碼”
暴力老媽
解密別克安全“源代碼”
高手是這樣拍馬屁的
我是怎樣在壇子里墮落的
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合