爬虫代码中如何处理异常?
在编写爬虫代码时,处理异常是非常重要的一步,因为它可以帮助你的程序更加健壮,能够应对网络请求失败、解析错误等问题。以下是一些常见的异常处理方法:
1. 网络请求异常
使用requests
库时,可能会遇到网络连接问题,如超时、连接错误等。我们可以使用try-except
语句来捕获这些异常。
import requests
from requests.exceptions import RequestException
url = 'http://example.com/product-page'
try:
response = requests.get(url, timeout=5) # 设置超时时间为5秒
response.raise_for_status() # 如果响应状态码不是200,将引发HTTPError
except RequestException as e:
print(f"请求错误: {e}")
# 这里可以进行错误处理,比如重试请求或者记录日志
2. 解析异常
在使用BeautifulSoup
解析HTML时,可能会遇到解析错误或者找不到指定的标签。
from bs4 import BeautifulSoup, FeatureNotFound
try:
soup = BeautifulSoup(response.content, 'html.parser')
# 假设我们需要解析的标签不存在
tag = soup.find('non-existent-tag')
except FeatureNotFound as e:
print(f"解析错误: {e}")
# 处理解析异常,比如尝试不同的解析器或者记录错误
3. 数据处理异常
在处理数据时,可能会遇到类型错误、值错误等。
import pandas as pd
data = {'Price': ['100', '200', 'abc']} # 假设有一个价格列表,其中包含非数字字符串
try:
df = pd.DataFrame(data)
df['Price'] = pd.to_numeric(df['Price'], errors='coerce') # 尝试将价格转换为数字,非数字的转换为NaN
except ValueError as e:
print(f"数据转换错误: {e}")
# 处理数据转换异常,比如清理数据或者记录错误
4. 重试机制
在遇到暂时性错误时,比如网络波动,可以实施重试机制。
import time
def fetch_url(url):
retries = 3
for i in range(retries):
try:
response = requests.get(url, timeout=5)
response.raise_for_status()
return response
except RequestException as e:
if i < retries - 1:
print(f"请求失败,将在{2**i}秒后重试...")
time.sleep(2**i)
else:
print(f"请求失败: {e}")
return None
response = fetch_url(url)
if response:
# 继续处理响应内容
pass
5. 日志记录
在生产环境中,记录日志是非常重要的,它可以帮助开发者追踪错误和异常。
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
try:
# 爬虫代码
pass
except Exception as e:
logging.error(f"未预料到的错误: {e}")
通过这些异常处理方法,你的爬虫代码将更加健壮,能够更好地应对各种意外情况。记住,异常处理是编写高质量代码的重要组成部分。