劉玉玲,鄭力新
(1.廈門工學院電子與電氣工程學院,福建廈門 361000;2.華僑大學工學院,福建泉州 362021)
2020 年的開春,整個中國乃至全世界被一種恐怖的病毒——新型冠狀病毒覆蓋,病毒的擴散之快始料未及,國家和各地衛健委每日實時更新各種疫情數據。
Python 是一種開源、免費的高級動態編程語言,語法簡單,可讀性強。現成的爬蟲框架以及相關的函數庫為數據抓取提供了可能。
文中系統利用了Python 強大的函數庫,研究了網絡爬蟲的基本方法,完成了新型冠狀病毒相關疫情數據的獲取,并進行了數據分析及可視化。
網絡數據下載的過程為爬蟲,它主動抓取網絡相關數據[1]。此次新冠肺炎疫情的數據來源為國家及各地衛健委的每日信息發布,新浪、網易、騰訊、丁香等進行轉載。打開網頁后,按下F12 功能按鍵,進入相應瀏覽器的network[2-3],下面以火狐瀏覽器訪問騰訊疫情實時追蹤數據為例。F5 重新載入當前頁面,發現所有的疫情數據都存儲在兩個類型為json的數據中,其對應的請求網址如圖1 所示。

圖1 兩個json類型數據的請求地址
點擊每個數據的“響應”,即可看到每個數據的字典信息。這些數據的結構十分清晰,易于提取[4]。值得注意的是,各大網站的數據源會常常變更數據格式及請求網址,只要進行適當地替換即可。
得知了數據的URL、請求方法、應答格式等信息,可通過下列代碼抓取數據。

程序中的requests模塊是網絡爬蟲利器[5],可以使用pip install requests 安裝指令實現,由于國外鏈接網站的網速較慢,經常導致安裝失敗,因此可嘗試使用鏡像源實現安裝,如豆瓣、清華等。指令改用pip install requests-i https://pypi.douban.com/simple,以保證其下載速度。除了利用requests 模塊爬蟲,還可以利用scrapy 等應用程序框架為網絡爬蟲提取數據[6-7]。
語句requests.get()向目標網站發起請求,其返回值的內容即為目標網站頁面的HTML代碼。新冠肺炎疫情數據是實時更新的,網址亦隨之變化,網址的末尾是當前時間的時間戳,程序中采用了格式化輸入,%d′%int(time.time()*1000)可實時獲取系統的時間戳。
下載的兩個data 都是字典,字典由鍵和對應值成對組成,通過print(data.keys())可查看字典中所有的鍵。data1 的鍵為:lastUpdateTime,chinaTotal,chinaAdd,isShowAdd,showAddSwitch,areaTree,china DayList,chinaDayAddList,dailyNewAddHistory,daily History,wuhanDayList,articleList;data2的鍵為:china DayList,chinaDayAddList,dailyNewAddHistory,daily History,wuhanDayList,articleList,provinceCompare,fore ignList,globalStatis,globalDailyHistory,cityStatis。
兩數據有部分鍵重復,但data1 的最后6 個鍵對應的值被置為空,而這些信息存儲在data2 中,兩個數據一起覆蓋了新冠肺炎疫情的所有信息。表1 列出了后續數據處理所需的幾個重要的鍵及其說明。

表1 重要的鍵及其說明
由表1 可知,全國疫情總體趨勢的相關信息存于data2的chinaDayList,將相關數據提取保存,代碼如下:for m in range(len(data2[′chinaDayList′])):

由程序可得到date_list,confirm_list,suspect_list,dead_list,heal _list。程序中的日期首先由split函數拆分為month 和day,再進行格式化輸出[8]。
全國疫情新增趨勢的相關信息存于data2 的chinaDayAddList中,經由chinaDayList 數據類似的提取方法,可得到date_add_list,confirm_ add_list,suspect_add_list,dead_add_list,heal_add_list。
繪制全國疫情地圖的目的是將全國各省的累計確診和現有確診人數以顏色深淺做標記顯示在地圖上,可直觀地看出各省疫情的嚴重程度。各個城市的疫情數據存于data1 的areaTree 中。
經過如下代碼可統計出各省的累計確診人數,其中[′areaTree′][0][′children′]代表各個省的具體疫情數據,item[′name′]為省名,item[′total′][′confirm′]為各省的累計確診人數。

根據字典data 可得各省的累計確診人數,如′湖北′:67 760,′廣東′:1 353,′河南′:1 272,′浙江′:1 215,′湖南′:1 018,′安徽′:990 等。
通過類似的方法可統計出各省的現有確診人數,現有確診人數=累計確診人數-累計治愈人數-累計 死 亡 人 數,data[item[′name′]]=int(item[′total′][′confirm′])-int(item[′total′][′ heal ′])-int(item [′total′][′dead ′]),打印出各省的現有確診人數,如′湖北′:17 151,′廣東′:75,′河南′:3,′浙江′:24,′湖南′:26,′安徽′:0 等。
數據的可視化分析是一種綜合利用可視化界面和分析理論來幫助用戶解釋復雜數據的技術,可視化是數據探索的重要途徑。在Python 中,常用的軟件繪圖組件為Matplotlib、Numpy、iPython、Scripy 等,該文主要采用了Matplotlib 模塊[9]。
Matplotlib意為用Python實現Matlab的功能,是Python下較出色、較常用的繪圖軟件,文中主要繪制了兩種圖形:1)全國的趨勢圖,用的是Matplotlib 中的pyplot 子庫[10];2)全國地圖,用的是Matplotlib 的擴展工具包basemap[11]。
不管是全國疫情總體趨勢圖還是新增趨勢圖,其橫坐標均為日期,縱坐標是趨勢的相關數據,因此采用pylot 繪制即可。Matplotlib 是Python 常用的數據繪制包,基于numpy 的數組運算功能[12-13]。
趨勢圖繪制比較簡易,如繪制全國確診趨勢,x軸為日期,y軸為每日確診人數,利用plt.plot(date_list,confirm_list,label=′確診′)可實現每日確診趨勢圖繪制。
圖2 為新冠肺炎疫情總體曲線,4 條曲線分別代表每日的確診、疑似、死亡、治愈人數。由圖可看出,疫情數據從1 月22 日之后快速增長,2 月10 日之后進入緩慢增長階段,而治愈人數快速增加,基于檢測手段的不斷進步,疑似病例也快速減少。

圖2 新冠肺炎疫情總體曲線
全國疫情新增趨勢程序跟總體趨勢程序類似,只是將y軸對應更改為各種新增數據。圖3 為新冠肺炎疫情新增曲線,圖中除了2 月12 日將臨床診斷病例數納入確診病例數而導致新增確診人數激增外,各項數據隨著時間的遞增都有了明顯的下降,這是因為國家防控有力,人民通力合作。由于湖北省疫情較為嚴重,因此可利用類似方法繪制湖北省甚至武漢市的趨勢圖。

圖3 新冠肺炎疫情新增曲線
Basemap 是Matplotlib 的擴展工具包,是專業標準的地圖繪制工具。在數據可視化過程中,可將數據在地圖上以空間坐標的方式顯示出來。
Basemap 一般需要配合安裝pyproj,安裝方法異于requests,首先下載本地python 對應版本basemap和pyproj 的whl 文件,如本地python 是3.8 版本,64位,則下載basemap-1.2.1-cp38-cp38m-win_amd 64.whl 和pyproj-2.5.0-cp38-cp38m-win_amd64.whl,然后用pip 進行安裝[14],在命令行模式cd 到下載目錄,執行pip install pyproj-2.5.0-cp38-cp38m-win_amd64.whl,再 執 行pip install basemap-1.2.1-cp38-cp38m-win_amd64.whl。
大部分電腦按照上述步驟可以安裝成功,但有時會提示該平臺不支持此whl 文件,這是因為whl 包不滿足系統的命名規則,可用如下方法查看系統命名規則:首先進入python3.8 的shell,分別輸入以下命令import pip 和print(pip.pep425tags.get_ supported()),顯示(′py3′,′none′,′any′)符合命名規則,將basemap的whl 文件改名為basemap-1.2.1-py3-none-any.whl即可。若開發環境使用的是pycharm,還要重新將本地庫導入到項目中。
另外,中國省級地圖無法直接畫出,需配合使用中國地區的shapefiles 文件,下載后將其放入某一路徑文件夾[15]。程序中通過讀shapefiles 的方式從m.readshapefile(′shape/china-shapefiles-master/china′,′province′,drawbounds=True)讀取中國各省的shape。
Basemap 本身不會進行任何繪圖,但提供了將坐標轉換為二三十個不同地圖投影之一的功能,其投影方式由projection 參數決定。該次肺炎疫情全國地圖采用了Lambert 投影方式,m=Basemap(projection=′lcc′,llcrnrlon=77,llcrnrlat=14,urcrnrlon=140,urcrnrlat=51,lat_1=33,lat_2=45,lon_0=100,ax=axes),然后讀取shape 文件,即可顯示中國地圖。
plot_province_map()子程序用于繪制全國累計確診和現有確診的疫情地圖,其流程圖如圖4 所示。利用數據處理所得的各省數據按等級在圖上標注成不同顏色,并在圖下方進行圖注說明。
新冠肺炎的累計確診地圖如圖5 所示,繪圖等級為五級,確診人數從少到多,顏色逐步加深。由圖可直觀看出,截止到2020年3月10日,湖北疫情最為嚴重,其次為河南、湖南、廣東、浙江,我國的西北部疫情相對較輕。隨著疫情范圍的不斷擴大,國外如日本、韓國確診人數也大幅攀升,按照類似方法,更改各省的累計確診數據為各國的累計確診數據,可繪制出世界地圖。

圖4 plot_province_map子程序流程圖

圖5 全國新冠肺炎累計確診地圖

圖6 全國新冠肺炎現有確診地圖
新冠肺炎現有確診地圖如圖6 所示,繪圖等級為六級,增加了現有確診人數為0 的等級。由圖可看出,截止到2020 年3 月10 日,新疆、西藏、青海、福建、安徽等已經實現了零確診,云南、內蒙、山西等地現有確診人數為個位數,除了湖北省現有確診人數超過一萬外,其他大部分省份均回落到兩位數,整體疫情逐步轉好。
利用了Python 強大的第三方庫,完成了疫情數據信息的抓取和可視化,簡明直觀地將疫情的動態發展情況呈現于眼前,其中requests 模塊用于數據抓取,Matplotlib 模塊用于數據可視化。整個設計簡單明確,效果較好,為其他情況下的網絡數據抓取以及可視化提供了可借鑒的方法。