新型冠狀病毒肺炎國內分省分日期從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")

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