爬虫数据清洗:Pandas 处理缺失值与异常

在网络爬虫实战中,爬取到的原始数据往往存在字段缺失、格式混乱、数值异常、重复冗余等问题,直接用于分析或入库会严重影响结果准确性。Pandas 作为 Python 数据处理的核心库,提供了简洁高效的缺失值与异常值处理方案。本文从爬虫场景出发,系统讲解如何用 Pandas 完成数据清洗关键步骤。

一、爬虫数据为什么必须做清洗?

爬虫数据天生 "不干净",常见问题包括:

  • 部分页面加载失败,导致字段为空(None''NaN
  • 反爬机制触发,返回占位符或无效字符
  • 网页结构变更,部分字段抓取不到
  • 数值型数据混入文字、符号,出现极端异常值
  • 重复请求造成重复数据

未经清洗的数据会导致:统计错误、模型失效、入库失败、业务决策偏差。因此,数据清洗是爬虫流程中必不可少的一环

二、环境准备与数据读入

首先安装并导入依赖库,读取爬虫保存的 CSV/Excel 原始数据:

python

运行

复制代码
import pandas as pd
import numpy as np

# 读取爬虫数据(CSV/Excel)
df = pd.read_csv("spider_data.csv")
# 查看数据基本信息
df.head()
df.info()
df.describe()

三、缺失值识别与处理

1. 缺失值识别

Pandas 提供快速定位缺失值的方法:

python

运行

复制代码
# 查看每列是否存在缺失
df.isnull().sum()
# 查看缺失值占比
df.isnull().mean() * 100
# 筛选存在缺失的行
df[df.isnull().any(axis=1)]

爬虫中常见的 "伪缺失":空字符串、-暂无null 字符串,需先统一转为 NaN

python

运行

复制代码
# 将自定义缺失标记转为 NaN
df.replace(["", "-", "暂无", "null", "None"], np.nan, inplace=True)

2. 缺失值处理策略

根据业务场景选择处理方式:

(1)删除缺失值

适用于缺失比例低、字段不重要的场景:

python

运行

复制代码
# 删除包含任何缺失的行
df.dropna(inplace=True)
# 只删除指定列缺失的行
df.dropna(subset=["title", "price"], inplace=True)
# 缺失占比过高直接删列
df.drop(columns=["useless_col"], inplace=True)
(2)填充缺失值

分类字段:用众数、固定值填充

python

运行

复制代码
df["category"].fillna("其他", inplace=True)
df["source"].fillna(df["source"].mode()[0], inplace=True)

数值字段:用均值、中位数、0 填充

python

运行

复制代码
df["price"].fillna(df["price"].median(), inplace=True)
df["view_count"].fillna(0, inplace=True)

时间 / 文本字段:向前 / 向后填充

python

运行

复制代码
df["publish_time"].fillna(method="ffill", inplace=True)  # 前向填充
df["content"].fillna("无描述", inplace=True)

四、异常值识别与处理

异常值指明显偏离正常范围的数据(如价格为负数、浏览量超大、日期异常),是爬虫数据高频问题。

1. 异常值常用检测方法

(1)描述统计筛选

python

运行

复制代码
# 查看数值列极值
df.describe()
# 筛选异常范围数据
abnormal_price = df[(df["price"] < 0) | (df["price"] > 100000)]
(2)四分位数(IQR)法

适用于连续数值,自动识别离群点:

python

运行

复制代码
def detect_abnormal_iqr(data, col):
    Q1 = data[col].quantile(0.25)
    Q3 = data[col].quantile(0.75)
    IQR = Q3 - Q1
    lower = Q1 - 1.5 * IQR
    upper = Q3 + 1.5 * IQR
    return data[(data[col] < lower) | (data[col] > upper)]

# 调用检测
abnormal = detect_abnormal_iqr(df, "price")

2. 异常值处理方案

  • 删除异常行:明显错误且无法修正
  • 替换为合理值:用均值、中位数、边界值覆盖
  • 标记为异常:新增列标注,不删除原数据

python

运行

复制代码
# 价格异常替换为中位数
df.loc[df["price"] > 10000, "price"] = df["price"].median()
# 新增异常标记列
df["is_abnormal"] = np.where(df["view_count"] > 1000000, 1, 0)

五、爬虫数据清洗通用流程

实际项目中推荐固定清洗 pipeline:

  1. 读取爬虫原始数据
  2. 统一列名、去除无用列
  3. 转换数据类型(字符串转数值、时间格式化)
  4. 处理缺失值(识别→替换→填充 / 删除)
  5. 处理异常值(检测→修正 / 标记)
  6. 去重、格式统一
  7. 输出清洗后数据

python

运行

复制代码
# 最终去重
df.drop_duplicates(subset=["url"], inplace=True)
# 保存清洗结果
df.to_csv("spider_data_clean.csv", index=False, encoding="utf-8-sig")

六、总结

Pandas 为爬虫数据清洗提供了一站式解决方案:

  • 缺失值:先识别占比,再按字段类型选择删除 / 填充
  • 异常值:用统计方法定位,结合业务逻辑修正
  • 核心原则:不盲目删数据、不随意填值,始终贴合爬虫业务场景

掌握这套方法,能大幅提升爬虫数据质量,为后续数据分析、可视化、机器学习打下坚实基础。

相关推荐
源码之家6 小时前
计算机毕业设计:基于Python的美食推荐分析系统 Django框架 爬虫 协同过滤推荐算法 可视化 推荐系统 数据分析 大数据(建议收藏)✅
爬虫·python·机器学习·django·flask·课程设计·美食
源码之家13 小时前
计算机毕业设计:基于Python与协同过滤的美食推荐系统 Django框架 可视化 协同过滤推荐算法 菜谱 食品 机器学习(建议收藏)✅
爬虫·python·机器学习·django·毕业设计·课程设计·美食
bryant_meng13 小时前
【Spider】Finding API Keys
爬虫·图库
进击的雷神14 小时前
攻克HTML属性数据埋点与分页偏移陷阱:基于data-id属性提取的精准爬虫设计
前端·爬虫·html·spiderflow
进击的雷神15 小时前
攻克POST动态加载与字段缺失容错:基于偏移量计算的双路条件分支爬虫设计
爬虫·spiderflow
Python大数据分析@15 小时前
Pandas相比Excel的优势是哪些?
excel·pandas
源码之家15 小时前
计算机毕业设计:基于Python的美食菜谱数据分析可视化系统 Django框架 爬虫 机器学习 数据分析 可视化 食物 食品 菜谱(建议收藏)✅
爬虫·python·数据分析·django·flask·课程设计·美食
喵手1 天前
Python爬虫实战:手把手教你Python 自动化构建志愿服务岗位结构化数据库!
爬虫·python·自动化·数据采集·爬虫实战·零基础python爬虫教学·志愿服务岗位结构数据库打造
小邓睡不饱耶2 天前
Python多线程爬虫实战:爬取论坛帖子及评论
开发语言·爬虫·python
喵手2 天前
Python爬虫实战:手把手教你如何采集开源字体仓库目录页(Google Fonts / 其他公开字体目录)!
爬虫·python·自动化·数据采集·爬虫实战·零基础python爬虫教学·开源字体仓库目录页采集