爬虫数据清洗: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 为爬虫数据清洗提供了一站式解决方案:

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

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

相关推荐
去码头整点薯条ing2 小时前
猿人学第二届第一题【魔改标准算法】
爬虫·python
喵手2 小时前
Python爬虫实战:深度索引 - 基于关键词矩阵模拟与语义打捞的语料库构建实战!
爬虫·python·爬虫实战·语料库·零基础python爬虫教学·基于关键词矩阵模拟·语义打捞
喵手3 小时前
Python爬虫实战:爬取得到App电子书畅销榜 - 从零到交付的完整实战!
爬虫·python·爬虫实战·零基础python爬虫教学·爬取app电子书畅销榜·app电子书畅销榜单数据获取
tang777891 天前
深挖66免费代理网站:隐藏功能与真实体验报告
爬虫·python·网络爬虫·ip
电商API_180079052471 天前
电商评论数据爬虫:情感分析与数据可视化实战
大数据·人工智能·爬虫·信息可视化·数据分析
王解1 天前
从自然语言到爬虫工作流:深入解析 ScrapeGraphAI 的原理与架构思维
爬虫·架构·scrapegraphai
有代理ip2 天前
常见数据采集问题及实操解决方案
爬虫·网络协议·http·golang·ssl
沄媪2 天前
Libvio.link爬虫技术技术
爬虫
深蓝电商API2 天前
模拟登录状态保持:Session与Token管理
爬虫·python