以网易的疫情播报平台为例,因为它的数据内容非常丰富,不仅包括国内的数据还包括国外的数据,且作为大平台,公信度也比较高。因此我选择网易的疫情实时动态播报平台作为数据源,
其地址如下:网易疫情播报平台
进入Network标签下的XHR,按下“Ctrl+R”刷新即可
先找到①的位置,点击进入,然后可以找到② data的字段,这里面就存放着我们想要的国内的和国外疫情的数据源。
接下来找到其地址,点击headers后进行查看,在url中?后边为参数,可以不要,因此我们需要请求的地址为:https://c.m.163.com/ug/api/wuhan/app/data/list-total ,
并且可以看到请求方法为get,同时查看自己浏览器的user-agent,使用requests请求时,设置user-agent伪装浏览器。
再开始写代码之前最好是多翻看这里的数据,搞明白这里的数据结构,以便于后面代码的实现。
完整代码如下
import json
import time
import os
import requests
import pandas as pd
def get_html(Url, header):
try:
r = requests.get(url=Url, headers=header)
r.encoding = r.apparent_encoding
status = r.status_code
# 将原始数据类型转换为json类型,方便处理
data_json = json.loads(r.text)
print(status)
return data_json
except:
print("爬取失败")
# 将提取34个省数据的方法封装为函数
def get_data(data, info_list):
# 直接提取["id","name","lastUpdateTime"] 的数据
info = pd.DataFrame(data)[info_list]
# 获取today的数据
today_data = pd.DataFrame([province["today"] for province in data])
# 修改列名
today_data.columns = ["today_" + i for i in today_data.columns]
# 获取total的数据
total_data = pd.DataFrame([province["total"] for province in data])
# 修改列名
total_data.columns = ["total_" + i for i in total_data.columns]
return pd.concat([info, today_data, total_data], axis=1)
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")
# 检查是否保存成功,并打印提示文本
if os.path.exists(file_name):
print(file_name + " 保存成功")
else:
print('保存失败')
if __name__ == "__main__":
# 访问网易实时疫情播报平台网址
url = "https://c.m.163.com/ug/api/wuhan/app/data/list-total"
# 设置请求头,伪装为浏览器
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'
}
"""爬取中国各省的疫情数据"""
# 1.获取数据(此时的数据未经处理)
datas = get_html(url, headers)
# 2.找到储存中国34省的数据所在
data_province = datas["data"]["areaTree"][2]["children"]
# 3.提取34个省数据
all_data = get_data(data_province, ["id", "name", "lastUpdateTime"])
# 4.持久化保存数据
save_data(all_data, "today_province")
这是在Jupyter中一步步探索实现的截图:
这有助于我们一步步的了解数据源的结构,以便代码的封装书写。
只需在上面的代码末尾直接加上这段代码就可以了。
"""爬取世界各国的疫情数据"""
world_data = datas["data"]["areaTree"]
worlds_data = get_data(world_data, ["id", "name", "lastUpdateTime"])
save_data(worlds_data, "today_worlds")
这时你可能就会蒙圈了,为什么呢?
这是因为国外的数据是在
json数据data
中的areaTree
是列表格式,每个元素都是一个国家的实时数据,每个元素的children
是各国家省份的数据,
而在areaTree
键值对下,
areaTree —> 2 --> children 。就是我国各省的实时数据
如果你没有仔细查看网页里数据结构,name现在应该有所明白的吧!
现在你也还可以继续回到网页继续翻看存放数据源的结构。
pyecharts数据可视化:对爬取的新冠疫情数据进行可视化(二)
部分结果展示: