基于Python爬虫的疫情数据可视化系统实践-20200531
要求:
1.阅读index.html的内容,其中需要生成提前4个文件,分别为
world1.html世界疫情地图(上午课上讲的内容)
world2.html世界疫情前15国家柱状图(每个国家显示新增病例和新增死亡病例)
china1.html中国疫情地图
china2.html中国疫情前6个省,现存病例的饼状图
2.以上4个文件可在浏览器上访问,或下载后在本机访问。截图形成4个图标,名字分别为
world1.png、world2.png、china1.png、china2.png
3.将上述9个文件组织起来,通过index.html显示系统的主界面。
全国疫情
全国疫情地图
1.导入python库
import requests
import jsonpath
import json
import pyecharts
from pyecharts.charts import Map
from pyecharts import options as opts
# from countries_ch_to_en import countries_dict
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
# Bar - Bar_rotate_xaxis_label
# http://gallery.pyecharts.org/#/Bar/bar_rotate_xaxis_label
2.目标网站 来自腾讯新闻
#url=\'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist\'
url = \'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5\'
3.发送网络请求
resp=requests.get(url)
#print("data=",resp.text)
4.提取数据 类型转换 json–>dict
data=json.loads(resp.text)
# print("data=",data)
data = json.loads(data[\'data\'])
date = jsonpath.jsonpath(data,"$..lastUpdateTime") #时间
#print("date:",date)
#print("data=",data)
data = data[\'areaTree\']
#print("data=",data)
#data = data[\'children\']
#print("data=",data)
- 中国数据原始:
- 中国省份数据:
5.将每个国家的疫情数据提取出来,包括国家名称、确诊人数、死亡人数、报告日期等等,保存在数组
name = jsonpath.jsonpath(data,"$[*].children[*].name")
confirm = jsonpath.jsonpath(data,"$[*].children[*].total..confirm")
dead = jsonpath.jsonpath(data,"$[*].children[*].total..dead")
print("data1=",name)
print("data2=",confirm)
print("data3=",dead)
print("data4=",date)
#print("date_Min,date_Max=",min(date),max(date))
#date_Max=max(date)
6.将数据按照绘图模块的格式要求将数组打包
data_zip = zip(name,confirm)
data_list=list(data_zip)
print("data3=",data_list)
#时间数据特殊处理一下
#date_string="2020."+str(date_Max)
7.使用pyechart模块将疫情数据绘制在世界地图上
# 生成一个Map类的对象map
map = Map()
#向map对象添加数据
map.add(str(date)+" 全国疫情数据分布", data_list, maptype="china")
# 设置显示的参数,连续型显示
map.set_global_opts(title_opts=opts.TitleOpts(title="全国确诊病例数据"), visualmap_opts=opts.VisualMapOpts(max_=1000))
map.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
8.绘图
# 疫情数据生成html网页格式呈现
map.render("China1.html")
# 疫情数据生成jupyter notebook内部的网页格式呈现
map.load_javascript()
#map.render_notebook()
# wolrd_data()
- 在另一个cell中
map.render_notebook()
- 绘图结果:
全国疫情饼状图
nowConfirm = jsonpath.jsonpath(data,"$[*].children[*].total..nowConfirm")
# 将数据按照绘图模块的格式要求将数组打包
data5_zip = zip(name,nowConfirm)
data5_list=list(data5_zip)
print("data5=",data5_list[0:5])
from pyecharts.charts import Pie
from pyecharts import options as opts
from pyecharts.globals import ThemeType
data5_list.sort(reverse=True,key=lambda x:x[1])
pie = Pie(init_opts = opts.InitOpts())
pie.add(str(date)+"全国现存确诊疫情饼状图", data5_list[0:5])
pie.render("China2.html")
pie.load_javascript()
pie.render_notebook()
- 绘图结果:
世界疫情
世界疫情图
2.目标网站 来自腾讯新闻
url=\'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist\'
3.发送网络请求
resp=requests.get(url)
#print("data=",resp.text)
4.提取数据 类型转换 json–>dict
data=json.loads(resp.text)
#print("data=",data)
- 世界地图原始:
5.将每个国家的疫情数据提取出来,包括国家名称、确诊人数、死亡人数、报告日期等等,保存在数组
name = jsonpath.jsonpath(data,"$..name")
confirm = jsonpath.jsonpath(data,"$..confirm")
dead = jsonpath.jsonpath(data,"$..dead")
date = jsonpath.jsonpath(data,"$..date")
newConfirm = jsonpath.jsonpath(data,"$..confirmAdd")
#print("data1=",name)
#print("data2=",confirm)
print("date_Min,date_Max=",min(date),max(date))
date_Max=max(date)
补充中国的数据
# 2.目标网站 来自腾讯新闻
#url=\'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist\'
url1 = \'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5\'
# 3.发送网络请求
resp1=requests.get(url1)
#print("data=",resp.text)
# 4.提取数据 类型转换 json-->dict
datac=json.loads(resp1.text)
datac = json.loads(datac[\'data\'])
datec = jsonpath.jsonpath(datac,"$..lastUpdateTime") #时间
#print("data=",datac)
cConfirm = jsonpath.jsonpath(datac,"$..chinaTotal..confirm")
cDead = jsonpath.jsonpath(datac,"$..chinaTotal..dead")
cnewConfirm = jsonpath.jsonpath(datac,"$..chinaAdd..confirm")
cnewDead = jsonpath.jsonpath(datac,"$..chinaAdd..confirm")
print("cConfirm:",cConfirm)
print("cnewConfirm:",cnewConfirm)
print("cDead:",cDead)
6.将数据按照绘图模块的格式要求将数组打包
data_zip = zip(name,confirm)
data_list=list(data_zip)
data_list.append((\'中国\', cConfirm))
#print(data_list)
#print("data3=",data_list)
#时间数据特殊处理一下
date_string="2020."+str(date_Max)
7.使用pyechart模块将疫情数据绘制在世界地图上
# 生成一个Map类的对象map
map = Map()
#向map对象添加数据
map.add(date_string+" 全球疫情数据分布", data_list, maptype="world", name_map=countries_dict)
# 设置显示的参数,连续型显示
map.set_global_opts(title_opts=opts.TitleOpts(title="全球全部确诊病例数据"), visualmap_opts=opts.VisualMapOpts(max_=140000))
map.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
8.绘图
# 疫情数据生成html网页格式呈现
map.render("world1.html")
# 疫情数据生成jupyter notebook内部的网页格式呈现
map.load_javascript()
# wolrd_data()
- 另一个cell
map.render_notebook()
- 绘图结果:
全球新增确诊和死亡人数柱状图
data3_list=list(zip(name,newConfirm,dead))
data3_list.append((\'中国\', cnewConfirm[0],cDead[0]))
print(data3_list[-5:])
data3_list.sort(reverse=True,key=lambda x:x[1])
from pyecharts.charts import Bar
bar=Bar()
number=15
countrys=[]
values=[]
deads=[]
MaxValue=0
# for i in range(len(all_data)):
for i in range(number):
u = data3_list[i]
countrys.append(u[0])
values.append(u[1])
deads.append(u[2])
bar.add_xaxis(countrys)
bar.add_yaxis("新增确诊", values)
bar.add_yaxis("死亡", deads)
bar.set_global_opts(
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-60)),
title_opts=opts.TitleOpts(title=date_string+"全球疫情前"+str(number)+"个国家", subtitle="新增确诊和死亡病例"),
)
bar.render("world2.html")
bar.render_notebook()
- 绘图结果:
index.html文件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>疫情可视化系统</title>
</head>
<body>
<p><h2 style="color:#fff000;">--------基于Python爬虫的疫情数据可视化系统(xx)--------</h2></p>
<table width="820" border="0">
<tr>
<td style="background-color:#eeeeee;width:250px;width:400px;vertical-align:top;">
<b>全球疫情地图</b>
<a href="http://ci.jinmensuyin.com/user/201712300020/files/20200531/world1.html?_xsrf=2%7C55b64f9e%7C02ba08c5ec7be9f551b77d0531315ec8%7C1590286606" >
<img border="0" src="http://ci.jinmensuyin.com/user/201712300020/files/20200531/world1.png?_xsrf=2%7C55b64f9e%7C02ba08c5ec7be9f551b77d0531315ec8%7C1590286606" alt="世界地图1" width="400" height="230"></a>
</td>
<td style="background-color:#eeeeee;height:250px;width:400px;vertical-align:top;">
<b>全球疫情柱状图</b>
<a href="http://ci.jinmensuyin.com/user/201712300020/files/20200531/world2.html?_xsrf=2%7C55b64f9e%7C02ba08c5ec7be9f551b77d0531315ec8%7C1590286606" >
<img border="0" src="http://ci.jinmensuyin.com/user/201712300020/files/20200531/world2.png?_xsrf=2%7C55b64f9e%7C02ba08c5ec7be9f551b77d0531315ec8%7C1590286606" alt="世界地图2" width="400" height="230"></a>
</td>
</tr>
<tr>
<td style="background-color:#eeeeee;width:250px;width:400px;vertical-align:bottom;">
<b>中国疫情地图</b>
<a href="http://ci.jinmensuyin.com/user/201712300020/files/20200531/China1.html?_xsrf=2%7C55b64f9e%7C02ba08c5ec7be9f551b77d0531315ec8%7C1590286606">
<img border="0" src="http://ci.jinmensuyin.com/user/201712300020/files/20200531/China1.png?_xsrf=2%7C55b64f9e%7C02ba08c5ec7be9f551b77d0531315ec8%7C1590286606" alt="中国地图1" width="400" height="230"></a>
</td>
<td style="background-color:#eeeeee;height:250px;width:400px;vertical-align:bottom;">
<b>中国疫情饼状图</b>
<a href="http://ci.jinmensuyin.com/user/201712300020/files/20200531/China2.html?_xsrf=2%7C55b64f9e%7C02ba08c5ec7be9f551b77d0531315ec8%7C1590286606">
<img border="0" src="http://ci.jinmensuyin.com/user/201712300020/files/20200531/China2.png?_xsrf=2%7C55b64f9e%7C02ba08c5ec7be9f551b77d0531315ec8%7C1590286606" alt="中国地图2" width="400" height="230"></a>
</td>
</tr>
</table>
</body>
</html>
- 运行结果:
![]()
注意事项
- 先install pyecharts
pip install pyecharts
- index文件的图片和链接用DownLoad Link
- 注意jsonpath.jsonpath路径匹配问题
confirm = jsonpath.jsonpath(data,"$[*].children[*].total..confirm")
表示根节点的第一层子节点中所有的children子节点,的下一层子节点中的所有total子节点中的所有confirm结点
参考:https://www.cnblogs.com/qiaoyeye/p/5236103.html
- 先上传四个截图,再复制链接
- 在本地用记事本打开index.html文件,修改里面的图片路径和要链接到的路径(四个html)
- 上传index.html文件到jupyter上
遇到的问题及解决方法
- 画的图显示不出来
- 因为jupyterLab和jupyterNoteBook不一样,Lab需要环境声明
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
* 并且在画图时,先map.load_javascript(),再在另个一cell里map.render_notebook()
* 参考:http://pyecharts.org/#/zh-cn/notebook?id=jupyter-lab