首頁 >後端開發 >Python教學 >使用 Selenium 和 Python 建立強大的 Web 自動化

使用 Selenium 和 Python 建立強大的 Web 自動化

DDD
DDD原創
2025-01-07 00:04:43637瀏覽

網路自動化現在是現代軟體開發和測試中不可或缺的工具。在這個全面的 Selenium Python 教程中,您將學習如何建立一個能夠處理現實場景的強大的 Web 自動化框架。如果您有興趣在 Python 中實現自動化測試或建立複雜的網頁抓取自動化解決方案,本指南將為您提供經過行業測試的方法和 Selenium 最佳實踐。

了解 Web 自動化基礎知識

網路自動化對於現代軟體開發、測試和資料收集至關重要。其應用程式涵蓋從 Web 應用程式的端到端測試到簡化重複的工作流程,例如表單提交或網頁抓取。雖然 Selenium WebDriver Python 整合提供了強大的功能,但強大的 Web 自動化不僅僅是編寫腳本來模擬使用者互動。它涉及設計可維護、適應性強且能夠適應目標 Web 應用程式變更的工作流程和框架。

以下是我們將在本教程中介紹的關鍵方面:

  • 選擇適當的定位器(XPath、CSS 等)
  • 動態元素與狀態載入
  • 實施重試機制
  • 正確管理瀏覽器會話
  • 程式碼的可維護性結構

我們將使用 Books to Scrape 作為演示網站,為電子商務網站上的價格追蹤器建立一個網頁抓取自動化項目,以演示這些概念,同時遵循 Selenium 最佳實踐。

先決條件

要學習本教程,您需要:

  • Python 3.x 安裝在您的電腦上。
  • Python程式設計基礎知識
  • 使用 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

上面的指令將在下面的螢幕截圖中顯示輸出:

Building Robust Web Automation with Selenium and Python

從上面的腳本中,您可以看到我們的自動化腳本正在追蹤所有指定 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

現在,如果您再次運行該腳本,它將追蹤產品價格並提醒您價格變化的產品,如下面的螢幕截圖所示:

Building Robust Web Automation with Selenium and Python

也許您可以在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:字串函數範例下一篇:字串函數範例