项目实训(二)

一、概述

本篇主要介绍获取数据的具体过程 。

二、

        数据接口在上一篇文章 中已经介绍

(一)、 国内实时数据

        那我们就先获取第一个国内各省市地区实时数据:

        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' 新增疑似病例]

         上面是每一项包含的键以及其含义,这里日期以一个八位字符串形式保存。

        新增的数据中正数代表增加,负数代表减少。

        接下来就是保存这些请求到的数据了。


三、总结 

        这里平台有关疫情的主要数据获取结束,其余有关数据我们在后面的博客介绍。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值