本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/m0_60750293/article/details/128104783?spm=1001.2014.3001.5501
1. 选择数据源
本案例以网易新闻疫情播报平台为数据源,它是一个实时动态的平台,本文通过python的requests库爬取数据。其地址如下:
https://wp.m.163.com/163/page/news/virus_report/index.html?nw=1&anw=1
2. 数据爬取
#导入爬虫以及数据分析所需的库
import requests #数据爬虫
import pandas as pd #数据分析及保存
import time #设置时间按索引
#设置请求头,伪装浏览器
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.42'}
#发起请求,找到数据源
url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-total?t=333859159312'#定义访问的地址
r = requests.get(url,headers = headers) #使用requests发起请求
print(r.status_code) #查看请求状态,200表示请求成功
print(type(r.text))
print(len(r.text))#数据31万多
可以看到返回的内容是31万的字符串文本,在网页预览中数据是字典json格式,因此需要转换为json格式,方便阅读。
import json
data_json = json.loads(r.text)
data_json.keys() #查看爬取文本的键值
dict_keys([‘reqId’, ‘code’, ‘msg’, ‘data’, ‘timestamp’])
data = data_json['data'] #数据存储在data中,取出json中的数据
data.keys()
dict_keys([‘chinaTotal’, ‘chinaDayList’, ‘lastUpdateTime’, ‘overseaLastUpdateTime’, ‘areaTree’])
数据中总共有四个键,每个键存储着不同的内容:
键名称 | 数据内容 |
---|---|
chinaTotal | 全国当日数据 |
chinaDayList | 全国历史数据 |
lastUpdateTime | 更新时间 |
areaTree | 世界各地实时数据 |
oversealastUpdateTime | 海外更新时间 |
接下来我们分别获取全国各省实时数据,河南省实时累计确诊数据和河南省历史数据。
2.1 全国各省实时数据爬取
data_province = data['areaTree'][2]['children'] #取出中国各省的实时数据
type(data_province)
list
data_province(全国各省实时数据)是列表格式,每个元素是一个省的实时数据,并且为字典格式,每个省的键名称全部相同。
data_province[0].keys() #查看每个省键名称
dict_keys([‘today’, ‘total’, ‘extData’, ‘name’, ‘id’, ‘lastUpdateTime’, ‘children’])
各省数据键值含义如下:
键名称 | 数据内容 |
---|---|
today | 各省当日数据 |
total | 各省当日累计数据 |
extData | 无任何数据 |
name | 各省名称 |
id | 各省行政编号 |
lastUpdateTime | 更新时间 |
children | 各省下一级数据 |
for i in range(len(data_province)): # 遍历查看各省名称、更新时间
print(data_province[i]['name'],data_province[i]['lastUpdateTime'])
if i == 9: # 查看前10个省
break
台湾 2022-11-29 09:20:16
香港 2022-11-29 09:20:17
湖北 2022-11-29 09:36:16
上海 2022-11-29 08:21:10
吉林 2022-11-29 09:36:15
广东 2022-11-29 10:23:18
北京 2022-11-29 09:20:17
四川 2022-11-29 11:22:21
海南 2022-11-29 10:23:17
内蒙古 2022-11-29 09:36:16
pd.DataFrame(data_province).head() # DataFrame以字典格式直接生成数据效果并不理想
结果图
- 不能直接生成DataFrame是因为数据中嵌套着字典,例如台湾today。
- children为下一地级数据,我们只分析到省单位,因此各省的children数据不采集;extData为空值,也不采集
- 不需要采集的数据:children、extData。
- 需要采集的数据:由于数据中today和total嵌套着字典,因此不能直接获取,对于id、lastUpdateTime、name、可以直接取出为一个数据,today为一个数据,total为一个数据,最后三个数据合并为一个数据。
# 获取id、lastUpdateTime、name
info = pd.DataFrame(data_province)[['id','lastUpdateTime','name']]
info.head()
结果图
# 获取today中的数据
today_data = pd.DataFrame([province['today'] for province in data_province ])
today_data.head()
结果图
today_data.columns = ['today_'+i for i in today_data.columns] # 由于today中键名和total键名相同,因此需要修改列名称
today_data.head()
结果图
# 获取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()
结果图
#result = pd.concat([df1, df2], axis= ‘ ')
#①axis=0,纵向拼接(默认)
#②axis=1,横向拼接
pd.concat([info,total_data,today_data],axis=1).head() # 将三个数据合并,横向拼接
结果图
# 将提取数据的方法封装为函数,便于提取河南省实时累计确诊数据,河南省历史数据
def get_data(data,info_list):
info = pd.DataFrame(data)[info_list] # 获取id、lastUpdateTime、name数据
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横向合并最终得到汇总的数据
today_province = get_data(data_province,['id','lastUpdateTime','name']) #验证上面定义的函数get_data()
today_province.head()
结果图
# 将保存数据的方法封装为函数,便于保存河南省实时累计确诊数据,河南省历史数据
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+' 保存成功!')
#返回时间戳--返回struct_time对象--返回字符串形式
time.strftime('%Y_%m_%d',time.localtime(time.time()))
‘2022_11_29’
save_data(today_province,'today_province') #运行保存数据save_data函数,获取了全国各省实时数据。
today_province_2022_11_29.csv 保存成功!
2.2 河南省实时累计确诊数据爬取
# 统计省份信息
province = data['areaTree'][2]['children']
henan = province[10]
henan.keys()#查看河南省实时数据键
dict_keys([‘today’, ‘total’, ‘extData’, ‘name’, ‘id’, ‘lastUpdateTime’, ‘children’])
henan['children'][0]['total'] # 查看河南省郑州市实时累计数据
{‘confirm’: 4351, ‘dead’: 0, ‘heal’: 0, ‘severe’: 0, ‘suspect’: 0}
# 获取total_confirm(累计确诊)数据
henan_children_total_data = {}
for item in henan['children']:
if item['name'] not in henan_children_total_data:
henan_children_total_data.update({item['name']:0}) #将数据添加到henan_children_total_data数据集中
henan_children_total_data[item['name']] += int(item['total']['confirm'])
print(henan_children_total_data)
{‘郑州’: 4351, ‘安阳’: 579, ‘许昌’: 578, ‘信阳’: 297, ‘境外输入’: 229, ‘周口’: 184, ‘驻马店’: 163, ‘南阳’: 162, ‘商丘’: 114, ‘平顶山’: 72, ‘开封’: 58, ‘新乡’: 57, ‘洛阳’: 54, ‘漯河’: 53, ‘焦作’: 46, ‘濮阳’: 44, ‘济源示范区’: 38, ‘未明确地区’: 29, ‘鹤壁’: 25, ‘三门峡’: 11, ‘济源’: 0, ‘境外输入人员’: 0}
2.3 河南省历史数据爬取
#设置请求头,伪装浏览器
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.42'
}
#发起请求,找到数据源
url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=410000&t=1669455931540' # 定义要访问的地址
q = requests.get(url, headers=headers) # 使用requests发起请求
print(r.status_code) # 查看请求状态
200
print(type(q.text))
print(len(q.text))
<class ‘str’>
263483
import json
data_json = json.loads(q.text)
data_json.keys()
dict_keys([‘reqId’, ‘code’, ‘msg’, ‘data’, ‘timestamp’])
data_json['data']['list'][0]
{‘date’: ‘2020-01-21’,
‘extData’: None,
‘lastUpdateTime’: None,
‘today’: {‘confirm’: 0,
‘dead’: 0,
‘heal’: 0,
‘input’: 0,
‘severe’: None,
‘storeConfirm’: 0,
‘suspect’: 0},
‘total’: {‘confirm’: 1,
‘dead’: 0,
‘heal’: 0,
‘input’: 0,
‘severe’: None,
‘storeConfirm’: 1,
‘suspect’: 0}}
可以看出河南省历史数据的数据格式和之前的全国各省实时数据的数据结构一样,因此可以使用之前的方法得到数据,get_data()函数。
#def get_data(data,info_list)
alltime_henan = get_data(data_json['data']['list'],['date'])
alltime_henan.head()
结果图
#def save_data(data,name)
save_data(alltime_henan,'alltime_henan') #运行保存数据save_data函数,获取了河南省历史数据。
alltime_henan_2022_11_29.csv 保存成功!
码字不易,切记白嫖,记得点赞加关注再走!!!