1. 處理腳本中的錯誤
網頁爬蟲的挑戰
想像一下:你的腳本看起來一切都就緒了,但突然踩到了香蕉皮——糟糕!出錯了!怎麼樣才能讓腳本在互聯網的嚴苛條件下存活呢?今天我們會教它兩個重要技能:穩定性和重試機制。 沒錯,我們會配置重試和超時。
網頁爬蟲的工作可能是順利的,但直到某一刻你發現腳本突然停止運行,可能因為:
- 連線中斷。
- 伺服器暫時不可用。
- 頁面 HTML 結構的不可預測變化。
你的腳本就像武士一樣,應該能應對突如其來的狀況。某些時候,問題可以通過稍微等待一下並再次嘗試來解決。這時候,我們的英雄們——重試和超時,登場了!
錯誤處理機制入門
首先,讓我們複習一下基礎——Python 中的錯誤處理。我們使用 try-except 塊來處理錯誤,並防止它們中斷腳本的運行。
import requests
try:
response = requests.get('https://example.com')
response.raise_for_status() # 檢查請求是否成功
except requests.exceptions.RequestException as e:
print(f'發生錯誤: {e}')
2. 重試機制的設定
為什麼要使用重試?
如果腳本在第一次失敗時就停止,就像一隻害怕暴雨的貓。而你需要的是一個能夠承受幾次挫折的腳本。因此,我們配置重試——讓腳本變得更加堅韌。
如何配置重試機制
現在讓我們來看看如何設置重試。最簡單的方法之一是使用 urllib3 庫,它提供了自動重試的功能。
from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
import requests
session = requests.Session()
retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
session.mount('https://', HTTPAdapter(max_retries=retries))
try:
response = session.get('https://example.com')
response.raise_for_status()
print(response.content)
except requests.exceptions.RequestException as e:
print(f'發生錯誤: {e}')
在這個例子中,我們創建了一個 session,並應用了重試機制 (Retry)。 我們設置了在遇到 500、502、503 和 504 狀態碼時最多重試 5 次。 backoff_factor=1 表示每次重試的間隔時間會以指數級增長(1、2、4、8... 秒)。
3. 超時機制: 防止卡住
設定合理的等待時間
超時就像鬧鐘:可以防止陷入無休止的等待。設置超時後,你對腳本說:"別等了!如果伺服器在指定時間內沒有回應,繼續下一步!"
try:
response = requests.get('https://example.com', timeout=10)
response.raise_for_status()
print(response.content)
except requests.exceptions.Timeout:
print('請求超過等待時間')
except requests.exceptions.RequestException as e:
print(f'發生錯誤: {e}')
為什麼這很重要?
你是否曾經在等待伺服器響應時陷入僵局,而伺服器早就像烤吐司一樣焦了?超時可以防止不必要的等待,讓你的腳本能迅速恢復並繼續工作。 別讓你的腳本"認為"它有時間出去抽根菸!
4. 配置範例
應用重試的穩健腳本
現在讓我們組合出一個如鋼鐵俠般穩健的腳本。我們將利用重試和超時機制。
from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
import requests
def fetch_url(url):
session = requests.Session()
retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
session.mount('https://', HTTPAdapter(max_retries=retries))
try:
response = session.get(url, timeout=10)
response.raise_for_status()
return response.content
except requests.exceptions.Timeout:
print('請求超過等待時間')
except requests.exceptions.RequestException as e:
print(f'發生錯誤: {e}')
return None
content = fetch_url('https://example.com')
if content:
print('成功下載數據!')
利用超時防止腳本卡住
我們已經示範了如何設置超時。現在我們來確保腳本不僅穩定,還能合理應對長時間等待。 與其卡住,它會提醒主人:"嘿,伺服器拖太久了,我不想再等了!"
這樣簡單且直接的方法可以讓你的代碼更加可靠,隨時準備好迎接互聯網上可能出現的各種不可預測的狀況。
實際應用
當你開發真實的爬蟲專案時,經常會面對伺服器端的各種限制。重試和超時是你最好的助手,可以最小化失敗風險。 它們有助於確保腳本穩定運行,尤其是在自動化數據處理和需要準時獲取精準結果時。 這些技術還能提升你的履歷質量以及客戶對你提供的數據的信任度。
GO TO FULL VERSION