譚康裕 趙元成


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