获取疫情数据的脚本是2020年就写了,网上有多个地方可以获取;
比如百度有: 实时更新:新型冠状病毒肺炎疫情地图
腾讯有:实时更新:新冠肺炎疫情最新动态
因为一开始写的时候,觉得比较简单,所以一直没有分享出来
不过最近大家可能会发现,部分接口的脚本跑不通了,这里是因为某个接口拿到的json串已经不完整了,有乱码了,导致json解析失败,数据自然也用不了了(其实之前也出现过,短暂几天)
这个问题其实找出一个正常的api接口,换上就可以了
旧接口(json串不稳定) | https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5 |
新接口(稳定输出) | https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=diseaseh5Shelf |
为了解决问题,我这边分享一下我的疫情数据获取代码(原本我是用scrapy写的,这里稍微改成了普通py)
import requests
import json
def parse():
# 新建用力啊存储数据的字典
res_list = {}
# 第一个接口
req = requests.get('https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5')
req_data = json.loads(req.text).get('data')
# 验证第一个接口,不能用则用第二个接口
try:
# 第一个接口有时候data的json串不完整,导致报错
print('开始验证第1个接口json')
req_data = json.loads(req_data)
print('第1个接口json验证通过')
except:
# 第二个接口
print('第1个接口json验证不通过,开始使用和验证第2个接口')
req = requests.get('https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=diseaseh5Shelf')
req_data = json.loads(req.text).get('data')
req_data = req_data.get('diseaseh5Shelf')
print('第2个接口json验证通过')
# 根据自己需要,获取相关数据
lastupdatetime = req_data['lastUpdateTime']
chinatotal = req_data['chinaTotal']
chinaadd = req_data['chinaAdd']
areaTree = req_data['areaTree'][0]
res_list['lastUpdateTime'] = lastupdatetime
res_list['chinaTotal'] = chinatotal
res_list['chinaAdd'] = chinaadd
res_list['citydata'] = []
# 循环获取各个地区的数据
for i_areaTree in areaTree['children']:
i_areaTree = i_areaTree
prov_name = i_areaTree['name']
# 港澳台地区数据貌似不怎么更新,我就没管了
if prov_name not in ['台湾', '香港', '澳门']:
for i_areaTree_end in i_areaTree['children']:
i_city_data = {}
i_city_data['prov_name'] = prov_name
i_city_data['city_name'] = i_areaTree_end['name']
i_city_data['newconfirm'] = i_areaTree_end['today']['confirm']
i_city_data['nowconfirm'] = i_areaTree_end['total']['nowConfirm']
i_city_data['confirmed'] = i_areaTree_end['total']['confirm']
# 20220112,字段suspect在接口中发现未提供了
# i_city_data['suspect'] = i_areaTree_end['total']['suspect']
i_city_data['suspect'] = 0
i_city_data['dead'] = i_areaTree_end['total']['dead']
i_city_data['heal'] = i_areaTree_end['total']['heal']
i_city_data['grade'] = '' if (i_areaTree_end['total'].get('grade') is None) else \
i_areaTree_end['total']['grade']
res_list['citydata'].append(i_city_data)
# 打印所有结果
print(res_list)
if __name__="__main__":
# 运行数据获取程序
res_list=parse()
通过如上,就可以获取到国内疫情,数据均放在字典 res_list 中。
大家获取数据后,可以根据自己的情况,进行数据的存储、查询和统计分析