新冠肺炎疫情数据的抓取及可视化研究
2021-04-30刘玉玲郑力新
刘玉玲,郑力新
(1.厦门工学院电子与电气工程学院,福建厦门 361000;2.华侨大学工学院,福建泉州 362021)
2020 年的开春,整个中国乃至全世界被一种恐怖的病毒——新型冠状病毒覆盖,病毒的扩散之快始料未及,国家和各地卫健委每日实时更新各种疫情数据。
Python 是一种开源、免费的高级动态编程语言,语法简单,可读性强。现成的爬虫框架以及相关的函数库为数据抓取提供了可能。
文中系统利用了Python 强大的函数库,研究了网络爬虫的基本方法,完成了新型冠状病毒相关疫情数据的获取,并进行了数据分析及可视化。
1 数据下载
网络数据下载的过程为爬虫,它主动抓取网络相关数据[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)可实时获取系统的时间戳。
2 数据处理
下载的两个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 重要的键及其说明
2.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。
2.2 全国疫情地图数据
绘制全国疫情地图的目的是将全国各省的累计确诊和现有确诊人数以颜色深浅做标记显示在地图上,可直观地看出各省疫情的严重程度。各个城市的疫情数据存于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 等。
3 数据可视化
数据的可视化分析是一种综合利用可视化界面和分析理论来帮助用户解释复杂数据的技术,可视化是数据探索的重要途径。在Python 中,常用的软件绘图组件为Matplotlib、Numpy、iPython、Scripy 等,该文主要采用了Matplotlib 模块[9]。
Matplotlib意为用Python实现Matlab的功能,是Python下较出色、较常用的绘图软件,文中主要绘制了两种图形:1)全国的趋势图,用的是Matplotlib 中的pyplot 子库[10];2)全国地图,用的是Matplotlib 的扩展工具包basemap[11]。
3.1 全国疫情趋势图
不管是全国疫情总体趋势图还是新增趋势图,其横坐标均为日期,纵坐标是趋势的相关数据,因此采用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 新冠肺炎疫情新增曲线
3.2 全国疫情地图
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 日,新疆、西藏、青海、福建、安徽等已经实现了零确诊,云南、内蒙、山西等地现有确诊人数为个位数,除了湖北省现有确诊人数超过一万外,其他大部分省份均回落到两位数,整体疫情逐步转好。
4 结论
利用了Python 强大的第三方库,完成了疫情数据信息的抓取和可视化,简明直观地将疫情的动态发展情况呈现于眼前,其中requests 模块用于数据抓取,Matplotlib 模块用于数据可视化。整个设计简单明确,效果较好,为其他情况下的网络数据抓取以及可视化提供了可借鉴的方法。