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

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

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

相关推荐
Cloud_Shy6181 小时前
Python 数据分析基础入门:《Excel Python:飞速搞定数据分析与处理》学习笔记系列(第十二章 用户定义函数 上篇)
python·数据分析·excel·pandas
深蓝电商API1 小时前
爬虫任务调度系统:基于Celery的定时+触发式采集方案
爬虫
WL_Aurora4 小时前
Python爬虫实战(七):Selenium自动化采集苏宁易购商品数据
爬虫·python·selenium
星越华夏6 小时前
pandas日期类型差值timedelta大于等于7天
pandas
Python私教17 小时前
Playwright MCP 用 a11y 树抓页面:比全量 DOM 省 token 的采集 Agent
爬虫
枫叶林FYL20 小时前
项目九:异步高性能爬虫与数据采集中枢 —— 基于 Crawl<sub>4</sub>AI 与 Playwright 的现代化数据采集平台 项目总览
爬虫·python·深度学习·wpf
上海云盾-小余1 天前
恶意爬虫精准拦截:网站流量净化与资源守护方案
网络·爬虫·web安全
小白学大数据1 天前
深度探索:Python 爬虫实现豆瓣音乐全站采集
开发语言·爬虫·python·数据分析
烟雨江南aabb1 天前
Python第六弹:python爬虫篇:什么是爬虫
开发语言·爬虫·python
深蓝电商API1 天前
分布式电商爬虫架构:Scrapy-Redis+消息队列的集群部署
分布式·爬虫·架构