Python 爬虫数据处理:爬虫脏数据分类清洗剔除广告、空格无效内容
2026/6/6 23:51:30 网站建设 项目流程

前言

爬虫自动化采集天然伴随数据源杂质干扰,网页页面混杂悬浮广告、弹窗推广、冗余空格、转义字符、空值乱码、特殊占位符号、无效链接等各类脏数据,原始入库数据中脏数据占比轻则 15%~30%,极端资讯、论坛类站点脏数据可达 50% 以上。未经过滤的脏数据直接存入 Parquet、MySQL 等存储介质,不仅占用额外存储空间、拖慢后续数据统计与查询效率,还会干扰数据分析、报表统计、机器学习样本训练等下游业务。传统逐行人工筛选剔除的处理方式无法适配十万、百万级爬虫海量数据集,基于 Python 结构化工具搭建标准化脏数据分类清洗流水线,按照数据污染类型拆分清洗规则,实现自动化过滤、修正、剔除全流程,成为爬虫数据工业化落地的必要环节。

本文依托 pandas、re 正则、unicodedata、jieba 分词四类主流工具,划分空白类、广告垃圾类、格式异常类、乱码特殊字符类四大脏数据体系,结合实战电商、资讯爬虫原始数据集,搭建模块化清洗代码,配套规则对照表、多场景案例与底层原理解析,落地单机批量清洗与分布式分片清洗两套方案。

本文所需依赖官方资源链接整理如下:

  1. pandas 官方文档:结构化数据集批量处理核心库
  2. Python re 正则标准库:正则表达式过滤垃圾文本
  3. unicodedata 官方文档:全角符号、特殊空白字符规范化处理
  4. jieba 分词官网:关键词匹配广告文本分词工具
  5. openpyxl 文档:辅助样本导出校验清洗效果

一、爬虫脏数据分类与污染来源明细

1.1 四大类脏数据明细与产生诱因

结合海量爬虫落地经验,将采集脏数据划分为四大分类,整理各类数据特征、产生原因、业务危害明细表格:

表格

脏数据分类典型数据表现污染来源入库负面影响
空白冗余类脏数据首尾全角 / 半角空格、换行符 \n、制表符 \t、全空白字符串、仅含换行无有效文本HTML 标签空格、前端排版占位标签、页面空段落标签字段长度虚高,分组统计产生大量空分组,占用存储
广告推广类脏数据夹杂招商广告、导购链接、引流话术、联系方式、优惠推广文案、第三方商品植入文本正文内嵌悬浮广告、评论区灌水广告、站点联盟推广植入污染正文样本,文本分类、关键词提取结果失真
格式异常类脏数据时间格式错乱、价格混入中文符号、手机号穿插特殊字符、字段类型混杂、无效占位符###/----页面动态 JS 渲染占位、历史数据格式不统一、富文本编辑器遗留标记无法直接转换数据类型,数值统计运算报错
乱码特殊字符类脏数据不可见控制字符、全角标点、emoji 表情、繁体异体字符、HTML 实体符 /&前端 HTML 转义、多编码混合页面、用户评论特殊符号输入中文分词错乱,数据库索引异常,导出报表乱码

1.2 清洗整体架构思路

整体清洗流程遵循分类校验→单字段精细化清洗→全字段规则过滤→异常数据分离归档→合规数据输出存储五层逻辑:首先按字段属性区分文本型、数值型、日期型字段,不同字段绑定专属清洗规则;再依次去除空白、剔除广告、修正格式、过滤乱码;最后将无法修复的脏数据单独归档存储,便于人工复核,合格数据写入 Parquet 或数据库。

二、环境依赖部署与原始脏数据构造

2.1 依赖安装指令

一键安装全量清洗所需第三方库:

bash

运行

pip install pandas==2.1.4 jieba==0.42.1 openpyxl==3.1.2

2.2 构造含各类脏数据的爬虫原始样本

模拟资讯爬虫采集结果,构造包含全部四类脏数据的 DataFrame 原始数据集,用于后续清洗代码验证:

python

运行

import pandas as pd # 构造原始脏数据样本 raw_data = [ [" 2025新款手机评测\n\t", "手机限时特惠,点击链接领优惠券https://ad.test.com", "¥3999###", "华为旗舰👍"], [" ", "厂家直销全网最低价,微信13800138000选购", "价格未知----", "安卓旗舰\u200b"], ["数码测评:骁龙处理器实测", "本站推广:加盟开店月入过万", "¥ 2999", "处理器性能&跑分优异"] ] df_raw = pd.DataFrame(raw_data, columns=["title", "content", "price", "intro"]) print("原始脏数据预览:") print(df_raw)
构造逻辑说明

title 字段混入首尾空格、换行制表符;content 内嵌广告链接、招商文案、手机号;price 混杂中文钱币符号、无效占位符;intro 包含 emoji、零宽不可见字符、HTML 实体字符,完整覆盖四大脏数据场景。

三、模块化分类型脏数据清洗实战代码与原理

按照脏数据四大分类,拆分独立清洗函数,实现功能解耦,便于后续新增规则时单独修改对应模块,整体分为空白清洗、广告过滤、格式修正、乱码剔除四大功能模块。

3.1 第一模块:空白冗余类数据自动化清洗

3.1.1 单文本清洗函数实现

python

运行

import re import unicodedata def clean_blank_text(text: str) -> str: """清洗各类空白、换行、制表符、全角空格""" if pd.isna(text): return "" # 统一转为字符串 text = str(text) # 第一步:去除各类不可见空白字符(全角空格、零宽空格等) text = unicodedata.normalize("NFKC", text) # 正则剔除换行\n、制表\t、回车\r text = re.sub(r"[\n\t\r]", "", text) # 剔除首尾半角、全角空格 text = re.sub(r"^\s+|\s+$", "", text) return text
底层原理解析
  1. unicodedata.normalize("NFKC")将全角空格、全角符号统一转为半角格式,解决中文排版遗留全角空白无法被普通 strip () 剔除的痛点,原生字符串 strip 仅能去除半角空格;
  2. 正则[\n\t\r]精准匹配页面排版遗留的换行与制表占位符号,这类符号肉眼不可见但会占用字段存储空间;
  3. ^\s+|\s+$匹配字段首尾所有连续空白,规避中间有效文本内部空格被误删问题。
3.1.2 DataFrame 全字段批量应用

python

运行

# 批量对全文本字段执行空白清洗 text_cols = ["title", "content", "intro"] for col in text_cols: df_raw[col] = df_raw[col].apply(clean_blank_text) print("空白清洗后数据:") print(df_raw)

3.2 第二模块:广告垃圾文本智能剔除(关键词 + 正则双规则)

广告清洗分为 ** 精准正则过滤(手机号、广告链接)分词关键词匹配过滤(推广话术)** 两层规则,先通过正则剔除联系方式、外链,再通过广告关键词词库匹配删除整行广告数据,适配显性与隐性两类广告。

3.2.1 广告清洗封装代码

python

运行

import jieba # 广告关键词词库,可根据业务持续扩充 AD_KEY_WORDS = {"优惠券", "限时特惠", "厂家直销", "加盟开店", "选购", "推广"} # 正则规则:匹配手机号、http广告链接 AD_REGEX_LIST = [ re.compile(r"1[3-9]\d{9}"), # 国内11位手机号 re.compile(r"https?://[^\s]+") # http/https广告外链 ] def filter_ad_content(text: str) -> str: # 步骤1:正则剔除链接、手机号 for reg in AD_REGEX_LIST: text = reg.sub("", text) # 步骤2:jieba分词拆分文本,匹配广告关键词 cut_words = set(jieba.lcut(text)) if cut_words & AD_KEY_WORDS: # 命中广告关键词,返回空字符串标记为广告数据 return "" return text # 批量执行广告清洗 df_raw["content"] = df_raw["content"].apply(filter_ad_content) # 剔除content全空的广告行数据 df_clean = df_raw[~(df_raw["content"] == "")].reset_index(drop=True)
原理解析
  1. 正则表达式精准定位结构化广告元素(手机号、推广链接),直接做空替换,规避人工筛选;
  2. jieba 分词拆分自然文本,转为分词集合后与广告关键词集合取交集,交集非空即判定为广告文本,相比模糊匹配全字符串关键词准确率更高,避免关键词嵌套在正常词汇中误删有效数据;
  3. 命中广告的内容字段置空后,通过布尔索引直接剔除整行垃圾数据,实现自动删广告行。

3.3 第三模块:格式异常字段规范化清洗(以价格字段为例)

价格字段混杂中文钱币符号、无效占位符、非数字标记,通过正则提取有效数字,无法提取有效数值的标记为缺失值,适配数值字段入库规范。

python

运行

def clean_price(price_str: str): """清洗价格字段,提取有效浮点数字""" if pd.isna(price_str): return None # 正则筛选所有数字与小数点 res = re.findall(r"\d+\.?\d*", str(price_str)) if res: return float(res[0]) # 无有效数字返回空值 return None df_clean["price"] = df_clean["price"].apply(clean_price)
原理说明

正则\d+\.?\d*匹配整数与小数格式数值,自动过滤¥###----等无效占位符号,无法提取数值的异常价格统一置空,后续可通过 fillna 填充默认值或单独归档异常数据。

3.4 第四模块:乱码、HTML 实体、特殊符号清洗

处理 HTML 转义字符、emoji 表情、不可见零宽字符等隐性脏数据,依托正则与 unicode 范围过滤异常符号:

python

运行

def clean_special_char(text: str) -> str: if pd.isna(text): return "" text = str(text) # 剔除HTML实体符号   &等 text = re.sub(r"&[a-zA-Z0-9]+;", "", text) # 剔除emoji表情unicode区间 emoji_pattern = re.compile("[" u"\U0001F600-\U0001F64F" u"\U0001F300-\U0001F5FF" u"\U0001F680-\U0001F6FF" u"\U0001F1E0-\U0001F1FF" "]+", flags=re.UNICODE) text = emoji_pattern.sub(r'', text) return text df_clean["intro"] = df_clean["intro"].apply(clean_special_char)
原理

emoji 集中分布在固定 Unicode 编码区间,通过正则区间批量匹配删除;HTML 实体符以&开头、;结尾,固定正则批量清除,解决前端富文本渲染遗留转义字符问题。

四、清洗后异常数据分流归档方案

海量数据清洗中部分数据无法通过规则修复(全乱码、无任何有效内容),直接删除会丢失原始样本,采用合格数据入库 + 脏数据单独归档双文件存储架构,分别写入两份 Parquet 文件:

python

运行

# 分离合格数据与待复核脏数据 valid_df = df_clean.dropna(subset=["price"]) invalid_df = df_clean[df_clean["price"].isna()] # 合规数据写入业务存储 valid_df.to_parquet("valid_spider_data.parquet", compression="zstd", index=False) # 异常脏数据归档留存,后续人工二次复核 invalid_df.to_parquet("invalid_backup_data.parquet", compression="zstd", index=False) print(f"有效数据量:{len(valid_df)},归档脏数据量:{len(invalid_df)}")
落地优势

归档脏数据单独保存不丢失原始采集内容,定期人工复盘归档数据优化清洗规则,持续迭代广告词库与正则表达式,不断提升自动清洗覆盖率。

五、清洗规则迭代与广告词库动态扩充方案

固定关键词词库无法适配站点动态更新的新型广告话术,搭建基于增量数据的词库自动扩充机制:定期读取归档的广告脏数据,分词后统计高频新词,人工筛选后加入 AD_KEY_WORDS 词库。

python

运行

from collections import Counter def update_ad_words_from_invalid(): """从归档脏数据自动提取高频候选广告词汇""" invalid_df = pd.read_parquet("invalid_backup_data.parquet") all_words = [] for content in invalid_df["content"]: if not pd.isna(content): all_words.extend(jieba.lcut(str(content))) # 统计词频 word_count = Counter(all_words) # 筛选出现频次大于2的候选词汇 candidate_words = {k for k,v in word_count.items() if v >=2 and len(k)>=2} print("待人工审核新增广告候选词:", candidate_words) # 定期调用更新词库 # update_ad_words_from_invalid()
原理说明

依托归档脏数据分词词频统计,自动挖掘新型推广词汇,避免人工逐个搜集广告关键词,适配站点广告文案持续迭代变化的场景。

六、海量爬虫分片清洗优化(百万级数据集)

单机一次性加载百万级原始数据至内存易出现内存溢出,采用 pandas 分块读取 + 分片清洗方案,分批次载入数据、清洗、落地存储,降低内存占用:

python

运行

def chunk_clean_spider_data(file_path:str, chunk_size:int=50000): """分块读取原始csv脏数据,分片清洗写入parquet""" first_write = True for chunk in pd.read_csv(file_path, chunksize=chunk_size): # 单分片依次执行四层清洗逻辑 text_cols = ["title", "content", "intro"] for col in text_cols: chunk[col] = chunk[col].apply(clean_blank_text) chunk[col] = chunk[col].apply(clean_special_char) chunk["content"] = chunk["content"].apply(filter_ad_content) chunk["price"] = chunk["price"].apply(clean_price) valid_chunk = chunk.dropna(subset=["price"]) invalid_chunk = chunk[chunk["price"].isna()] # 增量写入,首次创建文件,后续追加 if first_write: valid_chunk.to_parquet("chunk_valid_data.parquet", compression="zstd", index=False) invalid_chunk.to_parquet("chunk_invalid_data.parquet", compression="zstd", index=False) first_write = False else: # parquet追加写入依赖pyarrow valid_chunk.to_parquet("chunk_valid_data.parquet", append=True, compression="zstd", index=False) invalid_chunk.to_parquet("chunk_invalid_data.parquet", append=True, compression="zstd", index=False) # 调用分块清洗 # chunk_clean_spider_data("spider_raw.csv")
分片优化核心原理

chunksize 控制单次载入内存的数据行数,避免全量原始数据一次性占用内存,适配服务器低配置环境下亿级爬虫数据离线清洗场景,是生产环境大数据清洗标配方案。

七、不同业务场景清洗规则配置对照表

不同爬虫业务(资讯、电商、房产)脏数据特征存在差异化,针对性调整清洗规则,整理配置参考表格:

表格

爬虫业务类型重点清洗字段规则侧重配置
电商商品爬虫price、商品简介强化价格格式清洗,扩充导购、促销类广告关键词
资讯新闻爬虫title、正文 content重点过滤软文推广、外链广告,优化正文空白清洗
房产房源爬虫房源描述、报价剔除中介联系方式广告,规范房源单价字段格式
论坛评论爬虫comment 评论字段强化 emoji、灌水垃圾文本过滤,高频更新广告词库

八、生产环境落地优化细则与总结

8.1 落地优化细则

  1. 正则表达式预编译:所有广告、特殊字符正则在程序初始化阶段 compile 预编译,避免循环清洗时重复编译正则,提升批量清洗运行速度;
  2. 空值统一管控:区分业务空值(无数据)与脏数据空值(广告剔除),两类空值做标记区分,便于后续数据分析;
  3. 定时任务联动:搭配 APScheduler 定时任务,每日爬虫采集结束后自动触发全量清洗脚本,形成采集 - 清洗 - 入库自动化流水线。

8.2 全流程总结

  1. 爬虫脏数据划分为空白冗余、广告推广、格式异常、特殊乱码四大类别,分层设计清洗函数实现模块化解耦,便于规则迭代维护;
  2. 空白清洗依托 unicodedata 解决全角空白痛点,广告采用正则 + 分词关键词双层过滤,兼顾精准度与泛化能力;
  3. 采用有效数据入库、脏数据归档双存储模式,基于归档数据反向迭代广告关键词,持续优化清洗效果;
  4. 百万级海量数据使用分块分片清洗方案,从内存层面优化,解决大数据量内存溢出难题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询