前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >50 行代码获取疫情实时数据,发送可视化图表到邮箱

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

原创
作者头像
程序员白楠楠
修改2021-08-26 10:26:30
1K0
修改2021-08-26 10:26:30
举报

前言:

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

实现步骤:

第一步:数据获取

第二步:生成可视化图表

第三步:发送到邮箱

环境准备:

1、安装 python

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

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

代码语言:javascript
复制
  pip install requests
pip install jsonpath
pip install pyecharts

数据获取

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

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

代码语言:javascript
复制
  单个省份的数据地址:
"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 来获取数据就非常简单了,只需要几行代码,以湖北的数据为例,具体代码如下:

代码语言:javascript
复制
  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 到今天所有疫情的数据,结果如下:

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

数据可视化

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

代码语言:javascript
复制
  """这里是上面数据获取代码,已省略!"""
#  数据可视化展示
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()

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

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

发送可视化图表到邮箱

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

代码语言:javascript
复制
  """这里是上面数据获取,生成图表的代码,已省略!"""
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 自动获取实时的疫情数据,生成可视化图表发送到邮箱了。小编将上述代码做了封装优化,整理如下:(注意:需要自己修改邮箱账号,授权码,发件人,收件人才可运行):测试面试宝典

代码语言:javascript
复制
 """
============================
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()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • 实现步骤:
  • 第一步:数据获取
  • 第二步:生成可视化图表
  • 第三步:发送到邮箱
  • 环境准备:
  • 1、安装 python
  • 2、安装需要使用的 python 的第三方库
  • 数据获取
  • 数据可视化
  • 发送可视化图表到邮箱
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档