python 爬虫


本站所有文章均为原创,欢迎转载,请注明文章出处: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以字典格式直接生成数据效果并不理想

结果图](https://img-blog.csdnimg.cn/481436ee86d34ffbbc4cfd2eda836672.png)

  • 不能直接生成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()

结果图
](https://img-blog.csdnimg.cn/0fecd67e4e4b44e5962ea62047020d5d.png)

# 获取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 保存成功!

码字不易,切记白嫖,记得点赞加关注再走!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值