小伙伴们,做爬虫最头疼的不是抓数据,而是抓回来那一堆乱七八糟的内容!价格里混着符号、日期格式千奇百怪、还有重复和缺失的值,看着就头大。别慌,咱们用Python几招就能搞定。Pandas处理表格数据是真香,正则表达式专门治各种不服,再加上BeautifulSoup清标签,保准让原始数据改头换面!

在这里插入图片描述

在Python爬虫项目中,数据清洗是确保数据质量的关键步骤。以下是系统化的方法和常用工具,帮助你高效完成数据清洗:

一、数据清洗常见问题及应对策略

1、重复数据

import pandas as pd
df = pd.DataFrame(data_list)
df.drop_duplicates(subset=['url'], keep='first', inplace=True)  # 根据URL去重

2、缺失值处理

df.dropna(subset=['price'])  # 删除关键字段缺失的行
df['price'].fillna(0, inplace=True)  # 数值型填充0
df['desc'].fillna('未知', inplace=True)  # 文本型填充默认值

3、格式标准化

  • 日期格式化

    from datetime import datetime
    df['date'] = pd.to_datetime(df['raw_date']).dt.strftime('%Y-%m-%d')
    
  • 文本去除空格

    df['title'] = df['title'].str.strip()
    

4、异常值处理

# 删除价格超过10000的异常值
df = df[df['price'] < 10000]
# 使用分位数过滤
q_low = df['price'].quantile(0.01)
q_hi  = df['price'].quantile(0.99)
df = df[(df['price'] > q_low) & (df['price'] < q_hi)]

5、HTML标签清理

from bs4 import BeautifulSoup
def remove_html(text):return BeautifulSoup(text, "html.parser").get_text() if text else ""df['desc'] = df['desc'].apply(remove_html)

二、专用数据清洗工具库

1、Pandas(结构化数据)

# 类型转换
df['price'] = pd.to_numeric(df['price'], errors='coerce')# 字符串处理
df['name'] = df['name'].str.lower().str.replace('[^\w\s]', '', regex=True)

2、Re(正则表达式)

import re
# 提取文本中的数字
df['phone'] = df['raw_text'].str.extract(r'(\d{3}-\d{8})')

3、自定义函数处理复杂场景

def clean_price(price_str):if isinstance(price_str, str):return re.sub(r'[^\d.]', '', price_str)  # 去除货币符号等return price_strdf['price'] = df['price'].apply(clean_price).astype(float)

三、完整数据清洗流程示例

以爬取的电商商品数据为例:

import pandas as pd
import redef clean_data(raw_data):# 1. 转DataFramedf = pd.DataFrame(raw_data)# 2. 去重df = df.drop_duplicates(subset=['product_id'])# 3. 处理价格df['price'] = (df['price'].str.replace('¥', '').str.replace(',', '').astype(float))df = df[df['price'] > 0]  # 过滤无效价格# 4. 处理日期df['release_date'] = pd.to_datetime(df['release_date'], errors='coerce')df = df[df['release_date'].notna()]# 5. 清理描述文本df['description'] = (df['description'].str.strip().str.replace('\n', ' ').str.replace(r'\s+', ' ', regex=True))return df.to_dict('records')# 应用清洗函数
cleaned_data = clean_data(scraped_data)

四、最佳实践建议

1、逐层清洗:先处理缺失值,再格式化,最后处理逻辑异常

2、保留原始数据:始终保留未经修改的原始数据,便于回溯

3、单元测试:对清洗函数编写测试用例,验证边界情况

4、日志记录:记录被清洗掉的数据数量和原因

print(f"原始数据量: {len(raw_data)}")
print(f"清洗后数据量: {len(cleaned_data)}")
print(f"删除重复值: {len(raw_data) - len(cleaned_data)}")

五、常用工具包推荐

  • Pandas:主流数据处理库
  • NumPy:数值计算支持
  • Re:正则表达式处理
  • BeautifulSoup:HTML/XML解析
  • Pyjanitor:提供链式方法调用(类似R语言的dplyr)

通过结合这些方法和工具,你可以构建健壮的数据清洗流程,确保爬虫数据可直接用于分析或入库。

搞定数据清洗后,你会发现自己爬的数据顿时清爽多了!记得清洗时要保留原始数据备份,每步操作都记好日志。整理干净的数据不管是存数据库还是做分析都特别省心,整个项目档次都提升了。其实熟练了之后,这些清洗流程就会变成肌肉记忆,赶紧动手试试吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98232.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98232.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/98232.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打工人日报#20250906

打工人日报#20250906 周六了&#xff01; 今天出门读者特别痛&#xff0c;本来都想爽约了&#xff0c;不过忍下来了了&#xff0c;现在看来很值得&#xff01; 不过还是要好好吃早餐、和热水&#xff01; 阅读 《小米创业思考》 第一章 奇迹时代 看完了 就是快呀 好的产品 好的…

小型磨床设计cad+三维图+设计说明书

摘 要 随着现代加工技术的发展&#xff0c;各种各样的加工技术得到了广泛的应用&#xff0c;磨床在机械制造领域得到了广泛的应用&#xff0c;本文经过查阅相关文献&#xff0c;完成了一种小型磨床的结构设计。 本文设计的小型磨床其主要是由三部分组成的&#xff0c;第一部分…

音响皇帝BO,牵手全球第一AR眼镜雷鸟,耳机党坐不住了?

【潮汐商业评论/原创】自AI大模型技术实现突破以来&#xff0c;即引发一场终端革命&#xff0c;关于下一个智能终端入口&#xff0c;或者说关于下一代计算平台&#xff0c;市场有过很多“狼来了”的声音&#xff0c;大家纷纷猜测&#xff0c;在智能手机之后&#xff0c;究竟谁有…

中断和异常

中断和异常简介 在计算机体系结构和操作系统中&#xff0c;中断&#xff08;Interrupt&#xff09; 和 异常&#xff08;Exception&#xff09; 是CPU应对突发事件、实现多任务并发和错误处理的核心机制。二者均通过暂停当前任务、转去执行特定处理程序来响应事件&#xff0c;但…

Fab资源快速导入UE

有时候在Epic启动器导入进度会卡住可以直接使用ue内置Fab来导入资源 这样是百分百能导入的

Python错误测试与调试——文档测试

Doctest 通过解析文档字符串&#xff08;docstring&#xff09;中的交互式 Python 代码片段&#xff08;以 >>>开头&#xff09;进行测试&#xff0c;验证代码输出是否与预期一致。测试用例直接嵌入代码中&#xff0c;实现“文档即测试”核心语法&#xff1a;def func…

c#核心笔记

111&#xff0c;面向对象 1&#xff0c;面向过程编程&#xff1a;是一种以过程为中心的编程思想分析出解决问题所需要的步骤然后用函数把步骤一步一步实现使用的时候&#xff0c;一个一个依次调用。 2&#xff0c;面向对象编程&#xff1a;面向对象是一种对现实世界理解和抽象的…

【MySQL】从零开始了解数据库开发 --- 初步认识数据库

永远记住&#xff0c;你的存在是有意义的&#xff0c; 你很重要&#xff0c; 你是被爱着的&#xff0c; 而且你为这个世界带来了无可取代的东西。 -- 麦克西 《男孩、鼹鼠、狐狸和马》-- 从零开始了解数据库开发安装MySQL什么是数据库常见主流数据库初步了解SQL语句存储引擎安装…

Altium Designer(AD24)切换工作界面为浅灰色的方法

🏡《专栏目录》 目录 1,概述 2,界面介绍 1,概述 本文演示AD24软件黑色界面切换为浅灰色的方法。 2,界面介绍 第1步:点击设置小图标,然后点击View 第2步:在UI Theme,点击Current旁边的Altium Dark Gtay ,在下拉选项中选择Altium Light Gtay,然后点击OK确认 第4步…

SDRAM详细分析—07 存储器阵列寻址

大家好,这里是大话硬件 这篇文章将分析实际SDRAM内部是如何进行寻址以及内存单元分布方式。 根据前面的内容,从小容量到大容量进行迭代分析。 1. 1bit容量 这个存储单元只能存储1个bit位。假设现在需要8bit内存容量颗粒,则需要8颗这样的存储器件。 2. 4bit容量 这个存储…

【GitOps】Argo CD高级操作钩子

Argo CD高级操作钩子 文章目录Argo CD高级操作钩子资源列表一、Argo CD钩子1.1、钩子介绍1.2、构建的几个执行阶段1.3、钩子删除策略1.4、示例二、钩子演示2.1、创建GitLab公共仓库2.2、Argo CD创建Application2.3、同步&#xff08;SYNC&#xff09;资源列表 操作系统配置主机…

谙流 ASK 技术解析(一):秒级扩容

谙流 ASK 是谙流团队自主研发的国产新一代云原生流平台&#xff0c;与 Apache Kafka 100% 协议兼容&#xff0c;全栈自主可控&#xff0c;专注私有化部署与行业场景赋能。传统Kafka存储之殇IO模型缺陷每个分区对应独立文件&#xff0c;采用单分区异步批量顺序写机制。当多分区并…

从挑西瓜到树回归:用生活智慧理解机器学习算法

一、生活中的决策树&#xff1a;妈妈的挑瓜秘籍夏天的菜市场里&#xff0c;妈妈总能精准挑出最甜的西瓜。她的秘诀是一套简单的决策流程&#xff1a;先看色泽&#xff0c;青绿有光泽的优先&#xff1b;再敲一敲&#xff0c;声音沉闷的更可能熟&#xff1b;最后摸硬度&#xff0…

SpringBoot+PDF.js实现按需分片加载(包含可运行样例源码)

SpringBootPDF.js实现按需分片加载前言一、实现思路与实现效果1.1 pdf.js的分片加载的实现思路1.2 pdf分片加载的效果二、前端项目2.1 项目引入2.2 核心代码2.3 项目运行三、后端项目3.1 项目结构3.2 核心代码3.3 项目运行四、项目运行效果4.1 首次访问4.2 分片加载五、项目优化…

常见Bash脚本漏洞分析与防御

引言 在Unix/Linux系统中&#xff0c;Bash脚本因其简洁、高效而成为自动化任务、系统管理和快速原型开发的首选工具。然而&#xff0c;Bash的强大功能和其独特的语法特性&#xff0c;也为安全漏洞埋下了隐患。许多开发者在追求便捷性的过程中&#xff0c;无意间引入了命令注入、…

JAVA快速学习(二)

类与对象因为本质是写python的所以类与对象的概念就不赘述了&#xff0c;先看java中类与对象的创建方式public class Main {public static void main(String[] args) {Cat cat new Cat(); // Cat cat new Cat("zh",18); 这样直接不对,这样传参就需要写构造函数…

登录优化(双JWT+Redis)

流程 前端 → 后端 → 拦截器 → 限流 → AOP → Controller → 刷新 → 退出 前端登录并获取双 JWT 1、前端:用户在前端输入用户名和密码,调用 /auth/login 接口。 fetch("/auth/login", {method: "POST",headers: {"Content-Type": &quo…

【杂类】Spring 自动装配原理

这张图&#xff0c;​​正是理解现代 Spring Boot 自动配置的钥匙​​。它指出的 AutoConfiguration.imports 文件&#xff0c;是 Spring Boot 2.7 之后的新标准&#xff0c;比老式的 spring.factories 更简洁。咱们就从这个文件开始说。一、自动配置是啥&#xff1f;为啥需要它…

【CSS,DaisyUI】自定义选取内容的颜色主题

当你的网站使用了多个主题&#xff0c;比如 light/dark。当用户选择一段文本&#xff0c;常常会出现一个主题没问题&#xff0c;另一个主题颜色怪怪的。是因为选择区域的主题通常没有变化&#xff0c;导致与当前主题不配合。 下面四种方法可解决这个问题&#xff1a; The probl…

Linux网络接口命名详解:从eth0到ens33

在Linux系统中&#xff0c;网络接口的命名方式直接影响管理员对设备的理解与管理。从早期的eth0、wlan0到现代的ens33、enp0s3、eno1&#xff0c;Linux网络接口命名规则经历了显著的演变。一、Linux网络接口命名的历史与演变 Linux网络接口命名的历史可以分为两个主要时代&…