譚康裕 趙元成


摘 ?要:目的:直觀顯示新型冠狀病毒(2019-nCoV)肺炎疫情的發展趨勢,為復工復產的決策提供決策依據。方法:基于Python語言、使用requests庫下載網頁,使用re讀取目標數據,使用csv存儲目標數據、使用pyecharts展示疫情地圖分布和疫情發展趨勢圖、使用Javascript腳本顯示趨勢圖,包括疫情的地圖分布,全國疫情新增趨勢,全國累計/疑似趨勢,全國累計治愈/死亡趨勢,全國各省疫情概覽表等。結果:得到疫情發展趨勢的可視化圖表,可以直觀顯示疫情的發展趨勢,全國各省疫情概覽表等。我們可以看到,疫情已經趨于平穩。結論:2019-nCoV肺炎疫情的防控措施是有效的,各地方政府嚴格執行公共安全政策,保證了人民的生命安全,全力遏制了2019-nCoV的傳播,奪取了戰“疫”的最終勝利。
關鍵詞:新型冠狀病毒;Python;數據可視化;趨勢
新型冠狀病毒(2019-nCoV)是一種β屬的冠狀病毒,自2019年12月在湖北省武漢市發現 2019-nCoV以來,疫情快速蔓延[1]。國家衛生健康委員會疫情通報顯示,截至 2020年4月25日早上9點,累計確診人數 82816人,累計治愈出院病例77346例,累計死亡病例4632例[2]。為快速抑制病情蔓延,國家已出臺多種舉措,如延長春節假期、企業延遲復工、學校延期開學、限制出行、公共場所要佩戴口罩,居家隔離等。本文基于Python,通過網絡爬蟲技術收集2019-nCoV疫情數據,通過數據可視化手段,給出疫情的地圖分布,全國疫情新增趨勢,全國累計/疑似趨勢,全國累計治愈/死亡趨勢,全國實時疫情概覽表等。
1 對象與方法
1.1 數據來源
本文疫情發展數據取自中國疾病預防控制中心周報(以下簡稱中國疾控中心周報)和丁香園,其地址參看“參考文獻”中的[2]和[3]。隨著2019-nCoV的快速傳播,自1月25日開始,各地紛紛啟動“重大突發公共衛生事件Ⅰ級響應”,因此我們認定從1月25 日開始,病毒即進入傳播狀態。由于數據是從中國疾病預防控制中心周報中讀取,比較完整的數據是從1月29日開始,因此,本次采集的數據就是從1月29日開始,直至4月25日零點。
1.2 疫情數據提取的需求
設計疫情數據提取的代碼要解決的以下幾個問題:
(1)下載網頁:根據給定的URL下載其HTML網頁。
(2)網頁解析:根據網頁結構信息,提取網頁數據。
(3)數據存儲:把從網頁中解析出來的數據CSV文件中。
1.3 疫情數據提取的實現方法
(1)HTML下載器
本次設計使用requests庫和requests-html庫來下載網頁,分別使用requests來下載中國疾病預防控制中心周報的數據,使用requests-html來下載丁香園的數據。使用requests-html下載網頁的核心代碼如下所示:
import requests
url = 'http://weekly.chinacdc.cn/news/TrackingtheEpidemic.htm'
r = requests.get(url) #下載網頁
使用requests-html下載網頁的核心代碼如下所示:
from requests_html import HTMLSession
dxyurl = 'https://3g.dxy.cn/newh5/view/pneumonia'
response = HTMLSession.get(dxyurl) ?#下載網頁
(2)HTML解析器
Python使用BeautifulSoup來進行HTML的解析,提取目標數據。在中國控制中心周報中,我們使用BeautifulSoup直接讀取其注釋部分,而不是按行讀取目標數據所在的XPath。在中國控制中心周報網頁中,目標文本是位于標簽
中的注釋文本。通過分析中國控制中心周報網頁數據結構,我們可以通過分割標簽,同時為了數據的提取,還要把標簽添加回原來的數據項中。提取數據的代碼如下:
soup = BeautifulSoup(page,'html.parser')
content = soup.find_all("div",'box-article-content') #數據返回為列表
content_to_string = str(content) #將列表轉換成字符串,使用正則表達式提取
pattern = re.compile(r"<!--(.*?)-->") # 抽取<!--(.*?)-->中間的文本
通過構建正則表達式,提取網頁中的疫情數據。提取的疫情數據分別為日期、新增確診/疑似病例、累計確診/現存疑似病例、新增死亡/治愈人數、累計死亡/治愈人數。其正則表達式的構建如下所示:
date_regex = r"(.*?)<" ?#提取日期的正則表達式
conf_suspe_data_regex = r"
Confirmed cases:(.*?)new,(.*?)total. Suspected cases:(.*?)new,(.*?)total.<" ?#提取新增確診/疑似病例、累計確診/現存疑似病例的正則表達式