一、概述
本篇主要介绍获取数据的具体过程 。
二、
数据接口在上一篇文章 中已经介绍
(一)、 国内实时数据
那我们就先获取第一个国内各省市地区实时数据:
https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5
首先我们点开大概看一下内容:
get一下:
# 接口
api = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
head = {'User-Agent': 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, ' \
'like Gecko) Chrome/18.0.1025.166 Safari/535.19 '}
req = requests.get(api, headers=head)
print(req.text)
我们看到打印出来的结果如下:
和我们一开始打开网页看到的内容一致,包括了国内各省市的实时数据 。
我们将其转换为json格式,看一下其键值:
response_data = json.loads(req.text)
print(response_data.keys())
结果如下,ret值为0,表示请求成功,data为返回的数据:
那我们继续看“data”部分:
这里由于“data”的值仍为字符串,所以直接获取response['data'].keys()会报错,因此我们须在对其再进行一次转换:
print(json.loads(response_data['data']).keys())
结果分别为上一次更新时间,国内总确诊数,新增人数,是否展示新增数据,具体选项(确诊、治愈、死亡等),全国疫情数据: 其中 'areaTree'为List:
我们遍历它看一下,发现还是很乱,但是能看出里面数据的格式为dict,因此我们再看一下键值的情况:
area_Tree = json.loads(response_data['data'])['areaTree']
print(area_Tree[0].keys())
结果如下,name代表中国数据,today下为今日,total为总体数据,children下则是各省数据,List类型:
我们遍历这个列表:
for each in area_Tree[0]['children']:
print(each)
结果如图:
以省为单位,每个省以字典形式存放数据,键值依旧为name,today,total,children,我们接着查看省级以下的数据:
for each_province in area_Tree[0]['children']:
# print(each_province)
province_name = each_province['name'] # 省名
province_today_confirm = each_province['today']['confirm'] # 省内今日确诊总数
province_total_confirm = each_province['total']['nowConfirm'] # 省内现存确诊总数
province_total_confirmed = each_province['total']['confirm'] # 省内确诊总数
province_total_dead = each_province['total']['dead'] # 省内死亡总数
province_total_heal = each_province['total']['heal'] # 省内治愈总数
province_total_localConfirm = each_province['total']['provinceLocalConfirm'] # 省内本土确证数
for each_city in each_province['children']:
city_name = each_city['name'] # 市名
city_today_confirm = each_city['today']['confirm'] # 市内今日确诊数
city_total_confirm = each_city['total']['nowConfirm'] # 市内现存确诊数
city_total_confirmed = each_city['total']['confirm'] # 市内确诊总数
city_total_dead = each_city['total']['dead'] # 市内死亡病例数
city_total_heal = each_city['total']['heal'] # 市内治愈数
city_grade = '' # 市风险等级
if 'grade' in each_city['total']:
city_grade = each_city['total']['grade']
print("省份:" + province_name +
" 地区:" + city_name +
" 今日确诊新增确诊:" + str(city_today_confirm) +
" 现存确诊:" + str(city_total_confirm) +
" 风险等级:" + city_grade +
" 累计确诊:" + str(city_total_confirmed) +
" 治愈:" + str(city_total_heal) +
" 死亡:" + str(city_total_dead))
这里因为找不到腾讯官方的文档,因此有部分字段意义不明,不过所需数据已全部获取到,部分地区的风险等级未知:
不过大家最关心的一半都是新增确诊这样总体的数据,那我们再回去重新获取一下全国的数据,在data中的chinaTotal和chinaAdd中分别保存了国内总数据和今日新增数据,由于一些字段意义不明,因此我们仍然只获取了其中一部分内容:
all_data = json.loads(response_data['data']) # 返回的数据
last_update_time = all_data['lastUpdateTime'] # 上次更新时间
# 总体数据
china_total = all_data['chinaTotal'] # 总计
total_confirm = china_total['confirm'] # 累计确诊
total_heal = china_total['heal'] # 累计治愈
total_dead = china_total['dead'] # 累计死亡
now_confirm = china_total['nowConfirm'] # 现存确诊(=累计确诊-累计治愈-累计死亡)
suspect = china_total['suspect'] # 疑似
now_severe = china_total['nowSevere'] # 现存重症
imported_case = china_total['importedCase'] # 境外输入
noInfect = china_total['noInfect'] # 无症状感染
local_confirm = china_total['localConfirm'] # 本土确诊
# 新增数据
china_add = all_data['chinaAdd'] # 新增
add_confirm = china_add['confirm'] # 新增累计确诊?
add_heal = china_add['heal'] # 新增治愈
add_dead = china_add['dead'] # 新增死亡
add_now_confirm = china_add['nowConfirm'] # 新增现存确诊
add_suspect = china_add['suspect'] # 新增疑似
add_now_sever = china_add['nowSevere'] # 新增现存重症
add_imported_case = china_add['importedCase'] # 新增境外输入
add_no_infect = china_add['noInfect'] # 新增无症状
主要工作都是对返回数据的拆分,不难但是很繁琐,这里我们发现返回的数据中 新增累计确诊和新增现存确诊是不一样的,这里注释里也说明了:现存确诊(=累计确证-累计治愈-累计死亡)。
至此我们完成了对第一个接口数据的获取,接下来我们继续获取国内历史数据和对海外数据的获取。
(二)、国内历史数据
https://view.inews.qq.com/g2/getOnsInfo?name=disease_other(历史日期总计及新增,这里只能请求到近三个月的数据)
对接口的请求同上,我们直接看数据的格式:
all_data = json.loads(response_data['data']) # 返回的数据
print(all_data.keys())
dict_keys(['cityStatis', 'chinaDayList', 'chinaDayAddList', 'provinceCompare', 'nowConfirmStatis', 'statisGradeCityDetail', 'dailyNewAddHistory', 'dailyHistory', 'wuhanDayList', 'articleList'])
我们一个一个看每个键值代表什么,‘cityStatis’按翻译应该是城市统计,下面有三个键{'confirm' ,'zeroNowConfirm', 'notZeroNowConfirm'},暂时不知道什么意思。
'chinaDayList'和 ‘chinaDayAddList’下是列表,存储了近三个月的每日数据和每日新增数据
我们对其进行拆分:
chinaDayList:dict_keys(['confirm', 'suspect', 'dead', 'heal', 'nowConfirm', 'nowSevere', 'importedCase', 'deadRate', 'healRate', 'date', 'y', 'noInfect', 'localConfirm', 'noInfectH5', 'localConfirmH5', 'local_acc_confirm'])
chinaDayAddList:dict_keys(['confirm', 'suspect', 'dead', 'heal', 'importedCase', 'infect', 'localinfectionadd', 'localConfirmadd', 'deadRate', 'healRate', 'date', 'y'])
因为数据已经使用列表存储且各字段意义明确,那我们不需要再做多余的工作,获得这两个列表即可:
# ['confirm' 总确诊,
# 'suspect' 疑似,
# 'dead' 死亡,
# 'heal' 治愈,
# 'nowConfirm' 现存确诊,
# 'nowSevere' 现存重症,
# 'importedCase' 境外输入病历,
# 'deadRate' 死亡率,
# 'healRate' 治愈率,
# 'date' 日期,
# 'y' 年,
# 'noInfect' 无症状,
# 'localConfirm' 本土确证, 'noInfectH5', 'localConfirmH5', 'local_acc_confirm']
chinaDayList = all_data['chinaDayList'] # 每日数据(列表)
# ['confirm' 新增确诊,
# 'suspect' 新增疑似,
# 'dead' 新增死亡,
# 'heal' 新增治愈,
# 'importedCase' 新增境外输入,
# 'infect' ,
# 'localinfectionadd' ,
# 'localConfirmadd' 新增本土确诊,
# 'deadRate' 死亡率,
# 'healRate' 治愈率
# , 'date', 'y' 日期]
chinaDayAddList = all_data['chinaDayAddList'] # 每日新增数据
'provinceCompare'的键值为各省名,下面的值意义不明,而且后续我们会单独获取各省具体数据,因此这里忽略这个字段,感兴趣的可以自己去看一看。
'nowConfirmStatis'同上,意义不明且不需要。
'statisGradeCityDetail'为列表,键['province', 'city', 'nowConfirm', 'confirmAdd', 'confirm', 'dead', 'heal', 'grade', 'date', 'sdate', 'syear']:
各省市的风险等级,关于这个部分我们也将在之后通过其他的接口获取,因此这里忽略。
剩余几个键的值为空,我们忽略。
至此近三月国内数据获取完毕,更为简单。
(三)、国外
https://view.inews.qq.com/g2/getOnsInfo?name=disease_foreign(国外情况)
在获取数据时发现这个接口已经停止更新了,也就是说数据都是很久之前的,因此我们更换一个接口。
海外疫情数据接口:http://api.tianapi.com/ncovabroad/index
上面是请求返回的键,数据保存在newslist中,我们看一下newslist 下数据情况:
返回参数如下:
我们直接保存这个列表就行。
在返回的数据中我们发现有一条数据与众不同,如下:
也就是中国的数据,并且在该列的‘statisticData’这一字段上有一个url,是一个json文件,我们打开它看一下:
json_url = chinaStaticsData
# 读取数据
req = requests.get(json_url)
with open('chinaStaticData.json', 'w') as f:
f.write(req.text) # req.text可以直接读取文件数据,返回字符串
file_urllid = req.json()
print(file_urllid)
如上所示,我们发现这是自2020年疫情爆发以来每天国内的数据,截止到前一天,那我们后续将使用这个数据作为历史数据,放弃上面腾讯的接口(因为只能获取到近3个月的数据)。
(四)、国内历史数据(另一数据源)
上面我们获得了另一来源的国内疫情历史数据,现在我们对其进行一下清理(其实数据已经很明了,这里我们只是筛选出我们所需要的数据):
下面是该json文件的键:
我们只关注'data'部分,也就是历史数据存放的位置.
data部分存放的是一个列表,每一项代表一天的数据,从2020.01.19开始:
# ['confirmedCount' 总确诊数, # 'confirmedIncr' 新增总确诊数, # 'curedCount' 治愈数, # 'curedIncr' 新增治愈数, # 'currentConfirmedCount' 现存确诊数, # 'currentConfirmedIncr' 新增现存确诊, # 'dateId' 日期, # 'deadCount' 死亡数, # 'deadIncr' 新增死亡数, # 'highDangerCount', # 'midDangerCount', # 'suspectedCount' 疑似病例数, # 'suspectedCountIncr' 新增疑似病例]
上面是每一项包含的键以及其含义,这里日期以一个八位字符串形式保存。
新增的数据中正数代表增加,负数代表减少。
接下来就是保存这些请求到的数据了。
三、总结
这里平台有关疫情的主要数据获取结束,其余有关数据我们在后面的博客介绍。
文章评论