50 行代码获取疫情实时数据,发送可视化图表到邮箱

本贴最后更新于 1568 天前,其中的信息可能已经天翻地覆

50行代码获取疫情实时数据,发送可视化图表到邮箱

前言:

近期受新冠病毒疫情影响,很多小伙伴还没有复工,而且是现在是疫情爆发的危险期,专家也呼吁大家尽量不要出门,虽然每天在家,但是我们还是每天密切的关注疫情的情况,希望疫情能够及早得到控制。作为一个程序员,在家里也闲不住。于是想着通过python来获取疫情的实时数据,生成可视化图表发送到邮箱,如果你也感兴趣,那么请往下看,下面有详细的教程(并附上了完整的代码),总的说来三步即可完成,除开注释,总计代码也就50来行

实现步骤:

第一步:数据获取
第二步:生成可视化图表
第三步:发送到邮箱

环境准备:

1、安装python
2、安装需要使用的python的第三方库

打开cmd命令终端,分别输入以下三条命令即可进行在线安装

pip install requests
pip install jsonpath
pip install pyecharts

数据获取

关于疫情的实时数据获取,我们可以通过爬虫直接去爬取(百度、腾讯、阿里)疫情数据平台上的实时数据。这边小编选择的爬取腾讯的实时数据。

腾讯的疫情实时数据展示平台的地址是:https://news.qq.com/zt2020/page/feiyan.htm
经过对页面数据进行分析,小编发现实时疫情数据是通过ajax进行传输的。通过抓包,找到了提供疫情数据的接口地址。

单个省份的数据地址
"https://api.inews.qq.com/newsqa/v1/query/pubished/daily/list?province=省份名"
例如
湖北省的实时数据地址
url = "https://api.inews.qq.com/newsqa/v1/query/pubished/daily/list?province=湖北"
湖南省的实时数据地址
url = "https://api.inews.qq.com/newsqa/v1/query/pubished/daily/list?province=湖南"

单个城市的数据
"https://api.inews.qq.com/newsqa/v1/query/pubished/daily/list?province=省份名&city=城市"

例如
湖北武汉的实时数据地址
url = "https://api.inews.qq.com/newsqa/v1/query/pubished/daily/list?province=湖北&city=武汉"
湖南长沙的实时数据地址
url = "https://api.inews.qq.com/newsqa/v1/query/pubished/daily/list?province=湖南&city=长沙"

知道了实时数据的地址,那么接下来通过python来获取数据就非常简单了,只需要几行代码,以湖北的数据为例,具体代码如下:

import requests
# 数据url地址
url = "https://api.inews.qq.com/newsqa/v1/query/pubished/daily/list?province=湖北"
# 发送请求获
response = requests.get(url=url)
# 获取返回的数据
data = response.json()["data"]
print(data)

运行上面代码我们就能过获取到湖北省1.20到今天所有疫情的数据,结果如下:

image.png

数据可视化

通过上面的代码,我们能够获取到,湖北的疫情数据,包含了确诊总数,死亡人数,治愈人数,新增确诊人数。那么接下来我们要将获取到的数据,生成可视化的折线图。具体代码如下

"""这里是上面数据获取代码,已省略!"""
#  数据可视化展示
import jsonpath
import pyecharts
# 提取数据中的日期
date = jsonpath.jsonpath(data,"$..date")
# 提取确诊人数
confirm = jsonpath.jsonpath(data,"$..confirm")
# 提取死亡人数
dead= jsonpath.jsonpath(data,"$..dead")
# 提取治愈人数
heal = jsonpath.jsonpath(data,"$..heal")
# 提取新增人数
confirm_add = jsonpath.jsonpath(data,"$..confirm_add")
# 创建一个折线图
line = pyecharts.charts.Line()
line.add_xaxis(date) # 设置x轴的数据(前面获取的时间)
line.add_yaxis("确诊", confirm)
line.add_yaxis("治愈", heal)
line.add_yaxis("死亡", dead)
line.add_yaxis("新增", confirm_add)
# 设置图表的标题
opts=pyecharts.options.TitleOpts(title="湖北地区", subtitle="确诊人数病例图")
line.set_global_opts(title_opts=opts)
# 默认会在当前目录生成 render.html文件,图表就在这个文件中
line.render()

运行上述代码,就可以根据前面获取到的数据生成一个可视化的折线图(可根据下面图表上方的标识来选择隐藏或显示数据项),如下:

image.png

发送可视化图表到邮箱

关于使用python发送邮件,我们柠檬班的公开课里之前有讲过,这边就不再一一详细介绍了。大家可以关注公众号,滴滴客服获取免费的教学视频。下面我直接附上发送邮件的代码(注意:下面代码需要自己修改邮箱账号,授权码,发件人,收件人才可运行)

"""这里是上面数据获取,生成图表的代码,已省略!"""
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication

# 第一步:连接到smtp服务器
smtp = smtplib.SMTP_SSL(host="smtp.qq.com",port=465)
# 第二步:登录服务器
smtp.login("邮箱账号","授权码")

# 第三步:准备邮件
# 1、读取报告文件中的内容
file_content = open("render.html","rb").read()
# 2、构造邮件
msg = MIMEMultipart()
text_msg = MIMEText("疫情确诊病例图", _subtype='plain', _charset="utf8")
msg.attach(text_msg)
file_msg = MIMEApplication(file_content)
file_msg.add_header('content-disposition', 'attachment', filename='render.html')
msg.attach(file_msg)
# 3、添加发件人,收件人,邮件主题
msg["From"] = "发件人邮箱"
msg["To"] = "收件人邮箱"
msg["Subject"] = "主题:疫情实时数据"

print(msg)
# 第四步: 发送邮件
smtp.send_message(msg,from_addr="发件邮箱账号",to_addrs="收件邮箱账号")

那么到这里我们就可以实现通过python自动获取实时的疫情数据,生成可视化图表发送到邮箱了。小编将上述代码做了封装优化,整理如下:(注意:需要自己修改邮箱账号,授权码,发件人,收件人才可运行):

"""
============================
Author:柠檬班-木森
Time:2020/2/12   16:36
E-mail:3247119728@qq.com
Company:湖南零檬信息技术有限公司
============================
"""
import requests
import jsonpath
import pyecharts
import smtplib
from pyecharts import options
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication


class LiveData(object):

    def __init__(self, pro, city=None):
        self.pro = pro
        self.city = city

    def get_data(self):
        """疫情数据获取"""
        # 根据参数判断获取的是省份数据还是某个城市的数据
        if self.city != None:
            url = "https://api.inews.qq.com/newsqa/v1/query/pubished/daily/list?province={}&city={}".format(
                self.pro, self.city)
        else:
            # 数据url地址
            url = "https://api.inews.qq.com/newsqa/v1/query/pubished/daily/list?province={}".format(self.pro)
        # 发送请求获
        response = requests.get(url=url)
        # 获取返回的数据
        data = response.json()["data"]
        return data

    def generating_charts(self, data):
        """生成图表"""
        date = jsonpath.jsonpath(data, "$..date")
        # 提取确诊人数
        confirm = jsonpath.jsonpath(data, "$..confirm")
        # 提取死亡人数
        dead = jsonpath.jsonpath(data, "$..dead")
        # 提取治愈人数
        heal = jsonpath.jsonpath(data, "$..heal")
        # 提取新增人数
        confirm_add = jsonpath.jsonpath(data, "$..confirm_add")
        # 创建一个折线图
        line = pyecharts.charts.Line()
        line.add_xaxis(date)
        line.add_yaxis("确诊", confirm)
        line.add_yaxis("治愈", heal)
        line.add_yaxis("死亡", dead)
        line.add_yaxis("新增", confirm_add)
        if self.city:
            opts = options.TitleOpts(title="{}{}地区".format(self.pro, self.city),
                                     subtitle="确诊人数病例图")
        else:
            opts = options.TitleOpts(title="{}地区".format(self.pro),
                                     subtitle="确诊人数病例图")
        line.set_global_opts(title_opts=opts)
        # # 默认会在当前目录生成 render.html 文件
        line.render()

    def send_msg(self):
        """发送邮件"""
        # 第一步:连接到smtp服务器
        smtp = smtplib.SMTP_SSL(host="smtp.qq.com", port=465)
        # 第二步:登录服务器
        smtp.login(EMAIL, PASSWORD)
        # 第三步:准备邮件
        file_content = open("render.html", "rb").read()
        msg = MIMEMultipart()
        text_msg = MIMEText("疫情确诊病例图",
                            _subtype='plain',
                            _charset="utf8")
        msg.attach(text_msg)

        file_msg = MIMEApplication(file_content)
        file_msg.add_header('content-disposition',
                            'attachment',
                            filename='render.html')
        msg.attach(file_msg)
        msg["From"] = FORM_USER
        msg["To"] = TO_USER
        msg["Subject"] = "发送测试报告"
        # 第四步: 发送邮件
        smtp.send_message(msg, from_addr=FORM_USER, to_addrs=TO_USER)

    def main(self):
        # 获取数据
        data = self.get_data()
        # 生成图表
        self.generating_charts(data)
        # 发送邮件
        self.send_msg()


# 需要修改的配置数据(下面数据需要自己添加,才可发送邮件,不然发邮件会报错)
# 邮箱账号
EMAIL = ""
# 邮箱smtp服务授权码
PASSWORD = ""
# 发件人
FORM_USER = ""
# 收件人
TO_USER = ""

if __name__ == '__main__':
    # 获取某个省的数据
    # obj = LiveData("湖北")
    # obj.main()

    # 获取某个城市的数据
    obj = LiveData("湖北", "武汉")
    obj.main()

有疑问的小伙伴可以找老师协助解答

1 操作
mslemonban 在 2020-08-06 17:50:20 更新了该帖
回帖
请输入回帖内容 ...