小伙伴們,做爬蟲最頭疼的不是抓數(shù)據(jù),而是抓回來那一堆亂七八糟的內(nèi)容!價(jià)格里混著符號(hào)、日期格式千奇百怪、還有重復(fù)和缺失的值,看著就頭大。別慌,咱們用Python幾招就能搞定。Pandas處理表格數(shù)據(jù)是真香,正則表達(dá)式專門治各種不服,再加上BeautifulSoup清標(biāo)簽,保準(zhǔn)讓原始數(shù)據(jù)改頭換面!

在Python爬蟲項(xiàng)目中,數(shù)據(jù)清洗是確保數(shù)據(jù)質(zhì)量的關(guān)鍵步驟。以下是系統(tǒng)化的方法和常用工具,幫助你高效完成數(shù)據(jù)清洗:
一、數(shù)據(jù)清洗常見問題及應(yīng)對策略
1、重復(fù)數(shù)據(jù)
importpandasaspd
df=pd.DataFrame(data_list)
df.drop_duplicates(subset=['url'],keep='first',inplace=True)# 根據(jù)URL去重
2、缺失值處理
df.dropna(subset=['price'])# 刪除關(guān)鍵字段缺失的行
df['price'].fillna(0,inplace=True)# 數(shù)值型填充0
df['desc'].fillna('未知',inplace=True)# 文本型填充默認(rèn)值
3、格式標(biāo)準(zhǔn)化
日期格式化:
fromdatetimeimportdatetime
df['date']=pd.to_datetime(df['raw_date']).dt.strftime('%Y-%m-%d')
文本去除空格:
df['title']=df['title'].str.strip()
4、異常值處理
# 刪除價(jià)格超過10000的異常值
df=df[df['price']<10000]
# 使用分位數(shù)過濾
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標(biāo)簽清理
frombs4importBeautifulSoup
defremove_html(text):
returnBeautifulSoup(text,"html.parser").get_text()iftextelse""
df['desc']=df['desc'].apply(remove_html)
二、專用數(shù)據(jù)清洗工具庫
1、Pandas(結(jié)構(gòu)化數(shù)據(jù))
# 類型轉(zhuǎn)換
df['price']=pd.to_numeric(df['price'],errors='coerce')
# 字符串處理
df['name']=df['name'].str.lower().str.replace('[^\w\s]','',regex=True)
2、Re(正則表達(dá)式)
importre
# 提取文本中的數(shù)字
df['phone']=df['raw_text'].str.extract(r'(\d{3}-\d{8})')
3、自定義函數(shù)處理復(fù)雜場景
def clean_price(price_str):
if isinstance(price_str, str):
return re.sub(r'[^\d.]', '', price_str)? # 去除貨幣符號(hào)等
return price_str
df['price'] = df['price'].apply(clean_price).astype(float)
三、完整數(shù)據(jù)清洗流程示例
以爬取的電商商品數(shù)據(jù)為例:
import pandas as pd
import re
def clean_data(raw_data):
# 1. 轉(zhuǎn)DataFrame
df = pd.DataFrame(raw_data)
# 2. 去重
df = df.drop_duplicates(subset=['product_id'])
# 3. 處理價(jià)格
df['price'] = (df['price'].str.replace('¥', '')
.str.replace(',', '')
.astype(float))
df = df[df['price'] > 0]? # 過濾無效價(jià)格
# 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')
# 應(yīng)用清洗函數(shù)
cleaned_data = clean_data(scraped_data)
四、最佳實(shí)踐建議
1、逐層清洗:先處理缺失值,再格式化,最后處理邏輯異常
2、保留原始數(shù)據(jù):始終保留未經(jīng)修改的原始數(shù)據(jù),便于回溯
3、單元測試:對清洗函數(shù)編寫測試用例,驗(yàn)證邊界情況
4、日志記錄:記錄被清洗掉的數(shù)據(jù)數(shù)量和原因
print(f"原始數(shù)據(jù)量: {len(raw_data)}")
print(f"清洗后數(shù)據(jù)量: {len(cleaned_data)}")
print(f"刪除重復(fù)值: {len(raw_data) - len(cleaned_data)}")
五、常用工具包推薦
Pandas:主流數(shù)據(jù)處理庫
NumPy:數(shù)值計(jì)算支持
Re:正則表達(dá)式處理
BeautifulSoup:HTML/XML解析
Pyjanitor:提供鏈?zhǔn)椒椒ㄕ{(diào)用(類似R語言的dplyr)
通過結(jié)合這些方法和工具,你可以構(gòu)建健壯的數(shù)據(jù)清洗流程,確保爬蟲數(shù)據(jù)可直接用于分析或入庫。
搞定數(shù)據(jù)清洗后,你會(huì)發(fā)現(xiàn)自己爬的數(shù)據(jù)頓時(shí)清爽多了!記得清洗時(shí)要保留原始數(shù)據(jù)備份,每步操作都記好日志。整理干凈的數(shù)據(jù)不管是存數(shù)據(jù)庫還是做分析都特別省心,整個(gè)項(xiàng)目檔次都提升了。其實(shí)熟練了之后,這些清洗流程就會(huì)變成肌肉記憶,趕緊動(dòng)手試試吧!