APP下载

利用python对新冠肺炎数据进行收集和分析

2020-04-30孙佩杰

河北建筑工程学院学报 2020年4期
关键词:柱状图爬虫网页

孙佩杰 吕 国

(河北建筑工程学院,河北 张家口 075000)

0 引 言

由于2019年底新冠病毒的来袭,全国各地都陆续出现新增的确诊病例.为了能够更好的控制疫情,需要了解全国各地的疫情现况,对疫情严重的地区进行严格的管控,并且出行要避开这些疫情爆发的城市.这时我们就需要从网上收集各个地区的新增确诊病例人数.本文介绍采用python实现对国内出现过确诊病例城市疫情数据的爬取,并存储成csv文件,将疫情人数前N名的城市排列出来,并且以柱状图展示.

1 用到的技术

1.1 数据可视化

数据可视化是数据视觉表现形式的科学技术研究,主要是借助图形化的手段来清晰有效地传达与沟通信息[1].数据可视化的目的就是要更加直观的观测数据、分析数据,突出数据的重点,挖掘数据中隐藏的规律和趋势,进而预测和推理.本文采用python的数据可视化工具—matplotlib,将全国疫情前N名城市的疫情数据以柱状图的形式显示出来,突出疫情较为严重的地区.

1.2 爬虫技术

网络爬虫能够自动下载网页信息,主要原理是模仿浏览器浏览网页,获取网页上所需要的资源[2].爬虫技术是一个可以搜集数据、解析数据,并将这些数据进行分析的工具.我们可以通过爬虫技术,从互联网上更好地收集我们需要的数据,从而避免因为无用的数据而花费时间,大大地提高了我们的收集效率.

1.3 爬取的内容

国内疫情数据有很多的数据源,本文采取的是腾讯新闻网站的数据源.数据源的网址是:https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5,浏览器访问此网址的结果如图1所示:

图1 网页原始数据部分截图

2 实现流程

首先获取给定网址的网页数据,将这些数据存储下来.此时存储下来的数据是混乱的,我们需要将它重新整理,转换成易于观察的类型,进而分析数据的内容;然后对整理过的数据进行排序,将排序后的数据存储成csv文件以便查询;最后用python的matplotlib将前N个城市绘制成柱状图.

图2 实现流程图

2.1 爬取数据

根据指定的网址用requests.get()函数获取网页数据,将获取的数据转换成json对象,之后用json.loads()函数把json对象转化为python字典类型,然后用json.dumps()函数将字典形式的数据改为字符串类型,以便于后面进行数据处理,最后输出.代码如下:

url="https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5"

resp=requests.get(url)

html=resp.json()

data=json.loads(html["data"])

data_formate=json.dumps(data,sort_keys=False,indent=4,separators=(',', ':'),ensure_ascii=False)

print(data_formate)

运行结果如图3所示:

图3 整理后的数据

2.2 查询需要的数据

首先输出:最近一次的更新时间,中国的情况.根据提示输入要求(例如:新增确诊病例人数排名前5名城市,需要先输入today_confirm,然后输入5).如果数据中province名字(省份名字)是4个直辖市、2个特别行政区或者台湾,那么直接将它的疫情数据添加列表中,并且疫情城市的数量加1.如果不是,那么先判断它的children(省内的城市名)是否为境外输入,如果是,那么先将它的名字改为所属省份的境外输入;如果不是,那么直接将它的children(省内的城市)疫情数据添加到列表中,疫情城市数量加1.代码如下:

areaTree=data["areaTree"]

print(f'截至{data["lastUpdateTime"]},中国情况为:')

da=[]

i_city=0

item=input('请输入查询项目英文代码: (新增确诊-today_confirm,累计确诊-total_confirm,累计疑似-total_suspect, 累计死亡-total_dead,累计治愈-total_heal,总死亡率-total_deadRate, 总治愈率-total_healRate),例如:total_confirm ')N=input('请输入想查询前多少名城市?(300以内正整数,例如:20)')

for province in areaTree[0]["children"]:

if province["name"]=="北京"or province["name"]=="上海"or

province["name"]=="天津"or province["name"]=="重庆"or province["name"]=="香港"or province["name"]=="澳门"or province["name"]=="台湾":

i_city+=1

da.append([province["name"],province["today"]["confirm"],province["total"]["confirm"],province["total"]["suspect"],province["total"]["dead"],province["total"]["heal"],povince["total"]["deadRate"],province["total"]["healRate"]])

else:

for city in province["children"]:

i_city+=1

if city["name"]=="境外输入":

city["name"]=province["name"]+"境外输入"

da.append([city["name"],city["today"]["confirm"],city["total"]["confirm"],city["total"]["suspect"],city["total"]["dead"],city["total"]["heal"],city["total"]["deadRate"],city["total"]["healRate"]])

运行结果如图4所示

图4 输入提示

2.3 存储筛选后的数据

首先输出中国共有多少个城市出现确诊.然后将出现过确诊病例城市的疫情数据存到表格df中,表格的第1列是城市的名字,第2列是今日新增确诊人数,第3列是累计确诊人数,第4列是累计疑似人数……等等,然后用to_csv()函数将表格保存到文件中,文件名为“新冠肺炎各城市数据-最近的更新时间”,代码如下:

print(f'中国共{i_city}个城市出现确诊')

df=pd.DataFrame({})

df["name"]=[x[0]for x in da]

df["today_confirm"]=[x[1]for x in da]

df["total_confirm"]=[x[2]for x in da]

df["total_suspect"]=[x[3]for x in da]

df["total_dead"]=[x[4]for x in da ]

df["total_heal"]=[ x[5]for x in da ]

df["total_deadRate"]=[x[6]for x in da ]

df["total_healRate"]=[x[7]for x in da ]

df.to_csv(f'新冠肺炎各城市数据{data["lastUpdateTime"][:10]}.csv')

存储的内容如图5所示:

图5 存储的数据

2.4 数据排序

将出现过确认病例城市的疫情数据,用sort_values()函数将表格按照输入的要求(例如今日新增确诊人数today_confirm)进行从大到小排序,用reset_index()重置城市的索引号(例如陕西境外输入原来是14,重置之后变成了4),将前N个城市的疫情数据按序输出,代码如下:

N=int(N)

df=df.sort_values(item,ascending=False)

df=df.reset_index(drop=True)

df2=df[:N]

print(df2)

运行结果如图6所示:

图6 运行结果

2.5 可视化处理

绘制柱状图.柱状图的标题设置成最近一次更新的时间item(某项疫情数据例如今日新增确诊人数today_confirm)排名前N个城市.x轴的标题设置为城市,刻度值是城市名字.y轴坐标设为默认,刻度值为数字.柱状图的颜色为橘色,高度值为城市的某项疫情数据值,宽度为0.8.代码如下:

plt.title(f'截至{data["lastUpdateTime"][:N]}{item}前{N}城市')

ax1 = plt.gca()

ax1.set(xlabel='城市',ylabel='')

plt.xticks(range(len(df2["name"])),df2["name"])

plt.bar(range(len(df2["name"])),df2[item],width=0.8,color='orange')

plt.show()

图7 运行结果的柱状图

3 结果分析

由运行结果可知,今日国内新增确诊人数最多的前五个城市分别为:香港、台湾、上海、福建境外输入和陕西境外输入.其中香港人数最多,达到了80人之多,台湾新增确诊人数达到16人,其他三个城市(上海、福建境外输入和陕西境外输入)新增确诊人数分别为3,1,1.由此可推测,国内疫情控制基本稳定,以上这些城市(尤其香港和台湾)需要加大管控力度,并且建议国内人员出行要尽量避开这些高危城市,这样可以减少感染新冠肺炎的风险.

4 总 结

利用爬虫和可视化技术,我们可以实现网上数据的最大价值化.在大数据时代的今天,用户对各类数据的需求越来越多,对数据进行有效的分析,可以为相关决策提供依据,爬虫作为一种自动收集数据的手段,有广阔的应用[3].

猜你喜欢

柱状图爬虫网页
绘制和阅读降水量柱状图
利用网络爬虫技术验证房地产灰犀牛之说
基于Python的网络爬虫和反爬虫技术研究
基于Unity3D 的冒泡排序算法动态可视化设计及实现
基于CSS的网页导航栏的设计
利用爬虫技术的Geo-Gnutel la VANET流量采集
基于URL和网页类型的网页信息采集研究
大数据环境下基于python的网络爬虫技术
基于Android平台的柱状图组件的设计实现
网页制作在英语教学中的应用