爬虫读取疫情数据,可根据兴趣进行调整,并邮件形式每天定时发送

1. 目标

小美虽然已经逐渐意识到疫情的可怕并且做了一定的防范,但是每天依然有一定的增加。

不知道有没有像我一样为美国 “担惊受怕” 的小伙伴,并且懒得每天去支付宝或者其他地方查看疫情。这里提供一个可以满足个性化需求的方法,每天定时爬虫检测数据并以邮件的形式发送给自己。

2. 获得数据

感兴趣的可以直接使用浏览器访问这个接口,获得数据。

import requests
import json

def get_page(url):    #解析网页
    headers={
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'
    }
    try:
        r=requests.get(url,headers=headers)
#         print(r.json())
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.json()
    except Exception as e:
        print("error",e)
        return "ERROR"

url='https://c.m.163.com/ug/api/wuhan/app/data/list-total'
cases_json=get_page(url)
# 首先拿个美国的所有数据 
# json数据解析到 ['data']['areaTree'] 后,
# 得到的是一个 数组,根据索引拿到数据,美国的索引为 9
USA = cases_json['data']['areaTree'][9]
# print(USA)

# 今天
today = USA['today']
# print(today)

# 总共
total = USA['total']
# print(total)

# 选择想要的数据
answer = '确诊总数:'+str(total['confirm'])+\
         ' 死亡总数:'+str(total['dead'])+\
         ' 今日确诊增加:'+str(today['confirm'])+\
         ' 今日死亡人数:'+str(today['dead'])

print(answer)

运行一下,只要求有python环境并且自己电脑能够上网即可。

运行输出如下(注:此时是2021年2月23日22::07):

确诊总数:28826307 死亡总数:512590 今日确诊增加:59257 今日死亡人数:1457

3. 邮件定时发送

参考博客:https://smileyan.blog.csdn.net/article/details/109312411 的内容,把上面获得的数据发送给自己邮箱。

注意,需要根据自己的实际情况填写邮箱地址和密码,以及邮箱服务器。

import smtplib
from email.mime.text import MIMEText
from email.header import Header
import time

# 第三方 SMTP 服务
mail_host = 'smtp.exmail.qq.com'  #设置服务器
mail_user = "root@smileyan.cn"    #用户名
mail_pass="Your password"   

sender = 'root@smileyan.cn'
receivers = ['root@smileyan.cn']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

date = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

message = MIMEText(answer, 'plain', 'utf-8')
message['From'] = Header("Python 脚本(by smileyan)", 'utf-8')
message['To'] =  Header("幸运儿", 'utf-8')

subject = date
message['Subject'] = Header(subject, 'utf-8')

try:
    smtpObj = smtplib.SMTP() 
    smtpObj.connect(mail_host, 25)    # 25 为 SMTP 端口号
    smtpObj.login(mail_user,mail_pass)  
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("邮件发送成功")
except smtplib.SMTPException:
    print("Error: 无法发送邮件")

注意这个需要和上面的拼接起来一起用。

最后的结果可以收到邮件如下:
在这里插入图片描述

4.定时邮件发送请参考

  • https://smileyan.blog.csdn.net/article/details/109312411

5. 其他地区

感谢来自 qq_41656449 的建议,这里补充一些,如何查询其他地方的疫情情况的代码。

5.1 获得所有地区的索引

上面提到美国数据的索引号为 9,这里先获得所有地区的索引号。

import requests
import json

def get_page(url):    #解析网页
    headers={
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'
    }
    try:
        r=requests.get(url,headers=headers)
#         print(r.json())
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.json()
    except Exception as e:
        print("error",e)
        return "ERROR"

url='https://c.m.163.com/ug/api/wuhan/app/data/list-total'
cases_json=get_page(url)

# 拿到跟地区相关的所有数据的数组
allAreas = cases_json['data']['areaTree']

# 或取所有的索引和名称
for i,area in enumerate(allAreas):
    name = area['name']
    print(i,name)

输出内容比较多,这里只列举50个:

0 突尼斯
1 塞尔维亚
2 中国
3 日本本土
4 泰国
5 新加坡
6 韩国
7 澳大利亚
8 德国
9 美国
10 马来西亚
11 越南
12 圣巴泰勒米
13 肯尼亚
14 伊朗
15 以色列
16 毛利亚尼亚
17 黎巴嫩
18 克罗地亚
19 奥地利
20 瑞士
21 希腊
22 毛里求斯
23 爱沙尼亚
24 北马其顿
25 白俄罗斯
26 立陶宛
27 阿塞拜疆
28 美属维尔京群岛
29 蒙古
30 乌克兰
31 波兰
32 波黑
33 蒙特塞拉特
34 南非
35 布隆迪
36 南苏丹
37 马耳他
38 摩尔多瓦
39 保加利亚
40 孟加拉
41 阿尔巴尼亚
42 巴勒斯坦
43 科摩罗
44 阿富汗
45 沙特阿拉伯
46 新西兰
47 塔吉克斯坦
48 泽西岛
49 叙利亚
50 巴拿马
....

5.2 选择自己感兴趣的地区

接着选择自己关注的地区,并找到前面的索引,然后修改下面的代码,就可以获得所有数据了。

import requests
import json

def get_page(url):    #解析网页
    headers={
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'
    }
    try:
        r=requests.get(url,headers=headers)
#         print(r.json())
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.json()
    except Exception as e:
        print("error",e)
        return "ERROR"

url='https://c.m.163.com/ug/api/wuhan/app/data/list-total'
cases_json=get_page(url)

# 拿到跟地区相关的所有数据的数组
allAreas = cases_json['data']['areaTree']

# 获得所有地区的名字
names_dir = {}

# 或取所有的索引和名称
for i,area in enumerate(allAreas):
    names_dir[str(area['name'])] = i
    
############################
### 填写自己感兴趣的地区
############################
areas = ['中国','美国','印度','法国','巴西','日本本土']

# 根据名称查询数据
for area in areas:
    index = names_dir[area]
    areaData = allAreas[index]
    today = areaData['today']
    total = areaData['total']
    # 选择想要的数据
    answer = '确诊总数:'+str(total['confirm'])+\
         ' 死亡总数:'+str(total['dead'])+\
         ' 今日确诊增加:'+str(today['confirm'])+\
         ' 今日死亡人数:'+str(today['dead'])

    print('【'+area+'】:',answer)

输出内容如下:

【中国】: 确诊总数:101802 死亡总数:4843 今日确诊增加:24 今日死亡人数:0
【美国】: 确诊总数:29052262 死亡总数:520785 今日确诊增加:77377 今日死亡人数:2422
【印度】: 确诊总数:11046914 死亡总数:156825 今日确诊增加:16738 今日死亡人数:120
【法国】: 确诊总数:3746475 死亡总数:85734 今日确诊增加:25412 今日死亡人数:261
【巴西】: 确诊总数:10390461 死亡总数:251498 今日确诊增加:65998 今日死亡人数:1541
【日本本土】: 确诊总数:428804 死亡总数:7738 今日确诊增加:1076 今日死亡人数:0

需要注意名字问题,比如说查 日本 失败,需要改为 日本本土
具体名称参考前面 5.1 部分,总共包含 207 个地区。

总结

第一篇博客编写完成!Nice ! (最后补充一句,绝对不是幸灾乐祸哈)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值