Python 爬虫数据清洗与存储:基础教程
Python 爬虫数据清洗与存储:基础教程
在爬虫数据获取完成后,数据往往是“原始”的,不适合直接使用。清洗和存储是将爬取到的原始数据转化为有用信息的关键步骤。本文将系统地介绍 Python 中进行数据清洗与存储的基本方法,帮助新手理解如何处理爬虫数据,使其更加适合分析和使用。
1. 数据清洗的意义和作用
数据清洗指的是将爬取到的数据转换为结构化、准确且一致的格式,去除无效数据、处理缺失值、规范化格式、解析数据等。无论是进一步的分析、模型训练还是数据库存储,清洗后的数据都将更加高效和精准。
爬虫获取的数据常见问题:
- 数据缺失:某些字段可能为空或格式不一致。
- 噪音数据:可能包含广告、注释等无用信息。
- 格式不规范:如日期格式、文本的编码、大小写不一致等。
在本文中,我们将使用一些示例代码展示如何进行数据清洗和存储。
2. 常用的数据清洗库
Python 提供了多种库用于数据清洗,其中最常用的有:
- Pandas:提供了灵活的数据操作功能,可用于数据的清洗、转换和处理。
- re(正则表达式库):用于字符串模式匹配和数据清理。
- BeautifulSoup:用于解析 HTML,清洗网页数据。
- NumPy:用于处理数值数据,补齐缺失值等。
安装 Pandas 和 BeautifulSoup:
pip install pandas beautifulsoup4
3. 示例数据集
假设我们爬取了一个电商网站的商品信息,数据如下:
商品名称 | 价格 | 评论数 | 上架日期 |
---|---|---|---|
Apple iPhone 12 | $999 | 200 | 2023年1月1日 |
Samsung Galaxy S21 | 价格缺失 | 150 | 无 |
Xiaomi Mi 11 | $699 | 评论缺失 | 2023年3月5日 |
Sony Xperia 5 | $799 | 100 | 2023/05/10 |
OPPO Find X3 | 价格错误 | 50 | 2022-12-01 |
可以看到,爬取的数据包含以下问题:
- 某些价格和评论数缺失。
- 日期格式不一致。
- 某些价格字段格式不正确。
- “价格缺失”和“评论缺失”这样的非标准信息,需要转化为缺失值。
我们将基于这个数据集来演示清洗步骤。
4. 数据清洗步骤
4.1 将数据载入 Pandas DataFrame
将数据转换为 Pandas 的 DataFrame 格式,便于操作。
import pandas as pd# 创建示例数据
data = {'商品名称': ['Apple iPhone 12', 'Samsung Galaxy S21', 'Xiaomi Mi 11', 'Sony Xperia 5', 'OPPO Find X3'],'价格': ['$999', '价格缺失', '$699', '$799', '价格错误'],'评论数': [200, 150, '评论缺失', 100, 50],'上架日期': ['2023年1月1日', '无', '2023年3月5日', '2023/05/10', '2022-12-01']
}
df = pd.DataFrame(data)
print(df)
输出为:
商品名称 价格 评论数 上架日期
0 Apple iPhone 12 $999 200 2023年1月1日
1 Samsung Galaxy S21 价格缺失 150 无
2 Xiaomi Mi 11 $699 评论缺失 2023年3月5日
3 Sony Xperia 5 $799 100 2023/05/10
4 OPPO Find X3 价格错误 50 2022-12-01
4.2 处理缺失值
缺失值可以通过删除行或填充方式处理。先将“价格缺失”和“评论缺失”字段转化为 Pandas 可识别的缺失值(NaN)。
import numpy as np# 将“价格缺失”、“评论缺失”转化为 NaN
df['价格'] = df['价格'].replace(['价格缺失', '价格错误'], np.nan)
df['评论数'] = df['评论数'].replace('评论缺失', np.nan)print(df)
4.3 清洗价格字段
价格字段中包含 $
符号,并且类型为字符串。我们可以去除符号并将其转换为数值类型,以便后续分析。
# 去除 $ 符号并转换为浮点数
df['价格'] = df['价格'].str.replace('$', '').astype(float)
print(df)
4.4 处理日期格式
上架日期包含多种格式。可以使用 pd.to_datetime
函数进行格式统一化。
# 统一上架日期格式
df['上架日期'] = pd.to_datetime(df['上架日期'], errors='coerce')
print(df)
在这里,我们使用 errors='coerce'
选项来处理格式不正确的日期,例如“无”,会将其转换为缺失值。
4.5 填充缺失值
我们可以根据需求填充缺失值,例如将价格的缺失值替换为均值,或填入特定值。
# 用平均价格填充缺失值
df['价格'].fillna(df['价格'].mean(), inplace=True)# 填充评论数为 0
df['评论数'].fillna(0, inplace=True)print(df)
5. 数据存储
完成清洗后,数据可以存储到不同的文件格式中,方便后续分析和使用。常见的数据存储格式包括 CSV、Excel、SQL 数据库和 JSON。
5.1 保存为 CSV 文件
CSV 文件是数据存储的常用格式,适合小规模数据。
df.to_csv('cleaned_data.csv', index=False)
5.2 保存为 Excel 文件
如果数据需要进一步操作或供人查看,Excel 格式是不错的选择。
df.to_excel('cleaned_data.xlsx', index=False)
5.3 保存到 SQL 数据库
SQL 数据库更适合大规模数据,可以使用 SQLite、MySQL 等。以下是使用 SQLite 存储数据的示例:
import sqlite3# 连接 SQLite 数据库(若文件不存在会自动创建)
conn = sqlite3.connect('products.db')
df.to_sql('products', conn, if_exists='replace', index=False)
conn.close()
5.4 保存为 JSON 文件
JSON 文件常用于数据传输和存储,适合嵌套结构的数据。
df.to_json('cleaned_data.json', orient='records', force_ascii=False)
6. 数据清洗与存储的最佳实践
- 格式统一:尽可能统一字段的格式,方便后续的处理和存储。
- 处理缺失值:根据具体需求选择合适的填充策略。
- 保留原始数据:清洗过程中可保留一份原始数据副本,便于溯源。
- 数据量的选择:小规模数据可以存储为 CSV 或 Excel,大规模数据推荐存储到数据库。
- 数据验证:清洗和存储后,检查数据的正确性,如统计均值、查看格式是否符合预期。
7. 小结
本文介绍了 Python 爬虫数据的清洗与存储方法,从处理缺失值、统一格式、清洗价格和日期等方面入手,并展示了如何将清洗后的数据保存为多种格式。通过掌握这些数据清洗和存储技巧,可以大幅提升爬虫数据的质量和可用性。
相关文章:

Python 爬虫数据清洗与存储:基础教程
Python 爬虫数据清洗与存储:基础教程 在爬虫数据获取完成后,数据往往是“原始”的,不适合直接使用。清洗和存储是将爬取到的原始数据转化为有用信息的关键步骤。本文将系统地介绍 Python 中进行数据清洗与存储的基本方法,帮助新手…...

ssm122基于Java的高校教学业绩信息管理系统+jsp(论文+源码)_kaic
毕 业 设 计(论 文) 题目:高校教学业绩信息管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本高校教学…...
Java 基础知识
一.泛型编程 1. 泛型的概念和作用是什么? 概念:泛型(Generics)是在 JDK 5.0 引入的新特性,允许在定义类、接口和方法时使用类型参数。类型参数在使用时被具体的类型替换。作用: 类型安全性:避…...
深入探索 React Hooks:原理、用法与性能优化全解
一、引言 在现代 React 开发领域,Hooks 已成为不可或缺的一部分,赋予函数组件强大功能,使其能胜任复杂任务。本文将全面剖析 React Hooks,助您深入理解并熟练运用。 二、React Hooks 是什么 (一)Hooks 出现的背景 早期 React 主要依赖类组件,其通过this.state管理状…...
python中父类和子类继承学习
python为啥要使用继承 1. **代码复用**:子类可以继承父类的方法和属性,避免了重复编写相同的代码,提高了代码的复用性。 2. **建立层次结构**:通过继承可以清晰地表示类之间的层次关系,使代码结构更有条理。 3. **扩展…...

Linux——GPIO输入输出裸机实验
学习了正点原子Linux环境下的GPIO的输入输出的裸机实验学习,现在进行一下小结: 启动文件start.S的编写 .global _start .global _bss_start _bss_start:.word __bss_start.global _bss_end _bss_end:.word __bss_end_start:/*设置处理器进入SVC模式*/m…...

华为鸿蒙HarmonyOS NEXT升级HiCar:打造未来出行新体验
随着科技的不断进步,智能出行已成为我们生活中不可或缺的一部分。华为凭借其在智能科技领域的深厚积累,推出了全新的鸿蒙HarmonyOS NEXT系统,旨在为用户打造一个“人车家”的无缝协同出行体验。这一系统的核心亮点之一,就是其内置…...

【项目组件】第三方库——websocketpp
目录 第三方协议:websocket websocket简介 websocket特点 websocket协议切换 websocket协议格式段 websocketpp库介绍 endpoint server connection websocketpp库搭建服务器流程 基本框架实现 业务处理回调函数的实现 http_callback open_callback …...

计算机23级数据结构上机实验(第3-4周)
A 二叉树删除子树 编写程序对给定二叉树执行若干次删除子树操作,输出每次删除子树后剩余二叉树的中根序列。二叉树结点的数据域值为不等于0的整数。每次删除操作是在上一次删除操作后剩下的二叉树上执行。 输入格式: 输入第1行为一组用空格间隔的整数,表…...

【大数据学习 | HBASE高级】region split机制和策略
1. region split机制 HRegionServer拆分region的步骤是,先将该region下线,然后拆分,将其子region加入到hbase:meta表中,再将他们加入到原本的HRegionServer中,最后汇报Master。 split前:hbase:meta表有…...
flink实战 -- flink SQL 实现列转行
在 SQL 任务里面经常会遇到一列转多行的需求,下面就来总结一下在 Flink SQL 里面如何实现列转行的,先来看下面的一个具体案例. 需求 原始数据格式如下: namedatatest[{"content_type":"flink","url":"111"},{"content_type&quo…...

React中右击出现自定弹窗
前言 在react中点击右键,完成阻止浏览器的默认行为,完成自定义的悬浮框(Menu菜单). 版本 "react": "^18.2.0", "umijs/route-utils": "^4.0.1", "antd": "^5.18.1", "ant-design/pro-components": &q…...

Unity类银河战士恶魔城学习总结(P128 Switch UI with KeyBoard用键盘切换UI)
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了用键盘切换角色UI,技能树UI,合成面板UI和设置UI UI.cs 1. 变量与字段 characterUI,skill…...

基于Springboot+微信小程序的急救常识学习系统 (含源码数据库)
1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…...
【云计算解决方案面试整理】3-7主流云计算平台、云计算架构、安全防护
准备面云计算解决方案的岗位,整理了一些,也请大佬们指点。 文档分为 云计算基础概念、云计算技术原理、主流云计算平台(以天翼云为例)、云计算架构(弹性设计、高可用设计、高性能设计)、安全防护几个方面。 三、主流云计算平台 1.阿里云云计算平台 强大的计算能力:拥有…...

数据库范式、MySQL 架构、算法与树的深入解析
一、数据库范式 在数据库设计中,范式是一系列规则,用于确保数据的组织和存储具有良好的结构、完整性以及最小化的数据冗余。如果不遵循范式设计,数据可能会以平铺式罗列,仅使用冒号、分号等简单分隔。这种方式存在诸多弊端&#…...

设计模式之责任链模式(Chain Of Responsibility)
一、责任链模式介绍 1、责任链模式介绍 职责链模式(chain of responsibility pattern) 定义: 避免将一个请求的发送者与接收者耦合在 一起,让多个对象都有机会处理请求。将接收请求的对象连接成一条链,并且沿着这条链 传递请求,直到有一个对…...
SQLite 全文检索:快速高效的文本查询方案
文章目录 什么是全文检索?如何启用 FTS?插入数据执行全文检索关联原始表与 FTS 表数据更新结论 说明: 本文以博客内容全文检索为例。 什么是全文检索? 全文检索是指对文本数据进行索引和查询的一种技术。与常规的 LIKE 查询不同,…...
【微信小程序】报修管理
一、报修管理 报修管理是为方便业主联系维修师傅的一个服务,业主确认需要维修的房到后,再指定维修项目以及上门的时间待待师傅联系上门服务即可。 1.1 在线报修 业主通过在线的方式填写报修的信息,包括房屋信息、维修项目、联系电话、上门…...
C++——视频问题总结
1、C和C的区别 CC面向过程对象注重程序的实现逻辑程序的整体设计内容C语言采用了一种有序的编程方法——结构化编程:将一个大型程序分解为一个个小型的,易于编写的模块,所有模块有序调动,形成了一个程序的完整的运行链C将问题分解…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...