在使用Python的requests库进行网络爬虫时,数据清洗是一个非常重要的步骤,以确保你获取的数据是准确和有用的。以下是一些常见的数据清洗步骤和技巧:
1. 解析HTML内容
首先,你需要使用一个库来解析HTML内容,常用的库有BeautifulSoup
和lxml
。
import requests from bs4 import BeautifulSoup url = 'http://example.com' response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser')
2. 提取数据
提取数据通常是通过查找HTML中的特定标签和属性来完成的。
# 提取所有段落文本 paragraphs = soup.find_all('p') for p in paragraphs: print(p.get_text())
3. 数据清洗
数据清洗包括去除空白、特殊字符、HTML标签等。
import re # 去除多余的空格和换行符 cleaned_text = ' '.join(p.get_text().split()) # 去除HTML标签 cleaned_text = re.sub('<.*?>', '', cleaned_text) # 去除特殊字符 cleaned_text = re.sub('[^a-zA-Z0-9\s]', '', cleaned_text)
4. 处理数据类型
有时候提取的数据可能是字符串或其他数据类型,需要进行相应的转换。
# 将字符串转换为整数 number = int(re.search(r'\d+', cleaned_text).group()) # 将字符串转换为浮点数 float_number = float(re.search(r'\d+\.\d+', cleaned_text).group())
5. 数据存储
清洗后的数据可以存储在文件、数据库或其他数据结构中。
# 存储到CSV文件 import csv with open('cleaned_data.csv', 'w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(['Cleaned Text']) for text in cleaned_texts: writer.writerow([text])
6. 异常处理
在爬虫过程中,可能会遇到各种异常情况,需要进行异常处理。
try: response = requests.get(url) response.raise_for_status() # 检查HTTP请求是否成功 except requests.exceptions.RequestException as e: print(f'Error: {e}')
7. 日志记录
记录日志可以帮助你更好地调试和监控爬虫的运行状态。
import logging logging.basicConfig(filename='crawler.log', level=logging.INFO) logging.info(f'Fetching data from {url}')
示例代码
以下是一个完整的示例代码,展示了如何进行数据清洗:
import requests from bs4 import BeautifulSoup import re import csv import logging # 配置日志 logging.basicConfig(filename='crawler.log', level=logging.INFO) logging.info(f'Fetching data from http://example.com') try: response = requests.get('http://example.com') response.raise_for_status() # 检查HTTP请求是否成功 except requests.exceptions.RequestException as e: logging.error(f'Error: {e}') exit(1) soup = BeautifulSoup(response.content, 'html.parser') paragraphs = soup.find_all('p') cleaned_texts = [] for p in paragraphs: text = p.get_text() # 去除多余的空格和换行符 text = ' '.join(text.split()) # 去除HTML标签 text = re.sub('<.*?>', '', text) # 去除特殊字符 text = re.sub('[^a-zA-Z0-9\s]', '', text) cleaned_texts.append(text) # 存储到CSV文件 with open('cleaned_data.csv', 'w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(['Cleaned Text']) for text in cleaned_texts: writer.writerow([text]) logging.info('Data cleaning and storage completed.')
通过这些步骤,你可以有效地清洗从网络爬虫中获取的数据,确保其质量和准确性。