網路自動化現在是現代軟體開發和測試中不可或缺的工具。在這個全面的 Selenium Python 教程中,您將學習如何建立一個能夠處理現實場景的強大的 Web 自動化框架。如果您有興趣在 Python 中實現自動化測試或建立複雜的網頁抓取自動化解決方案,本指南將為您提供經過行業測試的方法和 Selenium 最佳實踐。
網路自動化對於現代軟體開發、測試和資料收集至關重要。其應用程式涵蓋從 Web 應用程式的端到端測試到簡化重複的工作流程,例如表單提交或網頁抓取。雖然 Selenium WebDriver Python 整合提供了強大的功能,但強大的 Web 自動化不僅僅是編寫腳本來模擬使用者互動。它涉及設計可維護、適應性強且能夠適應目標 Web 應用程式變更的工作流程和框架。
以下是我們將在本教程中介紹的關鍵方面:
我們將使用 Books to Scrape 作為演示網站,為電子商務網站上的價格追蹤器建立一個網頁抓取自動化項目,以演示這些概念,同時遵循 Selenium 最佳實踐。
要學習本教程,您需要:
本教學的程式碼可在我們的 github 儲存庫中找到,請隨意複製它以繼續學習。
讓我們設定一個合適的開發環境並安裝必要的Python套件。首先,透過執行以下命令來建立專案資料夾和新的虛擬環境:
mkdir price_tracker_automation && cd price_tracker_automation python3 -m venv env source env/bin/activate
然後,建立以下 Python 套件並將其新增至您的requirements.txt 檔案中:
selenium==4.16.0 webdriver-manager==4.0.1 python-dotenv==1.0.0 requests==2.31.0
在上面的程式碼中,我們定義了核心依賴項。 selenium 套件為我們的 Web 自動化框架提供了基礎,而 webdriver-manager 則自動處理瀏覽器驅動程式管理。 python-dotenv 套件用於環境配置,requests 套件用於 HTTP 請求處理。
現在執行以下命令來安裝您的requirements.txt 檔案中的所有Python 套件:
pip install -r requirements.txt
最後,為我們的專案建立以下資料夾結構:
mkdir price_tracker_automation && cd price_tracker_automation python3 -m venv env source env/bin/activate
在這裡,我們遵循軟體工程最佳實務建立了模組化專案結構。 core 目錄包含我們主要的自動化元件,而 database 處理資料持久性。
創建了專案環境、依賴項和資料夾結構後,讓我們繼續使用 Selenium 和 Python 建立價格追蹤器自動化工具。
讓我們實現我們的瀏覽器管理系統,這是穩定的 Selenium WebDriver Python 整合的重要元件。將下面的程式碼片段加入您的 core/browser.py 檔案中:
selenium==4.16.0 webdriver-manager==4.0.1 python-dotenv==1.0.0 requests==2.31.0
上面的程式碼建立了一個 BrowserManager 類別來處理 WebDriver 的初始化和配置。該課程透過配置 Chrome 選項來實現穩定性和性能,從而實現 Selenium 最佳實踐。 headless 參數允許在沒有可見瀏覽器視窗的情況下運行測試,這對於 CI/CD 管道至關重要。
現在將以下方法新增至 BrowserManager 類別以實作核心瀏覽器管理功能:
pip install -r requirements.txt
在上面的程式碼中,start_browser 方法利用 webdriver-manager 自動處理驅動程式安裝和更新,而 close_browser 則確保正確的資源清理。此實作包括隱式等待配置,以優雅地處理動態頁面載入。
接下來,讓我們繼續實現元素交互系統,這在任何 Web 自動化框架中都很重要,因為它使我們能夠以可靠的方式檢測元素並與元素交互,同時遵循 Selenium 的最佳實踐。將程式碼片段加入您的 core/element_handler.py
price_tracker_automation/ ├── core/ │ ├── browser.py | ├── scraper.py │ └── element_handler.py ├── database/ │ └── db_manager.py ├── notifications/ | └── price_alert.py ├── requirements.txt ├── run.py └── main.py
在上面的程式碼中,我們建立了一個 ElementHandler 類,它封裝了 Selenium WebDriver Python 互動模式。該類別接受 WebDriver 實例和可設定的逾時參數。
更新您的 ElementHandler 類別以新增核心元素互動方法:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.support import expected_conditions as EC import logging class BrowserManager: def __init__(self, headless=False): self.options = webdriver.ChromeOptions() if headless: self.options.add_argument('--headless') # Add additional stability options self.options.add_argument('--no-sandbox') self.options.add_argument('--disable-dev-shm-usage') self.options.add_argument('--disable-gpu') self.driver = None self.logger = logging.getLogger(__name__)
上述方法使用Selenium的WebDriverWait和expected_conditions來偵測元素,以便它也可以處理元素可能非同步載入的動態網頁。
加入另一種方法來實現文字擷取邏輯:
def start_browser(self): """Initialize and return a ChromeDriver instance""" try: service = webdriver.ChromeService() self.driver = webdriver.Chrome(service=service, options=self.options) self.driver.implicitly_wait(10) return self.driver except Exception as e: self.logger.error(f"Failed to start browser: {str(e)}") raise def close_browser(self): """Safely close the browser""" if self.driver: self.driver.quit() self.driver = None
此方法包含重試邏輯來處理 StaleElementReferenceException,這是 Web 自動化中的常見挑戰。
現在讓我們建立主要的抓取功能,結合自動化測試 Python 概念和強大的錯誤處理。將下面的程式碼片段加入您的 core/scraper.py 檔案:
mkdir price_tracker_automation && cd price_tracker_automation python3 -m venv env source env/bin/activate
在上面的程式碼中,我們建立了 BookScraper 類,它整合了瀏覽器和元素處理元件。該類別遵循頁面物件模型模式,這是 Web 自動化框架設計中的關鍵概念,透過集中元素定位器並為抓取操作提供乾淨的 API。
接下來,更新BookScraper類別以新增核心產品資料擷取方法:
selenium==4.16.0 webdriver-manager==4.0.1 python-dotenv==1.0.0 requests==2.31.0
上述方法使用結構化方法來收集產品信息,維護詳細日誌以進行調試和監控。
讓我們實現 Web 自動化框架的資料庫層,它將處理我們抓取的資料的持久性儲存。該組件將使我們能夠追蹤價格隨時間的變化。將以下程式碼片段加入您的database/db_manager.py:
pip install -r requirements.txt
在上面的程式碼中,我們定義了處理所有資料庫操作的 DatabaseManager 類別。我們使用 SQLite 是為了簡單性和可移植性,以避免設定和配置資料庫,而 SQLite 也是我們的網路抓取自動化專案的理想選擇,因為我們不儲存大量資料。
接下來,更新你的database/db_manager.py以加入資料庫初始化方法:
price_tracker_automation/ ├── core/ │ ├── browser.py | ├── scraper.py │ └── element_handler.py ├── database/ │ └── db_manager.py ├── notifications/ | └── price_alert.py ├── requirements.txt ├── run.py └── main.py
在這裡,我們使用SQL DDL 語句建立資料庫模式,並為產品和價格歷史建立單獨的表,並具有適當的關係和約束,這將使我們能夠追蹤價格並對我們儲存的資料執行歷史分析。
現在讓我們新增另一種方法將資料儲存到資料庫:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.support import expected_conditions as EC import logging class BrowserManager: def __init__(self, headless=False): self.options = webdriver.ChromeOptions() if headless: self.options.add_argument('--headless') # Add additional stability options self.options.add_argument('--no-sandbox') self.options.add_argument('--disable-dev-shm-usage') self.options.add_argument('--disable-gpu') self.driver = None self.logger = logging.getLogger(__name__)
在上面的程式碼中,我們使用參數化查詢實現了資料持久化邏輯,以防止SQL注入。此方法使用 SQLite 的 ON CONFLICT 子句處理插入和更新操作。
讓我們將所有內容與我們的主應用程式類別連結在一起,合併 Selenium WebDriver Python 實作的所有元素。將以下程式碼片段加入您的 main.py 檔案:
def start_browser(self): """Initialize and return a ChromeDriver instance""" try: service = webdriver.ChromeService() self.driver = webdriver.Chrome(service=service, options=self.options) self.driver.implicitly_wait(10) return self.driver except Exception as e: self.logger.error(f"Failed to start browser: {str(e)}") raise def close_browser(self): """Safely close the browser""" if self.driver: self.driver.quit() self.driver = None
在上面的程式碼中,我們創建了主要的 PriceTracker 類,該類協調我們的網頁抓取自動化解決方案的所有元件。 PriceTracker 類別遵循依賴注入模式來維持模組化和可測試性。
接下來,更新我們的 PriceTracker 類別以新增核心追蹤方法:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException, StaleElementReferenceException class ElementHandler: def __init__(self, driver, timeout=10): self.driver = driver self.timeout = timeout
在這裡,我們實現了主要的產品追蹤邏輯,用於處理網路抓取並儲存抓取的資料。
讓我們建立一個執行腳本來執行我們的自動化腳本。將以下程式碼片段加入您的 run.py 檔案:
def wait_for_element(self, locator, timeout=None): """Wait for element with retry mechanism""" timeout = timeout or self.timeout try: element = WebDriverWait(self.driver, timeout).until( EC.presence_of_element_located(locator) ) return element except TimeoutException: raise TimeoutException(f"Element {locator} not found after {timeout} seconds") def get_text_safely(self, locator, timeout=None): """Safely get text from element with retry mechanism""" max_retries = 3 for attempt in range(max_retries): try: element = self.wait_for_element(locator, timeout) return element.text.strip() except StaleElementReferenceException: if attempt == max_retries - 1: raise continue
現在在終端機上執行以下命令來運行腳本:
mkdir price_tracker_automation && cd price_tracker_automation python3 -m venv env source env/bin/activate
上面的指令將在下面的螢幕截圖中顯示輸出:
從上面的腳本中,您可以看到我們的自動化腳本正在追蹤所有指定 URL 的價格。
我們目前的實施僅追蹤和保存產品價格。追蹤價格後,讓我們增強我們的價格追蹤器以通知用戶價格變化。將以下程式碼片段加入您的 notification/price_alert.py 檔案中:
selenium==4.16.0 webdriver-manager==4.0.1 python-dotenv==1.0.0 requests==2.31.0
在上面的程式碼片段中,我們建立了一個具有基本相依性的 PriceAlertManager 類別。管理器將資料庫管理器實例作為參數,並設定日誌記錄以追蹤警報操作。該類使用複雜的連接來比較當前和以前的價格。然後我們實現了動態價格變化百分比計算,並為價格變化資訊創建了一個結構化字典。
接下來,更新您的 PriceAlertManager 類別以新增電子郵件通知功能:
pip install -r requirements.txt
在這裡,我們使用 Python 的電子郵件和 SMTP 庫建立了電子郵件通知。此實作使用 MIMEText 類別來建立格式正確的電子郵件。電子郵件正文是使用 f 字串動態產生的,包含詳細的價格變化資訊和精確的貨幣格式。
現在讓我們修改運行腳本以包含價格警報:
price_tracker_automation/ ├── core/ │ ├── browser.py | ├── scraper.py │ └── element_handler.py ├── database/ │ └── db_manager.py ├── notifications/ | └── price_alert.py ├── requirements.txt ├── run.py └── main.py
現在,如果您再次運行該腳本,它將追蹤產品價格並提醒您價格變化的產品,如下面的螢幕截圖所示:
也許您可以在 cron 作業中執行此腳本來追蹤產品價格並即時提醒您價格變化,而無需每次都手動執行它。
例如。 0 */6 * * * python run.py --urls
“http://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html”
“http://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html”
“http://books.toscrape.com/catalogue/soumission_998/index.html”
透過本教學課程,您學習如何使用 Selenium 和 Python 建立強大的 Web 自動化工具。我們首先了解網路自動化基礎知識,然後為我們為本教程中的演示構建的 Price Traker 工具建立一個開發環境。然後,我們進一步建立了價格追蹤應用程序,用於追蹤產品價格並提醒用戶價格變化。現在您已經掌握了這些知識,接下來您將建立什麼工具。請在評論部分告訴我。快樂編碼!
以上是使用 Selenium 和 Python 建立強大的 Web 自動化的詳細內容。更多資訊請關注PHP中文網其他相關文章!