CodeGym /課程 /Python SELF TW /優化腳本以達到穩定運行與減少錯誤

優化腳本以達到穩定運行與減少錯誤

Python SELF TW
等級 38 , 課堂 3
開放

1. 性能分析

為什麼需要優化?

想像一輛強大的跑車,可以在三秒內加速到100公里/小時,但油耗卻像鯨魚吃浮游生物一樣高。同樣,你的腳本也可能非常快速,但在資源和執行時間方面特別消耗。如果資源有“洩漏”,腳本可能會變得不穩定,甚至引發錯誤。優化可以幫助避免這些問題。

首先,就像外科醫生說的,讓我們“動刀”。分析我們腳本的性能以了解可能的“瓶頸”。

測試腳本速度和穩定性的方式

一個簡單的分析方式是使用Python的基礎工具,例如模組time。讓我們在腳本中添加幾行程式碼,查看哪些操作花費最多時間。

Python

import time

start_time = time.time()
# 這裡是你用Selenium執行操作的程式碼
end_time = time.time()

print(f"執行時間: {end_time - start_time} 秒")
  

這段小程式碼可以幫你確定某段程式碼的執行時間。利用這樣的“計時器”,可以定位“瓶頸”。

識別弱點並優化

當找到“吃”時間的程式碼後,可以著手改善了。或許,你訪問動態元素的次數比實際需求多,或者你的程式碼結構混亂如“義大利麵”。第一步是識別問題,第二步是行動。

減少請求次數:檢查是否進行了多餘的頁面跳轉或DOM更新。例如,使用方法WebDriverWait可以保證在所需元素完全加載後才執行腳本。

Python

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, 'myDynamicElement'))
)
  

緩存資料:如果你反覆處理相同的資料,考慮使用緩存。將資料存入變數或緩存中以減少高資源消耗的操作。

2. 改善腳本結構

如果你的程式碼像沒有標記、站名的地鐵圖一樣難懂,那麼是時候進行改進了。良好的程式碼結構是易於理解以及錯誤容忍的關鍵。

使用數據流管線和最佳的算法解決方案

想想把你的程式碼結構化為數據流管線,每個函數或模組負責一個邏輯任務。將程式碼分為邏輯模塊不僅提高可讀性,也方便調試。

Python

def load_page(url):
    driver.get(url)

def extract_data():
    # 資料提取程式碼
    pass

def save_data():
    # 資料保存程式碼
    pass

load_page("http://example.com")
extract_data()
save_data()
  

改善程式碼的可讀性和可測試性

遵循“一個函數—一個任務”的原則。這樣會更容易測試和重構。使用命名的常數取代“魔法數字”和字串以增加清晰性。

Python

MAX_RETRIES = 5

def fetch_data_with_retry():
    for attempt in range(MAX_RETRIES):
        try:
            # 嘗試獲取資料
            pass
        except Exception as e:
            print(f"嘗試第 {attempt+1} 次失敗: {e}")
  

3. 如果程式碼可以改善,那就應該改善

使用顯式等待取代隱式等待

顯式等待允許你精確地控制何時讓Selenium開始操作,確保在需要的元素出現後才執行操作。不要依賴隱式等待(例如implicitly_wait),使用WebDriverWait庫可以根據條件自定義等待時間(例如元素是否可見,可點擊等等)。

顯式等待的使用範例

Python

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.ID, "target_element"))
)
  
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION