使用 Selenium 和 Python 建立強大的 Web 自動化
網路自動化現在是現代軟體開發和測試中不可或缺的工具。在這個全面的 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
上面的指令將在下面的螢幕截圖中顯示輸出:
從上面的腳本中,您可以看到我們的自動化腳本正在追蹤所有指定 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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

每天學習Python兩個小時是否足夠?這取決於你的目標和學習方法。 1)制定清晰的學習計劃,2)選擇合適的學習資源和方法,3)動手實踐和復習鞏固,可以在這段時間內逐步掌握Python的基本知識和高級功能。

Python在開發效率上優於C ,但C 在執行性能上更高。 1.Python的簡潔語法和豐富庫提高開發效率。 2.C 的編譯型特性和硬件控制提升執行性能。選擇時需根據項目需求權衡開發速度與執行效率。

Python和C 各有優勢,選擇應基於項目需求。 1)Python適合快速開發和數據處理,因其簡潔語法和動態類型。 2)C 適用於高性能和系統編程,因其靜態類型和手動內存管理。

pythonlistsarepartofthestAndArdLibrary,herilearRaysarenot.listsarebuilt-In,多功能,和Rused ForStoringCollections,而EasaraySaraySaraySaraysaraySaraySaraysaraySaraysarrayModuleandleandleandlesscommonlyusedDduetolimitedFunctionalityFunctionalityFunctionality。

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

Python在科學計算中的應用包括數據分析、機器學習、數值模擬和可視化。 1.Numpy提供高效的多維數組和數學函數。 2.SciPy擴展Numpy功能,提供優化和線性代數工具。 3.Pandas用於數據處理和分析。 4.Matplotlib用於生成各種圖表和可視化結果。

Python在Web開發中的關鍵應用包括使用Django和Flask框架、API開發、數據分析與可視化、機器學習與AI、以及性能優化。 1.Django和Flask框架:Django適合快速開發複雜應用,Flask適用於小型或高度自定義項目。 2.API開發:使用Flask或DjangoRESTFramework構建RESTfulAPI。 3.數據分析與可視化:利用Python處理數據並通過Web界面展示。 4.機器學習與AI:Python用於構建智能Web應用。 5.性能優化:通過異步編程、緩存和代碼優
