爬取全球疫情数据并使用pyecharts可视化
warning:
这篇文章距离上次修改已过977天,其中的内容可能已经有所变动。
# -*- coding:utf-8 -*-
import requests
import json
import re
import pandas as pd
import time
from pyecharts import options as opts
from pyecharts.charts import Bar, Page,Pie,Line,Timeline,Grid,Map
from pyecharts.commons.utils import JsCode
def sleeptime(hour, min, sec): # 时间转换
return hour * 3600 + min * 60 + sec
def Get_HTML():
headers = {'User-Agent': 'Mozilla/5.0'}
url = 'https://m.look.360.cn/events/feiyan?sv=&version=&market=&device=2&net=4&stype=&scene=&sub_scene=&refer_scene=&refer_subscene=&f=jsonp&location=true&sort=2&_=1649252949072&callback=jsonp2'
try:
r = requests.get(url, headers=headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
re = r.text[7:-2]
response = json.loads(re)
return response
except:
print("error!")
def China_data_Total():
url='http://m.look.360.cn/subject/400?sign=360_6aa05217'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0'}
html = requests.get(url, headers=headers).text
pattern=re.compile('"qcmsint1":"0"},"feiyanTrend":(.*),"local":',re.S)
item=re.findall(pattern,html)
response=json.loads(item[0])
data = {
"截止日期":response['total']['modifyTime'],
"现存确诊":response['total']['currentConfirmed'],
"境外输入":response['total']['overseasInput'],
"现存无症状":response['total']['asymptom'],
"累计确诊":response['total']['diagnosed'],
"累计治愈":response['total']['cured'],
"累计死亡":response['total']['died'],
"现存_较昨日":response['newDiff']['currentConfirmed'],
"境外输入_较昨日":response['newDiff']['overseasInput'],
"无症状_较昨日":response['newDiff']['asymptom'],
"累计_较昨日":response['newDiff']['diagnosed'],
"治愈_较昨日":response['newDiff']['cured'],
"死亡_较昨日":response['newDiff']['died']
}
return data
def China_data(response): # 国内数据
C_name, Ljqz, Cured, Died, Xcqz, Xzqz = [], [], [], [], [], []
for i in range(34):
c_name = response['data'][i]['city'] # 城市名称
ljqz = response['data'][i]['diagnosed'] # 累计确诊
cured = response['data'][i]['cured'] # 治愈
died = response['data'][i]['died'] # 死亡
xcqz = response['data'][i]['currentConfirmed'] # 现存确诊
xzqz = response['data'][i]['diffDiagnosed'] # 新增确诊
C_name.append(c_name)
Ljqz.append(ljqz)
Cured.append(cured)
Died.append(died)
Xcqz.append(xcqz)
Xzqz.append(xzqz)
data = {
"地区": C_name,
"新增确诊": Xzqz,
"现存确诊": Xcqz,
"累计确诊": Ljqz,
"治愈人数": Cured,
"死亡人数": Died
}
return data
def Abroad_data(response): # 国外数据
C_name, Ljqz, Cured, Died, Xcqz, Xzqz = [], [], [], [], [], []
for i in range(196):
c_name = response['country'][i]['provinceName'] # 城市名称
ljqz = response['country'][i]['diagnosed'] # 累计确诊
cured = response['country'][i]['cured'] # 治愈
died = response['country'][i]['died'] # 死亡
xzqz = response['country'][i]['diffDiagnosed'] # 新增确诊
C_name.append(c_name)
Ljqz.append(ljqz)
Cured.append(cured)
Died.append(died)
Xzqz.append(xzqz)
data = {
"地区": C_name,
"新增确诊": Xzqz,
"累计确诊": Ljqz,
"治愈人数": Cured,
"死亡人数": Died
}
return data
def View(data_1, data_2): # 可视化
# 柱状图
area_color_js = (
"new echarts.graphic.LinearGradient(0, 0, 0, 1, "
"[{offset: 0, color: '#7bbfea'}, {offset: 1, color: '#3fbbff0d'}], false)"
)
t_1 = Timeline()
t_1.add_schema(play_interval=1000,
label_opts=opts.series_options.LabelOpts( color='#cfe2f3'))
for i in range(len(data_1['地区'])):
c_1 = (
Bar(init_opts=opts.InitOpts(width="300px",height='300px'))
.add_xaxis(['新增确诊','现存确诊','累计确诊','治愈人数','死亡人数'],)
.add_yaxis("",[data_1['新增确诊'][i],data_1['现存确诊'][i],data_1['累计确诊'][i],data_1['治愈人数'][i],data_1['死亡人数'][i]],
color='#44cef6',)
.reversal_axis()
.set_global_opts(
title_opts=opts.TitleOpts(" (地区: {} )".format(data_1['地区'][i]),title_textstyle_opts=opts.TextStyleOpts(color="#cfe2f3")),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='white')),#调整x轴字体颜色
yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='white'))
)
)
t_1.add(c_1, "{}".format(data_1['地区'][i]))
# 柱状图
t_2 = Timeline()
t_2.add_schema(play_interval=1000,
label_opts=opts.series_options.LabelOpts(color='#cfe2f3'))
for i in range(len(data_2['地区'])):
c_2 = (
Bar()
.add_xaxis(['新增确诊', '累计确诊', '治愈人数', '死亡人数'], )
.add_yaxis("", [data_2['新增确诊'][i], data_2['累计确诊'][i], data_2['治愈人数'][i],data_2['死亡人数'][i]],
label_opts=opts.LabelOpts(position="right"),
color='#44cef6', )
.reversal_axis()
.set_global_opts(
title_opts=opts.TitleOpts(" (国家: {} )".format(data_2['地区'][i]),pos_right='0',title_textstyle_opts=opts.TextStyleOpts(color="#cfe2f3")),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='white',)), # 调整x轴字体颜色
yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='white'),position='right')
)
)
t_2.add(c_2, "{}".format(data_2['地区'][i]))
# 饼图
# 转换数据为类型,#转换后数据为['美国', 1010774]
# data_pair = [list(z) for z in zip(x_data, y_data)] # 转换后数据为['美国', 1010774]
c_3 = (
Line()
.add_xaxis(data_2['地区'])
.add_yaxis(
series_name="新增确诊",
y_axis=data_2['新增确诊'],
label_opts=opts.LabelOpts(is_show=False,),
)
.add_yaxis(
series_name="累计确诊",
y_axis=data_2['累计确诊'],
label_opts=opts.LabelOpts(is_show=False,),
)
.add_yaxis(
series_name="治愈人数",
y_axis=data_2['治愈人数'],
label_opts=opts.LabelOpts(is_show=False,),
)
.add_yaxis(
series_name="死亡人数",
y_axis=data_2['死亡人数'],
label_opts=opts.LabelOpts(is_show=False,),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="国外疫情数据",pos_right='0',title_textstyle_opts=opts.TextStyleOpts(color="#cfe2f3")),
datazoom_opts=opts.DataZoomOpts(),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='white', )), # 调整x轴字体颜色
yaxis_opts=opts.AxisOpts(
position='right',
axistick_opts=opts.AxisTickOpts(is_show=True,),
splitline_opts=opts.SplitLineOpts(is_show=True),
axislabel_opts=opts.LabelOpts(color='white')
),
)
)
c_5 = ( #地图
Map()
.add("累计确诊", [['河南', 2840], ['香港', 308175], ['吉林', 37712] , ['台湾', 27410], ['上海', 11366], ['浙江', 2819], ['福建', 2905],['山东', 2646], ['黑龙江', 2505], ['广东', 6681], ['四川', 1948], ['辽宁', 1604], ['河北', 1981], ['江苏', 2083], ['广西', 1518], ['北京', 1821], ['海南', 243], ['山西', 350], ['陕西', 3247], ['天津', 1798], ['云南', 2079], ['安徽', 1054], ['江西', 1063], ['湖南', 1335], ['青海', 43], ['内蒙古', 1687],['重庆',2423], ['贵州', 178], ['湖北', 68392], ['甘肃', 681], ['新疆', 999], ['宁夏', 122], ['澳门', 82], ['西藏', 1]], "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="国内现存确诊",title_textstyle_opts=opts.TextStyleOpts(color="#cfe2f3")),visualmap_opts=opts.VisualMapOpts(max_=10000))
)
data = China_data_Total()
c_6 = (
Pie(init_opts=opts.InitOpts())
.set_global_opts(
title_opts=opts.TitleOpts(
title="现存确诊:" + str(data['现存确诊']) + " " * 5 + "境外输入:" + str(data['境外输入']) + " " * 5 + "现存无症状:" + str(
data['现存无症状']), title_textstyle_opts=opts.TextStyleOpts(font_size=15, color="#ffb3a7"), ))
)
c_7 = (
Pie(init_opts=opts.InitOpts())
.set_global_opts(
title_opts=opts.TitleOpts(
title="累计确诊:" + str(data['累计确诊']) + " " * 5 + "累计治愈:" + str(data['累计治愈']) + " " * 5 + "累计死亡:" + str(
data['累计死亡']), title_textstyle_opts=opts.TextStyleOpts(font_size=15, color="#ffb3a7"), ))
)
c_8 = (
Pie(init_opts=opts.InitOpts())
.set_global_opts(
title_opts=opts.TitleOpts(
title="较昨日:" + str(data['现存_较昨日']) + " " * 25 + "较昨日:" + str(data['境外输入_较昨日']) + " " * 25 + "较昨日:" + str(
data['无症状_较昨日']), title_textstyle_opts=opts.TextStyleOpts(font_size=10, color="#e9e7ef"), ))
)
c_9 = (
Pie(init_opts=opts.InitOpts())
.set_global_opts(
title_opts=opts.TitleOpts(
title="较昨日:" + str(data['累计_较昨日']) + " " * 25 + "较昨日:" + str(data['治愈_较昨日']) + " " * 25 + "较昨日:" + str(
data['死亡_较昨日']), title_textstyle_opts=opts.TextStyleOpts(font_size=10, color="#e9e7ef"), ))
)
c_10 = ( # 地图
Map()
.add("死亡人数",[['河南', 22], ['香港', 8827], ['吉林', 5], ['台湾', 854], ['上海', 7], ['浙江', 1], ['福建', 1], ['山东', 7], ['广东', 8], ['黑龙江', 13], ['四川', 3], ['江苏', 0], ['河北', 7], ['辽宁', 2], ['广西', 2], ['北京', 9], ['海南', 6], ['山西', 0], ['陕西', 3], ['云南', 2], ['安徽', 6], ['湖南', 4], ['江西', 1], ['天津', 3], ['青海', 0], ['内蒙古', 1], ['重庆', 6], ['贵州', 2], ['湖北', 4512], ['甘肃', 2], ['新疆', 3], ['宁夏', 0], ['澳门', 0], ['西藏', 0]], "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="国内各地死亡人数", title_textstyle_opts=opts.TextStyleOpts(color="#cfe2f3")),
visualmap_opts=opts.VisualMapOpts(max_=10000))
)
tu_1 = (
Line(init_opts=opts.InitOpts(width="1500px",
height="850px",
bg_color={"type": "pattern", "image": JsCode("img"), "repeat": "no-repeat"}))
.add_xaxis([None])
.add_yaxis("", [None])
.set_global_opts(
title_opts=opts.TitleOpts(),
yaxis_opts=opts.AxisOpts(is_show=False),
xaxis_opts=opts.AxisOpts(is_show=False))
)
tu_1.add_js_funcs(
"""
var img = new Image(); img.src = './images/bg_body.jpg';
"""
)
tu_2 = (
Line(init_opts=opts.InitOpts(width="600px",
height="700px",
bg_color={"type": "pattern", "image": JsCode("img"), "repeat": "no-repeat"}))
.add_xaxis([None])
.add_yaxis("", [None])
.set_global_opts(
title_opts=opts.TitleOpts(
pos_left='center',
title_textstyle_opts=opts.TextStyleOpts(font_size=25, color='#51c2d5'),
pos_top='5%'),
yaxis_opts=opts.AxisOpts(is_show=False),
xaxis_opts=opts.AxisOpts(is_show=False))
)
tu_2.add_js_funcs(
"""
var img = new Image(); img.src = './images/data_icon.png';
"""
)
tu_3 = (
Line(init_opts=opts.InitOpts(width="1500px",
height="200px",
bg_color={"type": "pattern", "image": JsCode("img"), "repeat": "no-repeat"}))
.add_xaxis([None])
.add_yaxis("", [None])
.set_global_opts(
title_opts=opts.TitleOpts(title="全球疫情信息 截至"+data['截止日期'],
pos_left='center',
title_textstyle_opts=opts.TextStyleOpts(font_size=21, color='#51c2d5'),
pos_top='5%'),
yaxis_opts=opts.AxisOpts(is_show=False),
xaxis_opts=opts.AxisOpts(is_show=False))
)
tu_3.add_js_funcs(
"""
var img = new Image(); img.src = './images/bg_title.png';
"""
)
# page = Page(layout=Page.DraggablePageLayout, page_title="模拟")
# page.add(tu_1,t_1, t_2, c_3,c_5,c_6,c_7,c_8,c_9,tu_2,tu_3,c_10)
# page.render('全球疫情信息.html')
# 固定样式
Page.save_resize_html(source="全球疫情信息.html", # 上面的HTML文件名称
cfg_file="chart_config.json", # 保存的json配置文件
dest="new_全球疫情信息.html" # 新HTML文件名称,可以空缺,默认resize_render.html
)
def main():
second = sleeptime(5, 0, 0) # 设置时间
data_1 = China_data(Get_HTML()) # 国内数据
data_2 = Abroad_data(Get_HTML()) # 国外数据
data_11 = pd.DataFrame(data_1)
data_22 = pd.DataFrame(data_2)
while True:
data_11.to_csv('./国内疫情数据.csv')
data_22.to_csv('./国外疫情数据.csv')
View(data_1, data_2)
time.sleep(second)
# main()
data_1 = China_data(Get_HTML()) # 国内数据
data_2 = Abroad_data(Get_HTML()) # 国外数据
data_11 = pd.DataFrame(data_1)
data_22 = pd.DataFrame(data_2)
# data_11
# data_22
View(data_1,data_2)
# print(data_1)