新型冠状病毒肺炎国内分省分日期从1.16起的全部数据爬取与整理代码(附下载)

一 新型冠状病毒肺炎国内分省分日期全部数据(1.16起):

原始json格式数据下载

https://ncportal.esrichina.com.cn/JKZX/yq_20200117.json

https://ncportal.esrichina.com.cn/JKZX/yq_20200118.json

https://ncportal.esrichina.com.cn/JKZX/yq_20200119.json

等等…(把后面的yq_…换成自己想要的日期即可)

csv格式数据下载

链接:https://pan.baidu.com/s/10hpprJ8sMoucJQfvik5SzQ
提取码:6lhy

这是从json格式数据整理来的,整理的代码在下面

二 数据来源与抓取

来自最权威的网站:http://2019ncov.chinacdc.cn/2019-nCoV/

如果了解爬虫的可以往下看,不熟悉的可以直接到上面拿数据

数据到手流程

  1. 进入网站后f12,当我们点击地图,在切换省市查询具体数值时,HTML中有一个“data-zr-dom-id=“zr_0””的canvas在动态变化,所以证明这些数据是由js文件操作的。
  2. 切换省市查询时在Network中并没有新的数据包,所以证明所有的数据都已经下载在本地了,而js只是读取数据填充并绘图,哎嘿嘿!
  3. 在Sources中我们看到2019ncov.chinacdc.cn主机下2019-nCoV文件夹下有个js文件夹和config.js文件,当我们点开config.js时,数据的芳香扑面而来。
  4. 从config.js文件中我们可以看到,它列了很多json格式的文件,如yq_20200116.json,yq_20200117.json等,我们通过网址 https://ncportal.esrichina.com.cn/JKZX/yq_20200117.json 可以得到2020年1月17日那天的全部数据
  5. 原始数据是json格式,而且地点,日期,各项指标写的很清楚,我们直接转换就行

三 数据下载与整理成csv

数据有省市之分,有日期之分,有新增、累积之分,有确诊、疑似之分,因此这里我导出csv格式后,横座标是省份,纵座标是日期,每个单元格格式是:新增确诊-新增疑似-新增死亡-累积确诊-累积疑似-累积死亡

自动下载json格式原始数据代码:

import requests
import datetime
import time


# 得到从startdate开始后N天的日期
def get_n_day_after(start_date, n):
    date_datetime = datetime.datetime.strptime(start_date, "%Y-%m-%d")
    date = str(
        datetime.datetime(date_datetime.year, date_datetime.month, date_datetime.day) + datetime.timedelta(n)).split()
    return date[0]


for i in range(60):
    date = get_n_day_after('2020-01-16', i)
    date = "".join(date.split("-"))
    url = "https://ncportal.esrichina.com.cn/JKZX/yq_" + date + ".json"
    print(url)
    # 下载json文件并保存到本地
    time.sleep(1)
    file_name = url.split('/')[-1]
    r = requests.get(url)
    with open("data/" + file_name, "wb") as code:
        pass
        code.write(r.content)

解析json代码与导出数据到一份csv数据中

import json
import os


def readfile(path):
    files = os.listdir(path)
    file_list = []
    for file in files:  # 遍历文件夹
        if not os.path.isdir(file):
            file_list.append(path + '/' + file)
    return file_list


# 提取数据
data_dict = {}
file_list = readfile("data")
for file_name in file_list:
    f = open(file_name, encoding='utf-8')
    file_json = json.load(f)
    # 提取日期
    date = (file_name.split('/')[1])[3:11]
    # date.insert(4, '-')
    # date.insert(7, '-')
    date = "%s-%s-%s" % (date[:4], date[4:6], date[6:8])

    # 提取省市
    features = file_json['features']
    for feature in features:
        properties = feature['properties']
        province = properties['省份']
        new_confirm = properties['新增确诊']
        new_death = properties['新增死亡']
        new_suspect = properties['新增疑似']
        total_confirm = properties['累计确诊']
        total_death = properties['累计死亡']
        total_suspect = properties['累计疑似']
        write_str = "-".join(
            [str(new_confirm), str(new_suspect), str(new_death), str(total_confirm), str(total_suspect),
             str(total_death)])
        # {date : { province : write_str } }
        if data_dict.get(date):
            data_dict[date].update({province: write_str})
        else:
            data_dict[date] = {province: write_str}
sorted(data_dict)
# 写入文件
province_init = False
file_name = 'COVID-19.CSV'
with open(file_name, 'w') as file_writer:
    for date, value_dict in data_dict.items():
        province_list = []
        value_list = []
        sorted(value_dict)
        for province, values in value_dict.items():
            province_list.append(province)
            value_list.append(values)
            # 写入省份
        if province_init:
            file_writer.write(date + "," + ",".join(value_list) + "\n")
        else:
            # 首次写入数据需要加入省份
            province_init = True
            file_writer.write("," + ",".join(province_list) + "\n")
        file_writer.write(date + "," + ",".join(value_list) + "\n")

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章