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")