iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0

爬蟲過程中,網路波動或伺服器超時等等的情況是不可避免的,今天我將著重於如何在爬蟲過程中應對這些異常情況,並保證爬蟲的穩定性;通過加入錯誤處理機制,我可以在面對各種網路異常時保持爬蟲的穩定性,並避免因一個小錯誤而中斷整個抓取過程。

首先我將設計一個異常處理機制,這個機制會捕捉網絡請求中的各種錯誤,並嘗試進行多次重試,在最終重試失敗後,我會記錄錯誤,並跳過這一數據,而不會讓錯誤中斷整個爬蟲流程。

import aiohttp
async def fetch_gene_page(session, url, retries=3):
    for attempt in range(retries):
        try:
            async with session.get(url, timeout=10) as response:
                response.raise_for_status()  
                return await response.text() 
        except (aiohttp.ClientError, aiohttp.http_exceptions.HttpProcessingError) as e:
            logging.error(f"Error fetching {url}: {str(e)}")
            if attempt < retries - 1:
                await asyncio.sleep(2)  # 
                continue
            else:
                logging.error(f"Failed to fetch {url} after {retries} attempts.")
                return None 

在上面這段 Code 中,我實現了異常處理和重試機制,一開始我抓出了 aiohttp.ClientErrorHttpProcessingError 這兩類常見的網路錯誤。當請求失敗時,會重試最多三次,每次重試之間等待 2 秒鐘,如果所有重試都失敗,則會記錄這個錯誤並返回 None,表示該基因頁面無法被成功抓取。

錯誤報告:此外我還可以設置一個簡單的錯誤報告系統,將所有出現錯誤的基因記錄下來,以便後續進行手動處理或再次嘗試。

failed_genes = []  
async def fetch_gene_page(session, url, retries=3):
    for attempt in range(retries):
        try:
            async with session.get(url, timeout=10) as response:
                response.raise_for_status()
                return await response.text()
        except Exception as e:
            if attempt == retries - 1:
                failed_genes.append(url) 
                return None

在上面這段 Code 中,我將所有最終失敗的基因頁面 URL 添加到 failed_genes 列表中,這樣可以在抓取過程結束後進行查看,並根據需要進行再次處理或手動調整。

通過異常處理機制的引入,能夠讓爬蟲在面對網路波動時保持穩定運行,同時不會因單個錯誤而影響整個流程。這樣的設計能夠顯著提高爬蟲的健壯性,並保證在處理大規模基因數據時能夠順利完成抓取任務。


上一篇
Day13:添加爬蟲日誌記錄與進度追蹤
下一篇
Day15:整合爬取的基因數據
系列文
從零基礎到實戰:利用網頁爬蟲結合 RPKM 算法計算 COVID-19 感染者肺部基因表達量25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言