Python爬蟲數(shù)據(jù)清洗實(shí)戰(zhàn):從雜亂無章到整潔可用

小伙伴們,做爬蟲最頭疼的不是抓數(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)手試試吧!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容