Python脚本爬虫数据清洗如何做

wen 实用脚本 2

Python脚本爬虫数据清洗完整指南:从采集到分析的实战方法论

目录导读

  1. 数据清洗的核心价值——为什么爬虫后的数据必须“洗”一遍
  2. Python数据清洗环境搭建——必备库与工具链
  3. 爬虫数据常见脏数据类型——缺失、重复、异常、格式混乱
  4. 实战清洗流程(附代码)——5步完成原始数据到结构化数据
  5. 正则表达式与字符串处理——精准提取关键字段
  6. Pandas高级清洗技巧——缺失值填充、数据类型转换、去重
  7. 问答环节——解决爬虫数据清洗中的典型痛点
  8. SEO优化建议——如何让清洗后的数据直接用于内容生成

数据清洗的核心价值

许多爬虫新手常犯的错误是:采集到数据就直接入库或输出,但真实情况是,Web页面中的HTML标签、特殊字符、空行、重复内容、不同编码格式等,会严重污染最终数据。

Python脚本爬虫数据清洗如何做

举个常见场景:爬取电商商品价格时,可能得到"¥ 199.00 "(带空格和货币符号),而非纯数字00,不清洗直接使用,会导致后续统计失败。

数据清洗的本质:将非结构化或半结构化的原始数据,转化为符合业务规则的干净、一致、可用的结构化数据。


Python数据清洗环境搭建

1 核心库清单

import requests          # 爬虫请求
from bs4 import BeautifulSoup  # HTML解析
import pandas as pd      # 数据清洗核心库
import re                # 正则表达式
import numpy as np       # 数值处理
from datetime import datetime # 日期标准化

2 安装命令(建议使用虚拟环境)

pip install requests beautifulsoup4 pandas numpy lxml

爬虫数据常见脏数据类型

脏数据类型 典型表现 示例
缺失值 NoneNaN、空字符串 \n
重复数据 完全相同的行或字段 同一商品出现两次
格式不一致 日期格式混乱、数字含符号 2024/01/01 vs 01-01-2024
编码错误 乱码或unicode转义 \u4e2d\u56fd(显示为中文)
特殊字符 HTML标签、换行符 <br/>\n&amp;

实战清洗流程(附代码示例)

假设我们爬取了一个新闻网站的文章列表,原始数据如下:

raw_data = [
    {"title": "  Python爬虫入门  ", "date": "2024/01/05", "content": "本文介绍...<br/>更多技巧"},
    {"title": None, "date": "01-05-2024", "content": "数据分析基础\n"},
    {"title": "  Python爬虫入门  ", "date": "2024/01/05", "content": "本文介绍...<br/>更多技巧"},  # 重复行
]

步骤1:数据读取与初步查看

df = pd.DataFrame(raw_data)
print(df.isnull().sum())  # 统计缺失值
print(df.duplicated().sum()) # 统计重复行

步骤2:处理缺失值

df.dropna(subset=['content'], inplace=True)   # 删除内容为空的记录

步骤3:去除重复数据

df.drop_duplicates(inplace=True)

步骤4:标准化日期格式

def normalize_date(date_str):
    # 处理两种常见格式
    try:
        return datetime.strptime(date_str, '%Y/%m/%d').date()
    except:
        return datetime.strptime(date_str, '%m-%d-%Y').date()
df['date'] = df['date'].apply(normalize_date)

步骤5:清洗文本内容

import re
def clean_text(text):
    text = str(text)
    text = re.sub(r'<[^>]+>', '', text)  # 去除HTML标签
    text = re.sub(r'\s+', ' ', text)     # 合并多余空格
    text = text.strip()                  # 去除首尾空格
    return text
df['content'] = df['content'].apply(clean_text)] = df['title'].apply(lambda x: x.strip())

正则表达式与字符串处理进阶技巧

1 常用正则模式

import re
# 提取数字(含小数点)
pattern_price = r'[\d]+\.?[\d]*'
price = re.findall(pattern_price, "价格:¥ 199.00元")  # 返回 ['199.00']
# 提取邮箱
pattern_email = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
emails = re.findall(pattern_email, "联系: test@example.com")
# 移除非法字符(只保留中文、英文、数字)
clean = re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9]', '', "Hello! 你好¥世界123")

2 字符串内置方法

text = "  Hello World\n  "
result = text.strip().replace('\n', '').lower()
# 输出: "hello world"

Pandas高级清洗技巧

1 数据类型转换

df['price'] = pd.to_numeric(df['price'], errors='coerce')  # 无法转换的变为NaN
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')

2 条件过滤与异常值处理

# 过滤价格大于10000的异常值
df = df[df['price'] < 10000]
# 或者将异常值替换为均值
mean_price = df['price'].mean()
df.loc[df['price'] > 10000, 'price'] = mean_price

3 批量清洗一列

def comprehensive_clean(text):
    text = re.sub(r'<.*?>', '', str(text))
    text = re.sub(r'[^\w\s]', '', text)  # 去除标点
    return text.lower().strip()
df['content_clean'] = df['content'].apply(comprehensive_clean)

问答环节(解决典型痛点)

Q1:如何判断清洗后的数据是否符合预期? A:用df.describe()查看数值列分布,用df.head(10)抽样检查,对于文本列可用df['column'].value_counts()查看唯一值频次。

Q2:处理超大CSV文件(10GB+)怎么办? A:分块读取 pd.read_csv('file.csv', chunksize=10000),逐块处理再合并,或者使用Dask库支持并行计算。

Q3:清洗后的数据如何导出? A:推荐Parquet格式(节省空间且保留数据类型)或清洗后直接存入数据库(SQLite/MySQL),避免再导出CSV造成二次污染。

Q4:爬虫数据中有特殊编码(如\u4e2d)怎么处理? A:text = text.encode('latin-1').decode('unicode_escape') 可还原;或用codecs库处理。

Q5:清洗过程中数据量变少是否正常? A:正常,去重、去除无效数据、过滤异常值都会减少数据量,记录清洗前后的行数差异,便于审计。


SEO优化建议(清洗后数据直接用于内容生成)

与描述清洗去除无关符号,确保每个标题唯一,长度控制在30-60字符以内。 2. 关键词密度控制清洗后为每个文章提取3-5个核心关键词,放入<meta>标签。 3. URL规范化统一使用小写字母、连字符连接(如python-data-cleaning-guide),避免中文路径。 4. 内链结构化清洗数据时,为同类内容添加关联ID,后续可直接构建内链网络。 5. 避免重复内容惩罚**:利用simhashdifflib库检测相似文本,内容相似度超过80%需合并或重写。


清洗是爬虫的“后半场”

一个完整的Python爬虫项目,数据清洗通常占用60%以上的时间,没有清洗,再强大的爬虫也只是收集垃圾,本文提供的5步流程和Pandas技巧,可以直接应用于大多数爬虫场景,建议在实际项目中建立清洗流水线(即ETL流程),将清洗步骤封装成函数,每次爬取后自动调用。

核心口诀:先查缺失重复,再格式统一,最后文本净化,记住这三步,你的爬虫数据就能从“毛坯房”变成“精装修”。

如需完整代码模板,可在搜索引擎搜索 “Python数据清洗模板” 获取开源项目参考。

抱歉,评论功能暂时关闭!