一 新型冠狀病毒肺炎國內分省分日期全部數據(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/
如果瞭解爬蟲的可以往下看,不熟悉的可以直接到上面拿數據
數據到手流程
- 進入網站後f12,當我們點擊地圖,在切換省市查詢具體數值時,HTML中有一個“data-zr-dom-id=“zr_0””的canvas在動態變化,所以證明這些數據是由js文件操作的。
- 切換省市查詢時在Network中並沒有新的數據包,所以證明所有的數據都已經下載在本地了,而js只是讀取數據填充並繪圖,哎嘿嘿!
- 在Sources中我們看到2019ncov.chinacdc.cn主機下2019-nCoV文件夾下有個js文件夾和config.js文件,當我們點開config.js時,數據的芳香撲面而來。
- 從config.js文件中我們可以看到,它列了很多json格式的文件,如yq_20200116.json,yq_20200117.json等,我們通過網址 https://ncportal.esrichina.com.cn/JKZX/yq_20200117.json 可以得到2020年1月17日那天的全部數據
- 原始數據是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")