爬取全球疫情数据并使用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)

添加新评论