在千万级数据采集场景中,原始爬虫数据普遍存在五大污染问题:
数据清洗的价值链:
import pandas as pd
from io import StringIO
# 模拟爬虫原始数据
raw_data = """id,name,price,date,location
1,商品A,100,2023-08-01,北京
2,商品B,200,2023-08-02,上海
2,商品B,200,2023-08-02,上海
3,商品C,,2023-08-03,广州
4,商品D,三百元,2023-08-04,深圳
5,商品E,999999,2023-08-05,杭州"""
df = pd.read_csv(StringIO(raw_data))
# 数据健康检查
def data_diagnosis(df):
report = pd.DataFrame({
'缺失率': df.isnull().mean(),
'唯一值占比': df.nunique()/len(df),
'数据类型': df.dtypes
})
return report.sort_values('缺失率', ascending=False)
print(data_diagnosis(df))
诊断报告输出:
字段 | 缺失率 | 唯一值占比 | 数据类型 |
---|---|---|---|
price | 0.2 | 0.6 | object |
date | 0.0 | 1.0 | object |
location | 0.0 | 0.8 | object |
id | 0.0 | 0.8 | int64 |
name | 0.0 | 0.8 | object |
# 多维度去重配置
clean_df = df.drop_duplicates(
subset=['id', 'date'], # 联合主键
keep='last', # 保留最新记录
inplace=False # 创建新DataFrame
)
# 条件去重(删除价格异常重复项)
mask = (clean_df['price'].astype(str).str.isdigit()) & \
(clean_df['price'].astype(float) < 10000)
clean_df = clean_df[mask]
# 创建缺失值处理管道
class MissingValueProcessor:
def __init__(self, df):
self.df = df.copy()
def fill_by_strategy(self, column, method='median'):
if method == 'median':
fill_value = self.df[column].median()
elif method == 'mode':
fill_value = self.df[column].mode()[0]
elif method == 'interpolate':
self.df[column] = self.df[column].interpolate()
return self.df
self.df[column] = self.df[column].fillna(fill_value)
return self.df
def drop_columns(self, threshold=0.7):
cols_to_drop = self.df.columns[self.df.isnull().mean() > threshold]
return self.df.drop(cols_to_drop, axis=1)
# 执行处理
processor = MissingValueProcessor(clean_df)
processed_df = processor.fill_by_strategy('price', 'median')\
.drop_columns(0.5)
# 分块读取与处理
chunk_iter = pd.read_csv('big_data.csv', chunksize=10000)
clean_chunks = []
for chunk in chunk_iter:
chunk = chunk.drop_duplicates(subset=['id'])
chunk['price'] = chunk['price'].fillna(chunk['price'].median())
clean_chunks.append(chunk)
final_df = pd.concat(clean_chunks)
# 提取纯数字价格
processed_df['price'] = processed_df['price'].astype(str)\
.str.extract(r'(\d+\.?\d*)', expand=False)\
.astype(float)
from sklearn.cluster import DBSCAN
# 检测价格异常
price_data = processed_df[['price']].values
clusters = DBSCAN(eps=50, min_samples=2).fit(price_data)
processed_df['is_outlier'] = clusters.labels_ == -1
clean_df = processed_df[~processed_df['is_outlier']]
class EcommerceCleaner:
def __init__(self, file_path):
self.df = pd.read_parquet(file_path)
def pipeline(self):
# 去重阶段
self.df = self.df.drop_duplicates(subset=['product_id', 'crawl_time'])
# 缺失值处理
self.df['price'] = self.df['price'].fillna(self.df.groupby('category')['price'].transform('median'))
# 格式标准化
self.df['date'] = pd.to_datetime(self.df['date'], errors='coerce', format='mixed')
# 异常值过滤
q_low = self.df['price'].quantile(0.01)
q_high = self.df['price'].quantile(0.99)
self.df = self.df[(self.df['price'] > q_low) & (self.df['price'] < q_high)]
return self.df
# 执行清洗
cleaner = EcommerceCleaner('ecommerce_raw.parquet')
cleaned_data = cleaner.pipeline()
Python爬虫介绍 | Python爬虫(1)Python爬虫:从原理到实战,一文掌握数据采集核心技术 |
HTTP协议解析 | Python爬虫(2)Python爬虫入门:从HTTP协议解析到豆瓣电影数据抓取实战 |
HTML核心技巧 | Python爬虫(3)HTML核心技巧:从零掌握class与id选择器,精准定位网页元素 |
CSS核心机制 | Python爬虫(4)CSS核心机制:全面解析选择器分类、用法与实战应用 |
静态页面抓取实战 | Python爬虫(5)静态页面抓取实战:requests库请求头配置与反反爬策略详解 |
静态页面解析实战 | Python爬虫(6)静态页面解析实战:BeautifulSoup与lxml(XPath)高效提取数据指南 |
Python数据存储实战 CSV文件 | Python爬虫(7)Python数据存储实战:CSV文件读写与复杂数据处理指南 |
Python数据存储实战 JSON文件 | Python爬虫(8)Python数据存储实战:JSON文件读写与复杂结构化数据处理指南 |
Python数据存储实战 MySQL数据库 | Python爬虫(9)Python数据存储实战:基于pymysql的MySQL数据库操作详解 |
Python数据存储实战 MongoDB数据库 | Python爬虫(10)Python数据存储实战:基于pymongo的MongoDB开发深度指南 |
Python数据存储实战 NoSQL数据库 | Python爬虫(11)Python数据存储实战:深入解析NoSQL数据库的核心应用与实战 |
Python爬虫数据存储必备技能:JSON Schema校验 | Python爬虫(12)Python爬虫数据存储必备技能:JSON Schema校验实战与数据质量守护 |
Python爬虫数据安全存储指南:AES加密 | Python爬虫(13)数据安全存储指南:AES加密实战与敏感数据防护策略 |
Python爬虫数据存储新范式:云原生NoSQL服务 | Python爬虫(14)Python爬虫数据存储新范式:云原生NoSQL服务实战与运维成本革命 |
Python爬虫数据存储新维度:AI驱动的数据库自治 | Python爬虫(15)Python爬虫数据存储新维度:AI驱动的数据库自治与智能优化实战 |
Python爬虫数据存储新维度:Redis Edge近端计算赋能 | Python爬虫(16)Python爬虫数据存储新维度:Redis Edge近端计算赋能实时数据处理革命 |
反爬攻防战:随机请求头实战指南 | Python爬虫(17)反爬攻防战:随机请求头实战指南(fake_useragent库深度解析) |
反爬攻防战:动态IP池构建与代理IP | Python爬虫(18)反爬攻防战:动态IP池构建与代理IP实战指南(突破95%反爬封禁率) |
Python爬虫破局动态页面:全链路解析 | Python爬虫(19)Python爬虫破局动态页面:逆向工程与无头浏览器全链路解析(从原理到企业级实战) |
Python爬虫数据存储技巧:二进制格式性能优化 | Python爬虫(20)Python爬虫数据存储技巧:二进制格式(Pickle/Parquet)性能优化实战 |
Python爬虫进阶:Selenium自动化处理动态页面 | Python爬虫(21)Python爬虫进阶:Selenium自动化处理动态页面实战解析 |