爬虫代码中如何添加异常处理?
在编写爬虫代码时,添加异常处理是非常重要的一步,因为它可以帮助我们处理网络请求中可能出现的各种问题,比如网络连接错误、超时、解析错误等。以下是如何在Python爬虫代码中添加异常处理的示例:
import requests
from bs4 import BeautifulSoup
from requests.exceptions import RequestException
def get_product_details(url):
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get(url, headers=headers, timeout=10) # 设置超时时间为10秒
response.raise_for_status() # 如果响应状态码不是200,将引发HTTPError
soup = BeautifulSoup(response.text, 'lxml')
title = soup.find('div', class_='title').get_text(strip=True)
price = soup.find('span', class_='price').get_text(strip=True)
image = soup.find('img', class_='main-image')['src']
return {
'title': title,
'price': price,
'image': image
}
except RequestException as e:
print(f"请求异常: {e}")
except Exception as e:
print(f"其他异常: {e}")
except:
print("未知错误")
return None
# 示例URL
url = 'https://detail.1688.com/offer/123456789.html'
product_details = get_product_details(url)
if product_details:
print(product_details)
else:
print("商品详情获取失败")
在这个示例中,我们使用了try-except
语句来捕获异常:
RequestException
:这是requests
库中定义的一个基类,用于捕获所有请求相关的异常,比如连接错误、超时等。HTTPError
:当响应的状态码不是200时,response.raise_for_status()
会抛出这个异常。Exception
:这是一个通用异常,用于捕获除了RequestException
之外的其他所有异常。except:
:这是一个通配符,用于捕获所有未被前面except
语句捕获的异常。
在实际应用中,我们可以根据需要捕获更具体的异常,并根据异常类型进行不同的错误处理。例如,如果是网络连接问题,我们可能需要重试请求;如果是解析错误,我们可能需要检查HTML结构是否发生了变化。
请注意,异常处理应该尽可能具体,避免使用过于宽泛的except
语句,这样可以更准确地定位问题。同时,对于生产环境中的爬虫,我们还需要考虑日志记录、错误重试、异常上报等功能,以确保爬虫的稳定性和可维护性。