python爬虫制作新型冠状病毒疫情地图-pyecharts1.7版本

需知:

(1) pyecharts 1.v版本以上的地图制作和pyecharts1.v版本以下的地图制作不一样,更新pyechatrs后在低版本下的有些方法用不了,他们不是相互兼容的。这个疫情地图是在pyecharts1.7版本下制作的。
(2) pyecharts1.v版本以下制作疫情地图的请点击这里查看制作地图的内容。

背景流程:

1、通过python爬虫获取疫情信息数据;
2、python对疫情数据做处理;
3、绘制疫情地图。

1、爬虫获取数据:

爬取的疫情详情网页是:丁香园-丁香医生的疫情网页
网页地址:https://3g.dxy.cn/newh5/view/pneumonia_peopleapp

  1. 导包:
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的访问。

  1. 导入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")

效果如下:
在这里插入图片描述
对照丁香园网页实时数据:
在这里插入图片描述
以上就是简单爬取数据制作的疫情地,欢迎各位大神指教。
如果想看世界地图或者省份地图可以关注我其他博客内容。

发布了49 篇原创文章 · 获赞 76 · 访问量 2690

猜你喜欢

转载自blog.csdn.net/qq_39783601/article/details/104778829