python爬虫制作新型冠状病毒疫情地图-pyecharts1.7版本
作者:互联网
需知:
(1) pyecharts 1.0版本以上的地图制作和pyecharts1.0版本以下的地图制作不一样,更新pyechatrs后在低版本下的有些方法用不了,他们不是相互兼容的。这个疫情地图是在pyecharts1.7版本下制作的。
(2) pyecharts1.0版本以下制作疫情地图的请看我博客其他指定制作地图的内容。
背景流程:
1、通过python爬虫获取疫情信息数据;
2、python对疫情数据做处理;
3、绘制疫情地图。
1、爬虫获取数据:
爬取的疫情详情网页是:丁香园-丁香医生的疫情网页
网页地址:https://3g.dxy.cn/newh5/view/pneumonia_peopleapp
- 导包:
from bs4 import BeautifulSoup
from urllib.request import urlopen
bs4包是什么?
bs4就是BeautifulSoup,BeautifulSoup最主要的功能是从网页抓取数据。Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。
Beautiful Soup 是一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 的数据。
通俗的说就是:提取网页内容,给我们返回网页字符串,然后用接口将网页字符串生成一个对象,然后通过这个对象的方法来提取数据。
urlopen方法
urllib.request.urlopen()函数用于实现对目标url的访问。
- 导入urlopen函数,读取网页内容,如果网页中有中文要用“utf-8”解码
html = urlopen(
"https://3g.dxy.cn/newh5/view/pneumonia_peopleapp"
).read().decode('utf-8')
#获取html网页的源代码
bs= BeautifulSoup(html,"html.parser")
print(bs.body)
因为我们通过查看源码可知,我们需要的各个省份的疫情数据都在body标签里,所以我们查看body中的数据。
这样我们就从网页中获取到了我们要的疫情字符串。
2、对爬取到的疫情数据做处理:
①对源代码进行操作:
str1=bs.body.text
print(str1) #输出可以看到body字符串中的所有内容
#查找字符串中指定国内省份对应数据的关键字,进行截取
str1=str1[str1.find('window.getAreaStat = '):]
data = str1[str1.find('[{'):str1.find('}catch')]
data_list=eval(data) #字符串转字典数组
print(type(data_list)) #查看类型
print(data_list)
这里截取字符串,要根据字符串中指定的关键字进行截取。
str1=str1[str1.find('window.getAreaStat = '):]
我们需要的国内各省份的现存确诊数据在以下这个字符串中:print(str1)可以看到。
data = str1[str1.find('[{'):str1.find('}catch')]
这句的意思是在str1这个字符串中查找从“[{” 开始到 “}catch” 之间的字符串,找到后赋值给data
eval
是将字符串转化为字典数组
②定义两个字典,用来存放省份确诊数据:
new_dict
代表现存确诊
new_dict1
代表总确诊
new_dict={} #省份现存确诊数
new_dict1={} #省份确诊数
③遍历数据,获取确诊与现存确诊:
#循环遍历data_list取数据{省份:确诊数}
for province in data_list:
#将省份现存确诊数放入new_dict字典中,处理不合格的省份名称replace
new_dict[province['provinceName'].replace('自治区','').replace('回族','').replace('维吾尔','').replace('省','').replace('市','').replace('壮族','')] = province['currentConfirmedCount']
#省份确诊数
new_dict1[province['provinceName'].replace('自治区','').replace('回族','').replace('维吾尔','').replace('省','').replace('市','').replace('壮族','')] = province['confirmedCount']
print(new_dict)
print(new_dict1)
通过查看源码,对比实时数据可知
currentConfirmedCount
指的是现存确诊数,
confirmedCount
代表的是总确诊数。
这里还用到了replace()
方法,目的是为了将不合格的省份名称进行替换。因为我们用的map
制作地图时,对省份名称是很严格的,如果名称不统一会导致对应数据显示不出来的结果。
查看确诊与现存确诊的部分数据如下:
3、制作中国省份-新冠肺炎疫情地图
中国省份疫情现存确诊图:
1、导包:
from pyecharts.charts import Map,Geo
from pyecharts import options as opts
from pyecharts.globals import ThemeType#主题
2、地图代码详情:
'''
pyecharts 1.7版本map写法
中国省份现存确诊
'''
province=list(new_dict.keys()) #将字典中的省份key以列表的形式取出来
values=list(new_dict.values()) #将字典中确诊数values以列表形式取出来
list1 = [[province[i],values[i]] for i in range(len(province))] #此处用到了列表生成式
map_1 = Map() #Map()中,init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC)设置主题,bg_color="#EBEBEB"设置地图背景颜色
map_1.set_global_opts(
title_opts=opts.TitleOpts(title="中国nCoV肺炎疫情现存确诊",pos_left="left"),
# visualmap_opts=opts.VisualMapOpts(max_=50),#最大数据范围
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True, # 设置是否为分段显示
# 自定义的每一段的范围,以及每一段的文字,以及每一段的特别的样式。例如:
pieces=[
{"max":0,"label":"0人","color":"#FFFFFF"},
{"min":1,"max":9,"label":"1-10人","color":"#FFEBCD"},
{"min":10,"max":99,"label":"10-99人","color":"#FFA07A"},
{"min":100,"max":499,"label":"100-499人","color":"#FF4040"},
{"min":500,"max":999,"label":"500-999人","color":"#CD2626"},
{"min":1000,"max":10000,"label":"1000-10000人","color":"#B22222"},
{'min':10000,"label":">10000人","color":"#8B1A1A"} #不指定 max,表示 max 为无限大
] )
)
map_1.add("中国现存确诊数据", list1, maptype="china", is_map_symbol_show=False)#is_map_symbol_show设置是否显示地图上的小红点
map_1.render("G:/中国地图-现存确诊.html")
上面代码中用到了列表生成式,不懂的可以查看我博客中关于列表生成式的讲解。
is_piecewise=True, # 设置是否为分段显示(数据&颜色,不同区间数据显示不同颜色)
visualmap_opts=opts.VisualMapOpts(max_=50) # 设置为连续显示,max为最大值,颜色显示是渐变的。
is_map_symbol_show=False 设置不要在地图上显示小红点
效果如下:
中国省份疫情累计确诊图:
province1=list(new_dict1.keys()) #将字典中的省份key以列表的形式取出来
values1=list(new_dict1.values()) #将字典中确诊数values以列表形式取出来
list2 = [[province1[i],values1[i]] for i in range(len(province1))] #次处用到了列表生成式
map_2 = Map() #Map()中,init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC)设置主题,bg_color="#EBEBEB"设置地图背景颜色
map_2.set_global_opts(
title_opts=opts.TitleOpts(title="中国nCoV肺炎疫情确诊图",pos_left="left"),
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True, # 设置是否为分段显示
# 自定义的每一段的范围,以及每一段的文字,以及每一段的特别的样式。例如:
pieces=[
{"max":0,"label":"0人","color":"#FFFFFF"},
{"min":1,"max":9,"label":"1-10人","color":"#FFEBCD"},
{"min":10,"max":99,"label":"10-99人","color":"#FFA07A"},
{"min":100,"max":499,"label":"100-499人","color":"#EE5C42"},
{"min":500,"max":999,"label":"500-999人","color":"#CD3333"},
{"min":1000,"max":10000,"label":"1000-10000人","color":"#A52A2A"},
{'min':10000,"label":">10000人","color":"#8B0000"} #不指定 max,表示 max 为无限大
] )
)
map_2.add("中国确诊数据", list2, maptype="china", is_map_symbol_show=False)#is_map_symbol_show设置是否显示地图上的小红点
map_2.render("G:/中国地图-确诊.html")
效果如下:
对照丁香园网页实时数据:
以上就是简单爬取数据制作的疫情地,欢迎各位大神指教。
如果想看世界地图或者省份地图可以关注我其他博客内容。
标签:map,确诊,冠状病毒,python,max,str1,color,opts,pyecharts1.7 来源: https://blog.csdn.net/qq_39783601/article/details/104778829