在編寫爬蟲代碼時,添加異常處理是非常重要的一步,因為它可以幫助我們處理網絡請求中可能出現的各種問題,比如網絡連接錯誤、超時、解析錯誤等。以下是如何在Python爬蟲代碼中添加異常處理的示例:
import requests
from bs4 import BeautifulSoup
from requests.exceptions import RequestExceptiondef 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,將引發HTTPErrorsoup = 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
語句,這樣可以更準確地定位問題。同時,對于生產環境中的爬蟲,我們還需要考慮日志記錄、錯誤重試、異常上報等功能,以確保爬蟲的穩定性和可維護性。