新型冠状病毒感染的肺炎疫情爆发后,对人们的生活产生很大的影响。当前感染人数依然在不断变化。每天国家卫健委和各大新闻媒体都会公布疫情的数据,包括累计确诊人数、现有确诊人数等。

本案例使用Python开发网络爬虫,对新冠肺炎的疫情数据(包括当日的实时数据和历史数据)进行采集。 png

1. 选择数据源

自新冠肺炎(covid-19)疫情爆发以来,这场疫情几乎影响了每个人的生活,为了对疫情做数据分析,需要采集疫情的数据,本篇案例就基于python爬虫进行数据采集。

首先我们需要找到合适的数据源,卫健委和各媒体每天都会报道新冠肺炎的疫情数据,如下图所示,因此我们可以考虑将这些网页作为数据源。 png

以北京市和湖南省为例查看卫健委的数据,结果发现,两地卫健委的数据各式并不统一,北京市卫健委数据为文本,而湖南省卫健委数据为图片,并且由于各卫健委的网络地址还需要再花时间去寻找,因此卫健委的数据并不便于采集。

png

我们考虑将新闻媒体的播报平台作为数据源,以网易的疫情播报平台为例,如下图所示可以看到它的数据内容非常丰富,不仅包括国内的数据还包括国外的数据,且作为大平台,公信度也比较高。因此我们选择网易的疫情实时动态播报平台作为数据源,其地址如下:
https://wp.m.163.com/163/page/news/virus_report/index.html?_nw_=1&_anw_=1

png

我们基于网易的实时播报平台寻找数据,由于它是一个实时的动态平台,因此数据一般在Network标签下可以找到,以Chrome浏览器为例展示寻找数据步骤:

png

在网页的检查页面内,左下角红框所示的部分是我们找到的数据源,基于这些地址进行爬取,我们获取数据的目标如下: png

2. 初步探索

通过比对,我们发现在第二个地址中存放着关于疫情的数据,因此我们先对这个地址进行爬虫。 png

接下来找到其地址,点击headers后进行查看,在url中?后边为参数,可以不用设置,因此我们需要请求的地址为:https://c.m.163.com/ug/api/wuhan/app/data/list-total ,并且可以看到请求方法为get,同时查看自己浏览器的user-agent,使用requests请求时,设置user-agent伪装浏览器。 png

接下来开始请求,首先导入使用的包,使用request进行网页请求,使用pandas保存数据。

In [2]:
import requests
import pandas as pd
import time 
pd.set_option('max_rows',500)

设置请求头,伪装为浏览器

In [4]:
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}

发起请求,将找到的第一个数据源作为请求目标。

In [3]:
url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-total'   # 定义要访问的地址
r = requests.get(url, headers=headers)  # 使用requests发起请求
In [4]:
print(r.status_code)  # 查看请求状态
200
In [5]:
print(type(r.text))
print(len(r.text))
<class 'str'>
304653

可以看到返回后的内容是一个几十万长度的字符串,由于字符串格式不方便进行分析,并且在网页预览中发现数据为类似字典的json格式,所以我们将其转为json格式。

In [6]:
import json
data_json = json.loads(r.text)
data_json.keys()
Out[6]:
dict_keys(['reqId', 'code', 'msg', 'data', 'timestamp'])

png

可以看出在data中存放着我们需要的数据,因此我们取出数据。

In [7]:
data = data_json['data'] # 取出json中的数据
data.keys()
Out[7]:
dict_keys(['chinaTotal', 'chinaDayList', 'lastUpdateTime', 'areaTree'])

数据中总共有四个键,每个键存储着不同的内容:

键名称 数据内容
chinaTotal 全国当日数据
chinaDayList 全国历史数据
lastUpdateTime 更新时间
areaTree 世界各地实时数据

接下来我们分别获取实时数据和历史数据。

3. 实时数据爬取

3.1 全国各省实时数据爬取

首先我们抓取全国各省的实时数据,在areaTree键值对中,存放着世界各地的实时数据,areaTree是一个列表,每一个元素都是一个国家的数据,每一个元素的children是各国家省份的数据。 我们首先找到中国各省的实时数据,如下图所示。 png

In [8]:
data_province = data['areaTree'][2]['children']  # 取出中国各省的实时数据
In [9]:
type(data_province)
Out[9]:
list

data_province是列表格式,每个元素是一个省的实时数据,并且为字典格式,每个省的键名称全部相同。

In [10]:
data_province[0].keys() # 查看每个省键名称
Out[10]:
dict_keys(['today', 'total', 'extData', 'name', 'id', 'lastUpdateTime', 'children'])

各省数据键值含义如下:

键名称 数据内容
today 各省当日数据
total 各省当日累计数据
extData 无任何数据
name 各省名称
id 各省行政编号
lastUpdateTime 更新时间
children 各省下一级数据
In [11]:
for i in range(len(data_province)): # 遍历查看各省名称、更新时间
    print(data_province[i]['name'],data_province[i]['lastUpdateTime'])
    if i == 5:
        break
湖北 2020-03-26 08:26:00
广东 2020-03-26 09:28:26
河南 2020-03-26 08:19:55
浙江 2020-03-26 09:04:58
湖南 2020-03-26 08:28:02
安徽 2020-03-26 08:30:31

用DataFrame以字典格式生成数据的例子,传入一个列表,列表每一个元素都是字典

In [12]:
test_dict = [{'a':1,
              'b':2,
              'c':3,},
             
             {'a':111,
              'b':222}]
pd.DataFrame(test_dict)
Out[12]:
a b c
0 1 2 3.0
1 111 222 NaN
In [13]:
pd.DataFrame(data_province).head() # 直接生成数据效果并不理想
Out[13]:
children extData id lastUpdateTime name today total
0 [{'today': {'confirm': 0, 'suspect': 0, 'heal'... {'confirmNote': None, 'suspectNote': None, 'he... 420000 2020-03-26 08:26:00 湖北 {'confirm': 0, 'suspect': None, 'heal': 391, '... {'confirm': 67801, 'suspect': 0, 'heal': 61201...
1 [{'today': {'confirm': 2, 'suspect': 0, 'heal'... {'confirmNote': None, 'suspectNote': None, 'he... 440000 2020-03-26 09:28:26 广东 {'confirm': 11, 'suspect': None, 'heal': 2, 'd... {'confirm': 1444, 'suspect': 0, 'heal': 1336, ...
2 [{'today': {'confirm': 0, 'suspect': None, 'he... {'confirmNote': None, 'suspectNote': None, 'he... 410000 2020-03-26 08:19:55 河南 {'confirm': 1, 'suspect': None, 'heal': 0, 'de... {'confirm': 1275, 'suspect': 0, 'heal': 1250, ...
3 [{'today': {'confirm': 0, 'suspect': None, 'he... {'confirmNote': None, 'suspectNote': None, 'he... 330000 2020-03-26 09:04:58 浙江 {'confirm': 2, 'suspect': None, 'heal': 1, 'de... {'confirm': 1243, 'suspect': 0, 'heal': 1222, ...
4 [{'today': {'confirm': 0, 'suspect': None, 'he... {'confirmNote': None, 'suspectNote': None, 'he... 430000 2020-03-26 08:28:02 湖南 {'confirm': 0, 'suspect': None, 'heal': 0, 'de... {'confirm': 1018, 'suspect': 0, 'heal': 1014, ...

不能直接生成DataFrame是因为数据中嵌套着字典,例如湖北省数据如下:标红线表示带有嵌套字典,篮筐内没有嵌套字典。

逐个拆解数据,我们已经了解children为下一地级数据,我们只分析到省单位,因此各省的children数据不采集;extData为空值,也不采集,最后具体采集方法如下:

不需要采集的数据:children、extData。
需要采集的数据:由于数据中today和total嵌套着字典,因此不能直接获取,对于id、lastUpdateTime、name、可以直接取出为一个数据,today为一个数据,total为一个数据,最后三个数据合并为一个数据。

In [14]:
# 获取id、lastUpdateTime、name
info = pd.DataFrame(data_province)[['id','lastUpdateTime','name']]
info.head()
Out[14]:
id lastUpdateTime name
0 420000 2020-03-26 08:26:00 湖北
1 440000 2020-03-26 09:28:26 广东
2 410000 2020-03-26 08:19:55 河南
3 330000 2020-03-26 09:04:58 浙江
4 430000 2020-03-26 08:28:02 湖南

列表推导式例子

In [15]:
l1 = [1,1,1,2,2,2]
In [16]:
[i+1 for i in l1 ]
Out[16]:
[2, 2, 2, 3, 3, 3]
In [17]:
# 获取today中的数据
today_data = pd.DataFrame([province['today'] for province in data_province ]) 
today_data.head()
Out[17]:
confirm dead heal severe storeConfirm suspect
0 0.0 6.0 391.0 NaN None NaN
1 11.0 0.0 2.0 NaN None NaN
2 1.0 0.0 0.0 NaN None NaN
3 2.0 0.0 1.0 NaN None NaN
4 0.0 0.0 0.0 NaN None NaN
In [18]:
['today_'+i for i in today_data.columns]
Out[18]:
['today_confirm',
 'today_dead',
 'today_heal',
 'today_severe',
 'today_storeConfirm',
 'today_suspect']
In [19]:
today_data.columns = ['today_'+i for i in today_data.columns] # 由于today中键名和total键名相同,因此需要修改列名称
In [20]:
today_data.head()
Out[20]:
today_confirm today_dead today_heal today_severe today_storeConfirm today_suspect
0 0.0 6.0 391.0 NaN None NaN
1 11.0 0.0 2.0 NaN None NaN
2 1.0 0.0 0.0 NaN None NaN
3 2.0 0.0 1.0 NaN None NaN
4 0.0 0.0 0.0 NaN None NaN
In [21]:
# 获取total中的数据
total_data = pd.DataFrame([province['total'] for province in data_province ])
total_data.columns = ['total_'+i for i in total_data.columns]
total_data.head()
Out[21]:
total_confirm total_dead total_heal total_severe total_suspect
0 67801 3169 61201 0 0
1 1444 8 1336 0 0
2 1275 22 1250 0 0
3 1243 1 1222 0 0
4 1018 4 1014 0 0
In [22]:
pd.concat([info,total_data,today_data],axis=1).head() # 将三个数据合并
Out[22]:
id lastUpdateTime name total_confirm total_dead total_heal total_severe total_suspect today_confirm today_dead today_heal today_severe today_storeConfirm today_suspect
0 420000 2020-03-26 08:26:00 湖北 67801 3169 61201 0 0 0.0 6.0 391.0 NaN None NaN
1 440000 2020-03-26 09:28:26 广东 1444 8 1336 0 0 11.0 0.0 2.0 NaN None NaN
2 410000 2020-03-26 08:19:55 河南 1275 22 1250 0 0 1.0 0.0 0.0 NaN None NaN
3 330000 2020-03-26 09:04:58 浙江 1243 1 1222 0 0 2.0 0.0 1.0 NaN None NaN
4 430000 2020-03-26 08:28:02 湖南 1018 4 1014 0 0 0.0 0.0 0.0 NaN None NaN
In [11]:
# 将提取数据的方法封装为函数
def get_data(data,info_list):
    info = pd.DataFrame(data)[info_list] # 主要信息
    
    today_data = pd.DataFrame([i['today'] for i in data ]) # 生成today的数据
    today_data.columns = ['today_'+i for i in today_data.columns] # 修改列名
    
    total_data = pd.DataFrame([i['total'] for i in data ]) # 生成total的数据
    total_data.columns = ['total_'+i for i in total_data.columns] # 修改列名
    
    return pd.concat([info,total_data,today_data],axis=1) # info、today和total横向合并最终得到汇总的数据
In [24]:
today_province = get_data(data_province,['id','lastUpdateTime','name'])
today_province.head()
Out[24]:
id lastUpdateTime name total_confirm total_dead total_heal total_severe total_suspect today_confirm today_dead today_heal today_severe today_storeConfirm today_suspect
0 420000 2020-03-26 08:26:00 湖北 67801 3169 61201 0 0 0.0 6.0 391.0 NaN None NaN
1 440000 2020-03-26 09:28:26 广东 1444 8 1336 0 0 11.0 0.0 2.0 NaN None NaN
2 410000 2020-03-26 08:19:55 河南 1275 22 1250 0 0 1.0 0.0 0.0 NaN None NaN
3 330000 2020-03-26 09:04:58 浙江 1243 1 1222 0 0 2.0 0.0 1.0 NaN None NaN
4 430000 2020-03-26 08:28:02 湖南 1018 4 1014 0 0 0.0 0.0 0.0 NaN None NaN
In [25]:
def save_data(data,name): # 定义保存数据方法
    file_name = name+'_'+time.strftime('%Y_%m_%d',time.localtime(time.time()))+'.csv'
    data.to_csv(file_name,index=None,encoding='utf_8_sig')
    print(file_name+' 保存成功!')
In [26]:
time.strftime('%Y_%m_%d',time.localtime(time.time()))
Out[26]:
'2020_03_26'
In [28]:
save_data(today_province,'today_province')
today_province_2020_03_26.csv 保存成功!

3.2 世界各国实时数据爬取

之前已经了解到在json数据data中的areaTree是列表格式,每个元素都是一个国家的实时数据,每个元素的children是各国家省份的数据,现在我们提取世界各国实时数据。

png

In [29]:
areaTree = data['areaTree'] # 取出areaTree
In [30]:
areaTree[0] # 查看第一个国家的数据
Out[30]:
{'today': {'confirm': 59,
  'suspect': 0,
  'heal': 0,
  'dead': 2,
  'severe': 0,
  'storeConfirm': None},
 'total': {'confirm': 173, 'suspect': 0, 'heal': 0, 'dead': 5, 'severe': 0},
 'extData': {'confirmNote': '',
  'suspectNote': '',
  'healNote': '',
  'deadNote': '',
  'incrConfirmNote': '',
  'incrSevereNote': ''},
 'name': '突尼斯',
 'id': '9577772',
 'lastUpdateTime': '2020-03-26 03:42:51',
 'children': []}

areaTree中每个键值的含义:

键名称 数据内容
today 当日数据
total 累计数据
extData 无任何数据
name 国家名称
id 各国编号
lastUpdateTime 更新时间
children 各国下一级数据(例如省份或州)
In [31]:
for i in range(len(areaTree)):  # 查看各国家名称和更新时间
    print(areaTree[i]['name'],areaTree[i]['lastUpdateTime'])
    if i == 5:
        break
突尼斯 2020-03-26 03:42:51
塞尔维亚 2020-03-26 08:49:54
中国 2020-03-26 09:55:35
日本 2020-03-26 00:00:31
泰国 2020-03-26 00:00:31
新加坡 2020-03-26 00:00:31

areaTree中提取每个国家的实时数据。

In [32]:
today_world = get_data(areaTree,['id','lastUpdateTime','name'])
today_world.head()
Out[32]:
id lastUpdateTime name total_confirm total_dead total_heal total_severe total_suspect today_confirm today_dead today_heal today_severe today_storeConfirm today_suspect
0 9577772 2020-03-26 03:42:51 突尼斯 173 5 0 0 0 59.0 2.0 0.0 0.0 None 0.0
1 9507896 2020-03-26 08:49:54 塞尔维亚 384 4 0 0 0 81.0 1.0 0.0 0.0 None 0.0
2 0 2020-03-26 09:55:35 中国 81962 3293 74196 1235 159 116.0 6.0 405.0 -164.0 None 58.0
3 1 2020-03-26 00:00:31 日本 2014 55 907 0 0 NaN NaN NaN NaN None NaN
4 2 2020-03-26 00:00:31 泰国 934 4 70 0 0 NaN NaN NaN NaN None NaN
In [33]:
save_data(today_world,'today_world')
today_world_2020_03_26.csv 保存成功!

4.历史数据爬取

4.1 全国历史数据爬取

在数据data中,总共有四个键,其中chinaDayList存放着中国的历史数据,我们将其取出。 png

In [34]:
data.keys()
Out[34]:
dict_keys(['chinaTotal', 'chinaDayList', 'lastUpdateTime', 'areaTree'])
In [35]:
chinaDayList = data['chinaDayList'] # 取出chinaDayList

chinaDayList中键值含义:

键名称 数据内容
date 日期
today 当日数据
total 累计数据
lastUpdateTime 更新时间
In [36]:
type(chinaDayList) # 查看chinaDayList的格式
Out[36]:
list
In [37]:
chinaDayList[0]
Out[37]:
{'date': '2020-01-20',
 'today': {'confirm': 291,
  'suspect': 27,
  'heal': 25,
  'dead': 6,
  'severe': 0,
  'storeConfirm': None},
 'total': {'confirm': 291, 'suspect': 54, 'heal': 25, 'dead': 6, 'severe': 0},
 'lastUpdateTime': None}

可以看到todaytotal中也嵌套着字典,因此直接使用定义好的方法从chinaDayList中提取全国历史数据。

In [38]:
alltime_China = get_data(chinaDayList,['date','lastUpdateTime'])
alltime_China.head()
Out[38]:
date lastUpdateTime total_confirm total_dead total_heal total_severe total_suspect today_confirm today_dead today_heal today_severe today_storeConfirm today_suspect
0 2020-01-20 None 291 6 25 0 54 291 6 25 0 None 27
1 2020-01-21 None 440 9 25 102 37 149 3 0 0 None 26
2 2020-01-22 None 571 17 28 95 393 131 8 3 0 None 257
3 2020-01-23 None 830 25 34 177 1072 259 8 6 0 None 680
4 2020-01-24 None 1287 41 38 237 1965 457 16 4 0 None 1118
In [39]:
save_data(alltime_China,'alltime_China')
alltime_China_2020_03_26.csv 保存成功!

4.2 全国各省历史数据爬取

找到第二个数据地址https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=420000 ,在页面对比发现是湖北省的历史数据。 png

先以其中一个省为例,先尝试获取其历史数据,其他的省可以使用同样的方法。

In [40]:
url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=420000' # 定义数据地址
r = requests.get(url, headers=headers) # 进行请求
data_json = json.loads(r.text) # 获取json数据
In [41]:
data_json.keys()
Out[41]:
dict_keys(['reqId', 'code', 'msg', 'data', 'timestamp'])

png

list中存放着数据。

In [42]:
data_json['data']['list'][0]
Out[42]:
{'date': '2020-01-20',
 'today': {'confirm': 270,
  'suspect': 0,
  'heal': 25,
  'dead': 6,
  'severe': None,
  'storeConfirm': None},
 'total': {'confirm': 270, 'suspect': 0, 'heal': 25, 'dead': 6, 'severe': 0},
 'lastUpdateTime': None}

可以看出一个省一天的的数据格式如上,这和之前的数据结构一样,因此可以使用之前的方法得到数据。

In [43]:
data_test = get_data(data_json['data']['list'],['date'])
data_test['name'] = '湖北省'
data_test.head()
Out[43]:
date total_confirm total_dead total_heal total_severe total_suspect today_confirm today_dead today_heal today_severe today_storeConfirm today_suspect name
0 2020-01-20 270 6 25 0 0 270 6 25 NaN None 0.0 湖北省
1 2020-01-21 375 9 25 0 0 105 3 0 NaN None NaN 湖北省
2 2020-01-22 444 17 28 0 0 69 8 3 NaN None 0.0 湖北省
3 2020-01-23 549 24 28 0 710 105 7 0 NaN None NaN 湖北省
4 2020-01-24 729 39 31 0 1405 180 15 3 NaN None NaN 湖北省

通过上述方法得到了湖北省的历史数据,想要得到每个省的历史数据怎么做呢?

在湖北省历史数据的地址中,我们发现参数aeraCode=420000,而这刚好和全国各省实时数据today_province中的id对应.

In [44]:
today_province[['id','name']].head()
Out[44]:
id name
0 420000 湖北
1 440000 广东
2 410000 河南
3 330000 浙江
4 430000 湖南

png

为了进一步确认,在百度上查找全国各省的行政代码,结果发现和数据today_province中的id这一列一致,因此id这一列就是各省的行政代码。 png

因此为了得到每个省的历史数据,我们只需要将各省的行政代码作为参数传入这个地址即可,如下所示:
https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=各省行政代码
例如广东省历史数据的地址为:https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=440000
湖南省历史数据的地址为:https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=430000

但是数据中并没有显示省的名称,因此需要写入每个省的名称。 png

为了便于写入各省的名称,我们需要生成一个各省行政代码和省名称对应的字典。

以一个简单的数据为例,展示生成字典的方法。

In [45]:
a = ['1','2','3','4']
b = ['q','w','e','r']

for i,j in zip(a, b):
    print(i,j)
1 q
2 w
3 e
4 r
In [46]:
{ i:j  for i,j in zip(a, b)}
Out[46]:
{'1': 'q', '2': 'w', '3': 'e', '4': 'r'}
In [47]:
province_dict = {num:name for num,name in zip(today_province['id'],today_province['name'])}
In [48]:
# 查看前五个内容
count = 0
for i in province_dict:
    print(i,province_dict[i])
    count += 1
    if count == 5:
        break
420000 湖北
440000 广东
410000 河南
330000 浙江
430000 湖南

每一个省的列名是相同的,因此多个省的数据合并起来就可以存入一个数据中,数据合并演示的例子如下:

In [52]:
df1 = pd.DataFrame([{'a':1,'b':2,'c':3,},{'a':111,'b':222}])
df1
Out[52]:
a b c
0 1 2 3.0
1 111 222 NaN
In [53]:
df2 = pd.DataFrame([{'a':9,'b':8,'c':7,},{'a':345,'c':789}])
df2
Out[53]:
a b c
0 9 8.0 7
1 345 NaN 789
In [54]:
df1 = pd.concat([df1,df2],axis=0)
df1
Out[54]:
a b c
0 1 2.0 3.0
1 111 222.0 NaN
0 9 8.0 7.0
1 345 NaN 789.0

按照上述方法,得到每一个省的数据后,进行合并。

In [55]:
start = time.time()
for province_id in province_dict: # 遍历各省编号
    
    try:
        # 按照省编号访问每个省的数据地址,并获取json数据
        url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode='+province_id
        r = requests.get(url, headers=headers)
        data_json = json.loads(r.text)
        
        # 提取各省数据,然后写入各省名称
        province_data = get_data(data_json['data']['list'],['date'])
        province_data['name'] = province_dict[province_id]
        
        # 合并数据
        if province_id == '420000':
            alltime_province = province_data
        else:
            alltime_province = pd.concat([alltime_province,province_data])
            
        print('-'*20,province_dict[province_id],'成功',
              province_data.shape,alltime_province.shape,
              ',累计耗时:',round(time.time()-start),'-'*20)
        
        # 设置延迟等待
        time.sleep(20)
        
    except:
        print('-'*20,province_dict[province_id],'wrong','-'*20)
-------------------- 湖北 成功 (66, 13) (66, 13) ,累计耗时: 0 --------------------
-------------------- 广东 成功 (63, 13) (129, 13) ,累计耗时: 20 --------------------
-------------------- 河南 成功 (65, 13) (194, 13) ,累计耗时: 41 --------------------
-------------------- 浙江 成功 (62, 13) (256, 13) ,累计耗时: 61 --------------------
-------------------- 湖南 成功 (64, 13) (320, 13) ,累计耗时: 81 --------------------
-------------------- 安徽 成功 (64, 13) (384, 13) ,累计耗时: 101 --------------------
-------------------- 江西 成功 (63, 13) (447, 13) ,累计耗时: 123 --------------------
-------------------- 山东 成功 (64, 13) (511, 13) ,累计耗时: 143 --------------------
-------------------- 江苏 成功 (64, 13) (575, 13) ,累计耗时: 163 --------------------
-------------------- 重庆 成功 (65, 13) (640, 13) ,累计耗时: 184 --------------------
-------------------- 北京 成功 (65, 13) (705, 13) ,累计耗时: 204 --------------------
-------------------- 四川 成功 (65, 13) (770, 13) ,累计耗时: 224 --------------------
-------------------- 黑龙江 成功 (63, 13) (833, 13) ,累计耗时: 245 --------------------
-------------------- 上海 成功 (65, 13) (898, 13) ,累计耗时: 265 --------------------
-------------------- 香港 成功 (65, 13) (963, 13) ,累计耗时: 286 --------------------
-------------------- 福建 成功 (63, 13) (1026, 13) ,累计耗时: 306 --------------------
-------------------- 河北 成功 (62, 13) (1088, 13) ,累计耗时: 326 --------------------
-------------------- 广西 成功 (64, 13) (1152, 13) ,累计耗时: 346 --------------------
-------------------- 陕西 成功 (64, 13) (1216, 13) ,累计耗时: 366 --------------------
-------------------- 台湾 成功 (65, 13) (1281, 13) ,累计耗时: 387 --------------------
-------------------- 云南 成功 (64, 13) (1345, 13) ,累计耗时: 407 --------------------
-------------------- 海南 成功 (63, 13) (1408, 13) ,累计耗时: 427 --------------------
-------------------- 天津 成功 (62, 13) (1470, 13) ,累计耗时: 447 --------------------
-------------------- 贵州 成功 (65, 13) (1535, 13) ,累计耗时: 467 --------------------
-------------------- 甘肃 成功 (60, 13) (1595, 13) ,累计耗时: 487 --------------------
-------------------- 山西 成功 (62, 13) (1657, 13) ,累计耗时: 508 --------------------
-------------------- 辽宁 成功 (64, 13) (1721, 13) ,累计耗时: 528 --------------------
-------------------- 吉林 成功 (63, 13) (1784, 13) ,累计耗时: 548 --------------------
-------------------- 内蒙古 成功 (62, 13) (1846, 13) ,累计耗时: 568 --------------------
-------------------- 新疆 成功 (64, 13) (1910, 13) ,累计耗时: 589 --------------------
-------------------- 宁夏 成功 (61, 13) (1971, 13) ,累计耗时: 609 --------------------
-------------------- 澳门 成功 (66, 13) (2037, 13) ,累计耗时: 629 --------------------
-------------------- 青海 成功 (59, 13) (2096, 13) ,累计耗时: 649 --------------------
-------------------- 西藏 成功 (63, 13) (2159, 13) ,累计耗时: 669 --------------------
In [56]:
alltime_province.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2159 entries, 0 to 62
Data columns (total 13 columns):
date                  2159 non-null object
total_confirm         2159 non-null int64
total_dead            2159 non-null int64
total_heal            2159 non-null int64
total_severe          2159 non-null int64
total_suspect         2159 non-null int64
today_confirm         2159 non-null int64
today_dead            2159 non-null int64
today_heal            2159 non-null int64
today_severe          76 non-null object
today_storeConfirm    0 non-null object
today_suspect         304 non-null float64
name                  2159 non-null object
dtypes: float64(1), int64(8), object(4)
memory usage: 236.1+ KB
In [57]:
save_data(alltime_province,'alltime_province')
alltime_province_2020_03_26.csv 保存成功!

4.3 世界各国历史数据爬取

接着找到下一个数据地址,对比后发现是意大利数据,首先尝试爬取意大利的历史数据,其他国家的数据可以用同样的方法爬取。 png

In [5]:
import json
In [6]:
url_italy = 'https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=15'  # 意大利的数据地址
r = requests.get(url_italy, headers=headers) # 进行访问
italy_json = json.loads(r.text) # 导出json数据
In [7]:
italy_json.keys()
Out[7]:
dict_keys(['reqId', 'code', 'msg', 'data', 'timestamp'])
In [8]:
italy_json['data'].keys()
Out[8]:
dict_keys(['list'])

结合页面观察,发现各国家的历史数据结构和各省的类似。 png

In [9]:
italy_json['data']['list'][0] # 查看数据内容
Out[9]:
{'date': '2020-01-31',
 'lastUpdateTime': None,
 'today': {'confirm': 2,
  'dead': 0,
  'heal': 0,
  'severe': None,
  'storeConfirm': None,
  'suspect': 0},
 'total': {'confirm': 2, 'dead': 0, 'heal': 0, 'severe': 0, 'suspect': 0}}

每个国家的数据格式和之前各省的几乎一样,因此使用定义好的方法生成数据,然后把国家名称写入数据。

In [12]:
data_italy = get_data(italy_json['data']['list'],['date']) # 生成数据
data_italy['name'] = '意大利' # 写入国家名称
data_italy.head()
Out[12]:
date total_confirm total_dead total_heal total_severe total_suspect today_confirm today_dead today_heal today_severe today_storeConfirm today_suspect name
0 2020-01-31 2 0 0 0 0 2 0 0 NaN None 0.0 意大利
1 2020-02-01 2 0 0 0 0 0 0 0 NaN None 0.0 意大利
2 2020-02-02 2 0 0 0 0 0 0 0 NaN None 0.0 意大利
3 2020-02-03 2 0 0 0 0 0 0 0 NaN None 0.0 意大利
4 2020-02-04 2 0 0 0 0 0 0 0 NaN None 0.0 意大利

因为原始数据中没有国家名称,为了得到每个国家的名称,需要生成国家编号和国家名称的键值对,这样就可以存储国家名称,在之前的世界各国实时数据today_world中有国家的编号和名称,可以用它来生成键值对。

In [58]:
today_world[['id','name']].head()
Out[58]:
id name
0 9577772 突尼斯
1 9507896 塞尔维亚
2 0 中国
3 1 日本
4 2 泰国
In [59]:
country_dict = {key:value for key,value in zip(today_world['id'], today_world['name'])}
In [60]:
# 查看前五个内容
count = 0
for i in country_dict:
    print(i,country_dict[i])
    count += 1
    if count == 5:
        break
9577772 突尼斯
9507896 塞尔维亚
0 中国
1 日本
2 泰国

通过每个国家的编号访问每个国家历史数据的地址,然后获取每一个国家的历史数据。

In [61]:
start = time.time()
for country_id in country_dict: # 遍历每个国家的编号
    
    try:
        # 按照编号访问每个国家的数据地址,并获取json数据
        url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode='+country_id
        r = requests.get(url, headers=headers)
        json_data = json.loads(r.text)
        
        # 生成每个国家的数据
        country_data = get_data(json_data['data']['list'],['date'])
        country_data['name'] = country_dict[country_id]

        # 数据叠加
        if country_id == '9577772':
            alltime_world = country_data
        else:
            alltime_world = pd.concat([alltime_world,country_data])
            
        print('-'*20,country_dict[country_id],'成功',country_data.shape,alltime_world.shape,
              ',累计耗时:',round(time.time()-start),'-'*20)
        
        time.sleep(25)

    except:
        print('-'*20,country_dict[country_id],'wrong','-'*20)
-------------------- 突尼斯 成功 (16, 13) (16, 13) ,累计耗时: 0 --------------------
-------------------- 塞尔维亚 成功 (17, 13) (33, 13) ,累计耗时: 25 --------------------
-------------------- 中国 成功 (51, 13) (84, 13) ,累计耗时: 54 --------------------
-------------------- 日本 成功 (53, 13) (137, 13) ,累计耗时: 79 --------------------
-------------------- 泰国 成功 (27, 13) (164, 13) ,累计耗时: 104 --------------------
-------------------- 新加坡 成功 (43, 13) (207, 13) ,累计耗时: 129 --------------------
-------------------- 韩国 成功 (66, 13) (273, 13) ,累计耗时: 157 --------------------
-------------------- 澳大利亚 成功 (29, 13) (302, 13) ,累计耗时: 182 --------------------
-------------------- 德国 成功 (34, 13) (336, 13) ,累计耗时: 208 --------------------
-------------------- 美国 成功 (36, 13) (372, 13) ,累计耗时: 234 --------------------
-------------------- 马来西亚 成功 (29, 13) (401, 13) ,累计耗时: 259 --------------------
-------------------- 越南 成功 (20, 13) (421, 13) ,累计耗时: 284 --------------------
-------------------- 肯尼亚 成功 (7, 13) (428, 13) ,累计耗时: 311 --------------------
-------------------- 伊朗 成功 (36, 13) (464, 13) ,累计耗时: 336 --------------------
-------------------- 以色列 成功 (29, 13) (493, 13) ,累计耗时: 361 --------------------
-------------------- 黎巴嫩 成功 (17, 13) (510, 13) ,累计耗时: 388 --------------------
-------------------- 克罗地亚 成功 (20, 13) (530, 13) ,累计耗时: 414 --------------------
-------------------- 奥地利 成功 (27, 13) (557, 13) ,累计耗时: 439 --------------------
-------------------- 瑞士 成功 (29, 13) (586, 13) ,累计耗时: 464 --------------------
-------------------- 希腊 成功 (24, 13) (610, 13) ,累计耗时: 490 --------------------
-------------------- 毛里求斯 成功 (6, 13) (616, 13) ,累计耗时: 516 --------------------
-------------------- 爱沙尼亚 成功 (16, 13) (632, 13) ,累计耗时: 541 --------------------
-------------------- 北马其顿 成功 (10, 13) (642, 13) ,累计耗时: 566 --------------------
-------------------- 白俄罗斯 成功 (14, 13) (656, 13) ,累计耗时: 591 --------------------
-------------------- 立陶宛 成功 (13, 13) (669, 13) ,累计耗时: 618 --------------------
-------------------- 阿塞拜疆 成功 (15, 13) (684, 13) ,累计耗时: 643 --------------------
-------------------- 蒙古 成功 (7, 13) (691, 13) ,累计耗时: 669 --------------------
-------------------- 乌克兰 成功 (13, 13) (704, 13) ,累计耗时: 694 --------------------
-------------------- 波兰 成功 (18, 13) (722, 13) ,累计耗时: 719 --------------------
-------------------- 波斯尼亚 成功 (1, 13) (723, 13) ,累计耗时: 744 --------------------
-------------------- 波黑 成功 (13, 13) (736, 13) ,累计耗时: 770 --------------------
-------------------- 南非 成功 (17, 13) (753, 13) ,累计耗时: 796 --------------------
-------------------- 马耳他 成功 (5, 13) (758, 13) ,累计耗时: 821 --------------------
-------------------- 摩尔多瓦 成功 (13, 13) (771, 13) ,累计耗时: 846 --------------------
-------------------- 保加利亚 成功 (14, 13) (785, 13) ,累计耗时: 871 --------------------
-------------------- 孟加拉国 成功 (8, 13) (793, 13) ,累计耗时: 898 --------------------
-------------------- 阿尔巴尼亚 成功 (13, 13) (806, 13) ,累计耗时: 923 --------------------
-------------------- 巴勒斯坦 成功 (15, 13) (821, 13) ,累计耗时: 948 --------------------
-------------------- 阿富汗 成功 (14, 13) (835, 13) ,累计耗时: 973 --------------------
-------------------- 沙特阿拉伯 成功 (17, 13) (852, 13) ,累计耗时: 999 --------------------
-------------------- 新西兰 成功 (16, 13) (868, 13) ,累计耗时: 1024 --------------------
-------------------- 叙利亚 成功 (2, 13) (870, 13) ,累计耗时: 1049 --------------------
-------------------- 巴拿马 成功 (16, 13) (886, 13) ,累计耗时: 1074 --------------------
-------------------- 古巴 成功 (8, 13) (894, 13) ,累计耗时: 1099 --------------------
-------------------- 尼日利亚 成功 (11, 13) (905, 13) ,累计耗时: 1124 --------------------
-------------------- 摩洛哥 成功 (17, 13) (922, 13) ,累计耗时: 1150 --------------------
-------------------- 塞内加尔 成功 (15, 13) (937, 13) ,累计耗时: 1175 --------------------
-------------------- 老挝 成功 (1, 13) (938, 13) ,累计耗时: 1200 --------------------
-------------------- 巴哈马 成功 (1, 13) (939, 13) ,累计耗时: 1225 --------------------
-------------------- 斯洛文尼亚 成功 (17, 13) (956, 13) ,累计耗时: 1250 --------------------
-------------------- 卢森堡 成功 (16, 13) (972, 13) ,累计耗时: 1276 --------------------
-------------------- 爱尔兰 成功 (22, 13) (994, 13) ,累计耗时: 1301 --------------------
-------------------- 厄瓜多尔 成功 (17, 13) (1011, 13) ,累计耗时: 1326 --------------------
-------------------- 捷克 成功 (23, 13) (1034, 13) ,累计耗时: 1351 --------------------
-------------------- 匈牙利 成功 (21, 13) (1055, 13) ,累计耗时: 1380 --------------------
-------------------- 法属圭亚那 成功 (5, 13) (1060, 13) ,累计耗时: 1405 --------------------
-------------------- 多哥共和国 成功 (4, 13) (1064, 13) ,累计耗时: 1430 --------------------
-------------------- 哥斯达黎加 成功 (17, 13) (1081, 13) ,累计耗时: 1455 --------------------
-------------------- 文莱 成功 (13, 13) (1094, 13) ,累计耗时: 1480 --------------------
-------------------- 法罗群岛 成功 (3, 13) (1097, 13) ,累计耗时: 1506 --------------------
-------------------- 马提尼克岛 成功 (3, 13) (1100, 13) ,累计耗时: 1531 --------------------
-------------------- 荷兰 成功 (28, 13) (1128, 13) ,累计耗时: 1556 --------------------
-------------------- 巴西 成功 (23, 13) (1151, 13) ,累计耗时: 1582 --------------------
-------------------- 洪都拉斯 成功 (6, 13) (1157, 13) ,累计耗时: 1607 --------------------
-------------------- 乌拉圭 成功 (10, 13) (1167, 13) ,累计耗时: 1635 --------------------
-------------------- 秘鲁 成功 (16, 13) (1183, 13) ,累计耗时: 1660 --------------------
-------------------- 智利 成功 (20, 13) (1203, 13) ,累计耗时: 1685 --------------------
-------------------- 格陵兰 成功 (1, 13) (1204, 13) ,累计耗时: 1711 --------------------
-------------------- 圣巴托洛谬岛 成功 (1, 13) (1205, 13) ,累计耗时: 1736 --------------------
-------------------- 马尔代夫 成功 (6, 13) (1211, 13) ,累计耗时: 1761 --------------------
-------------------- 委内瑞拉 成功 (11, 13) (1222, 13) ,累计耗时: 1786 --------------------
-------------------- 毛里塔尼亚 成功 (4, 13) (1226, 13) ,累计耗时: 1812 --------------------
-------------------- 纳米比亚 成功 (4, 13) (1230, 13) ,累计耗时: 1837 --------------------
-------------------- 法属留尼汪岛 成功 (2, 13) (1232, 13) ,累计耗时: 1862 --------------------
-------------------- 波多黎各 成功 (1, 13) (1233, 13) ,累计耗时: 1887 --------------------
-------------------- 加纳 成功 (10, 13) (1243, 13) ,累计耗时: 1912 --------------------
-------------------- 赤道几内亚 成功 (5, 13) (1248, 13) ,累计耗时: 1940 --------------------
-------------------- 几内亚 成功 (3, 13) (1251, 13) ,累计耗时: 1965 --------------------
-------------------- 卢旺达 成功 (8, 13) (1259, 13) ,累计耗时: 1990 --------------------
-------------------- 斯威士兰 成功 (3, 13) (1262, 13) ,累计耗时: 2015 --------------------
-------------------- 坦桑尼亚 成功 (4, 13) (1266, 13) ,累计耗时: 2040 --------------------
-------------------- 贝宁 成功 (3, 13) (1269, 13) ,累计耗时: 2066 --------------------
-------------------- 刚果(金) 成功 (9, 13) (1278, 13) ,累计耗时: 2091 --------------------
-------------------- 中非共和国 成功 (3, 13) (1281, 13) ,累计耗时: 2116 --------------------
-------------------- 利比里亚 成功 (2, 13) (1283, 13) ,累计耗时: 2141 --------------------
-------------------- 索马里 成功 (1, 13) (1284, 13) ,累计耗时: 2166 --------------------
-------------------- 乍得 成功 (3, 13) (1287, 13) ,累计耗时: 2193 --------------------
-------------------- 赞比亚 成功 (2, 13) (1289, 13) ,累计耗时: 2218 --------------------
-------------------- 巴巴多斯 成功 (1, 13) (1290, 13) ,累计耗时: 2243 --------------------
-------------------- 马里 wrong --------------------
-------------------- 阿根廷 成功 (20, 13) (1310, 13) ,累计耗时: 2269 --------------------
-------------------- 巴林 成功 (24, 13) (1334, 13) ,累计耗时: 2294 --------------------
-------------------- 莫桑比克 成功 (3, 13) (1337, 13) ,累计耗时: 2320 --------------------
-------------------- 喀麦隆 成功 (10, 13) (1347, 13) ,累计耗时: 2345 --------------------
-------------------- 乌干达 成功 (3, 13) (1350, 13) ,累计耗时: 2370 --------------------
-------------------- 厄立特里亚 成功 (3, 13) (1353, 13) ,累计耗时: 2396 --------------------
-------------------- 刚果(布) 成功 (3, 13) (1356, 13) ,累计耗时: 2421 --------------------
-------------------- 津巴布韦 成功 (5, 13) (1361, 13) ,累计耗时: 2446 --------------------
-------------------- 丹麦 成功 (27, 13) (1388, 13) ,累计耗时: 2471 --------------------
-------------------- 斐济 成功 (1, 13) (1389, 13) ,累计耗时: 2498 --------------------
-------------------- 伯利兹 成功 (1, 13) (1390, 13) ,累计耗时: 2523 --------------------
-------------------- 缅甸 成功 (2, 13) (1392, 13) ,累计耗时: 2548 --------------------
-------------------- 塞浦路斯 成功 (14, 13) (1406, 13) ,累计耗时: 2573 --------------------
-------------------- 吉尔吉斯斯坦 成功 (4, 13) (1410, 13) ,累计耗时: 2599 --------------------
-------------------- 尼日尔 成功 (5, 13) (1415, 13) ,累计耗时: 2624 --------------------
-------------------- 苏里南 成功 (4, 13) (1419, 13) ,累计耗时: 2650 --------------------
-------------------- 佛得角 成功 (4, 13) (1423, 13) ,累计耗时: 2675 --------------------
-------------------- 萨尔瓦多 成功 (1, 13) (1424, 13) ,累计耗时: 2700 --------------------
-------------------- 圭亚那 成功 (3, 13) (1427, 13) ,累计耗时: 2725 --------------------
-------------------- 尼加拉瓜 成功 (2, 13) (1429, 13) ,累计耗时: 2751 --------------------
-------------------- 冈比亚 成功 (3, 13) (1432, 13) ,累计耗时: 2776 --------------------
-------------------- 东帝汶 成功 (1, 13) (1433, 13) ,累计耗时: 2801 --------------------
-------------------- 巴基斯坦 成功 (23, 13) (1456, 13) ,累计耗时: 2826 --------------------
-------------------- 埃及 成功 (20, 13) (1476, 13) ,累计耗时: 2851 --------------------
-------------------- 科威特 成功 (20, 13) (1496, 13) ,累计耗时: 2877 --------------------
-------------------- 斯洛伐克 成功 (18, 13) (1514, 13) ,累计耗时: 2902 --------------------
-------------------- 直布罗陀 成功 (1, 13) (1515, 13) ,累计耗时: 2927 --------------------
-------------------- 摩纳哥 成功 (10, 13) (1525, 13) ,累计耗时: 2952 --------------------
-------------------- 巴拉圭 成功 (7, 13) (1532, 13) ,累计耗时: 2977 --------------------
-------------------- 多米尼克 成功 (1, 13) (1533, 13) ,累计耗时: 3003 --------------------
-------------------- 乌兹别克斯坦 成功 (8, 13) (1541, 13) ,累计耗时: 3028 --------------------
-------------------- 黑山 成功 (5, 13) (1546, 13) ,累计耗时: 3053 --------------------
-------------------- 危地马拉 成功 (4, 13) (1550, 13) ,累计耗时: 3078 --------------------
-------------------- 加蓬 成功 (5, 13) (1555, 13) ,累计耗时: 3103 --------------------
-------------------- 苏丹 成功 (4, 13) (1559, 13) ,累计耗时: 3130 --------------------
-------------------- 利比亚 成功 (1, 13) (1560, 13) ,累计耗时: 3155 --------------------
-------------------- 圣马丁岛 成功 (1, 13) (1561, 13) ,累计耗时: 3180 --------------------
-------------------- 土耳其 成功 (16, 13) (1577, 13) ,累计耗时: 3205 --------------------
-------------------- 巴布亚新几内 成功 (1, 13) (1578, 13) ,累计耗时: 3231 --------------------
-------------------- 多米尼加 成功 (6, 13) (1584, 13) ,累计耗时: 3256 --------------------
-------------------- 约旦 成功 (13, 13) (1597, 13) ,累计耗时: 3281 --------------------
-------------------- 亚美尼亚 成功 (13, 13) (1610, 13) ,累计耗时: 3306 --------------------
-------------------- 安提瓜和巴布达 成功 (1, 13) (1611, 13) ,累计耗时: 3331 --------------------
-------------------- 玻利维亚 成功 (6, 13) (1617, 13) ,累计耗时: 3357 --------------------
-------------------- 哥伦比亚 成功 (15, 13) (1632, 13) ,累计耗时: 3382 --------------------
-------------------- 法国 成功 (32, 13) (1664, 13) ,累计耗时: 3407 --------------------
-------------------- 阿联酋 成功 (21, 13) (1685, 13) ,累计耗时: 3432 --------------------
-------------------- 加拿大 成功 (29, 13) (1714, 13) ,累计耗时: 3458 --------------------
-------------------- 印度 成功 (24, 13) (1738, 13) ,累计耗时: 3483 --------------------
-------------------- 英国 成功 (31, 13) (1769, 13) ,累计耗时: 3510 --------------------
-------------------- 意大利 成功 (55, 13) (1824, 13) ,累计耗时: 3535 --------------------
-------------------- 俄罗斯 成功 (22, 13) (1846, 13) ,累计耗时: 3560 --------------------
-------------------- 菲律宾 成功 (20, 13) (1866, 13) ,累计耗时: 3585 --------------------
-------------------- 芬兰 成功 (26, 13) (1892, 13) ,累计耗时: 3612 --------------------
-------------------- 尼泊尔 成功 (3, 13) (1895, 13) ,累计耗时: 3639 --------------------
-------------------- 葡萄牙 成功 (16, 13) (1911, 13) ,累计耗时: 3664 --------------------
-------------------- 塞舌尔 成功 (3, 13) (1914, 13) ,累计耗时: 3690 --------------------
-------------------- 西班牙 成功 (32, 13) (1946, 13) ,累计耗时: 3715 --------------------
-------------------- 斯里兰卡 成功 (15, 13) (1961, 13) ,累计耗时: 3740 --------------------
-------------------- 阿尔及利亚 成功 (17, 13) (1978, 13) ,累计耗时: 3765 --------------------
-------------------- 柬埔寨 成功 (13, 13) (1991, 13) ,累计耗时: 3791 --------------------
-------------------- 海地 成功 (2, 13) (1993, 13) ,累计耗时: 3816 --------------------
-------------------- 瑞典 成功 (27, 13) (2020, 13) ,累计耗时: 3841 --------------------
-------------------- 特立尼达和多巴哥 成功 (1, 13) (2021, 13) ,累计耗时: 3867 --------------------
-------------------- 吉布提 wrong --------------------
-------------------- 布基纳法索 成功 (10, 13) (2031, 13) ,累计耗时: 3892 --------------------
-------------------- 比利时 成功 (27, 13) (2058, 13) ,累计耗时: 3918 --------------------
-------------------- 伊拉克 成功 (28, 13) (2086, 13) ,累计耗时: 3943 --------------------
-------------------- 冰岛 成功 (23, 13) (2109, 13) ,累计耗时: 3968 --------------------
-------------------- 几内亚比绍 wrong --------------------
-------------------- 拉脱维亚 成功 (17, 13) (2126, 13) ,累计耗时: 3993 --------------------
-------------------- 不丹 成功 (1, 13) (2127, 13) ,累计耗时: 4020 --------------------
-------------------- 挪威 成功 (26, 13) (2153, 13) ,累计耗时: 4045 --------------------
-------------------- 印度尼西亚 成功 (18, 13) (2171, 13) ,累计耗时: 4070 --------------------
-------------------- 安哥拉 成功 (3, 13) (2174, 13) ,累计耗时: 4095 --------------------
-------------------- 埃塞俄比亚 成功 (6, 13) (2180, 13) ,累计耗时: 4121 --------------------
-------------------- 梵蒂冈 成功 (1, 13) (2181, 13) ,累计耗时: 4146 --------------------
-------------------- 科特迪瓦 成功 (6, 13) (2187, 13) ,累计耗时: 4171 --------------------
-------------------- 卡塔尔 成功 (18, 13) (2205, 13) ,累计耗时: 4196 --------------------
-------------------- 格鲁吉亚 成功 (17, 13) (2222, 13) ,累计耗时: 4222 --------------------
-------------------- 墨西哥 成功 (20, 13) (2242, 13) ,累计耗时: 4247 --------------------
-------------------- 圣马力诺 成功 (11, 13) (2253, 13) ,累计耗时: 4272 --------------------
-------------------- 哈萨克斯坦 成功 (12, 13) (2265, 13) ,累计耗时: 4297 --------------------
-------------------- 安道尔 成功 (10, 13) (2275, 13) ,累计耗时: 4322 --------------------
-------------------- 牙买加 成功 (5, 13) (2280, 13) ,累计耗时: 4348 --------------------
-------------------- 罗马尼亚 成功 (21, 13) (2301, 13) ,累计耗时: 4373 --------------------
-------------------- 阿曼 成功 (19, 13) (2320, 13) ,累计耗时: 4398 --------------------
-------------------- 列支敦士登 成功 (4, 13) (2324, 13) ,累计耗时: 4423 --------------------
-------------------- 马达加斯加 成功 (2, 13) (2326, 13) ,累计耗时: 4448 --------------------
In [62]:
alltime_world.shape
Out[62]:
(2326, 13)
In [63]:
save_data(alltime_world,'alltime_world')
alltime_world_2020_03_26.csv 保存成功!

5.总结

本篇案例的主要内容是新冠肺炎疫情的数据采集,首先我们寻找合适的数据源,最终选择网易的实时疫情播报平台作为数据源,然后逐步地解析找到我们需要的数据,最后通过python爬虫获得我们得到了疫情的数据,包括中国各省和世界各国的实时数据,还包括中国整体、中国各省、世界各国的历史数据。通过这样一篇数据采集的案例让同学们学习到爬虫的基本方法,掌握这些方法能够提升数据采集的能力,并且可以使用在以后的学习和工作中。

注意:因为爬虫的对象是网页上的数据,如果这些网页的数据内容有所变动可能会导致采集无效。