前言:
代码语言: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 到今天所有疫情的数据,结果如下:
数据可视化
通过上面的代码,我们能够获取到,湖北的疫情数据,包含了确诊总数,死亡人数,治愈人数,新增确诊人数。那么接下来我们要将获取到的数据,生成可视化的折线图。具体代码如下
代码语言: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()
运行上述代码,就可以根据前面获取到的数据生成一个可视化的折线图(可根据下面图表上方的标识来选择隐藏或显示数据项),如下:
发送可视化图表到邮箱
关于使用 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()