前面我们已经总结了2个Python简易爬虫:电影票房排行榜豆瓣电影Top250,本篇我们继续 Python简易爬虫 系列,这次我们要爬取的是新冠疫情数据。


1. 确定爬取目标

这个Case中我们要爬取的目标是百度的新冠疫情数据:

网址:https://voice.baidu.com/act/newpneumonia/newpneumonia/?from=osari_aladin_banner

内容:


2. 分析数据源

在Chrome浏览器中打开网址,右键检查,确定以下内容:


3. 开发代码

# 导入要用的包
import numpy as np
import pandas as pd
import time
import re
import requests
import json


# 请求数据
url = 'https://voice.baidu.com/act/newpneumonia/newpneumonia/?from=osari_aladin_banner'
response = requests.get(url=url)
response.encoding = 'utf-8'
text = response.text


# 解析数据
component_str = re.findall('"component":\[(.*)\],', text)[0]  # 数据存储在 "component":[...] 中,用正则提取[...]这部分内容
component_json = json.loads(component_str)  # 将JSON格式的字符串转成字典类型
caseList = component_json['caseList']  # 数据存储在caseList中,从字典中提取
raw_data = pd.DataFrame(caseList, dtype='str')  # 将数据转成DataFrame类型


# 筛选数据
keep_cols = ['area','confirmed', 'died', 'crued', 'confirmedRelative', 'diedRelative', 'curedRelative', 'asymptomaticRelative', 'asymptomatic','nativeRelative', 'curConfirm', 'curConfirmRelative', 'overseasInputRelative', 'updateTime']  # 只保留想要的列
data = raw_data[keep_cols].copy()


# 清洗数据
for col in data.columns:
    if col != 'area':
        data[col] = pd.to_numeric(data[col], downcast='integer')  # 先转换成数值类型才能用fillna
        data[col].fillna(0, inplace=True)  # 将空值填充为0
        data[col] = data[col].astype('int64')   # 转成int64类型

data['updateTime'] = pd.to_datetime(data['updateTime'], unit='s').dt.strftime('%Y-%m-%d %H:%M:%S')  # 时间格式

data.rename(columns={'area': '地区',
                    'confirmed': '累计确诊',
                    'died': '累计死亡',
                    'crued': '累计治愈',
                    'confirmedRelative': '新增确诊',
                    'diedRelative': '新增死亡',
                    'curedRelative': '新增治愈',
                    'asymptomaticRelative': '新增无症状',
                    'asymptomatic': '累计无症状',
                    'nativeRelative': '新增本土',
                    'overseasInputRelative': '新增境外',
                    'curConfirm': '现有确诊',
                    'curConfirmRelative': '新增现有确诊',
                    'updateTime': '更新时间'}, inplace=True)  # 重命名列名


# 保存数据
data.to_excel('新冠疫情数据.xlsx', index=False)  # 保存到本地

最终我们成功爬取到新冠疫情数据,数据如下:


4. 小结

之前的Case中我们是先用BeautifulSoup解析网页内容,然后再逐一提取标签内容。但在这个Case中,我们是直接使用正则来提取目标内容,同时数据源使用的是JSON格式,所以我们很容易将其转换为DataFrame以做后续处理。


原创文章,转载请务必注明出处并留下原文链接。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注