網路自動化現在是現代軟體開發和測試中不可或缺的工具。在這個全面的 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中文網其他相關文章!

Tomergelistsinpython,YouCanusethe操作員,estextMethod,ListComprehension,Oritertools

在Python3中,可以通過多種方法連接兩個列表:1)使用 運算符,適用於小列表,但對大列表效率低;2)使用extend方法,適用於大列表,內存效率高,但會修改原列表;3)使用*運算符,適用於合併多個列表,不修改原列表;4)使用itertools.chain,適用於大數據集,內存效率高。

使用join()方法是Python中從列表連接字符串最有效的方法。 1)使用join()方法高效且易讀。 2)循環使用 運算符對大列表效率低。 3)列表推導式與join()結合適用於需要轉換的場景。 4)reduce()方法適用於其他類型歸約,但對字符串連接效率低。完整句子結束。

pythonexecutionistheprocessoftransformingpypythoncodeintoExecutablestructions.1)InternterPreterReadSthecode,ConvertingTingitIntObyTecode,whepythonvirtualmachine(pvm)theglobalinterpreterpreterpreterpreterlock(gil)the thepythonvirtualmachine(pvm)

Python的關鍵特性包括:1.語法簡潔易懂,適合初學者;2.動態類型系統,提高開發速度;3.豐富的標準庫,支持多種任務;4.強大的社區和生態系統,提供廣泛支持;5.解釋性,適合腳本和快速原型開發;6.多範式支持,適用於各種編程風格。

Python是解釋型語言,但也包含編譯過程。 1)Python代碼先編譯成字節碼。 2)字節碼由Python虛擬機解釋執行。 3)這種混合機制使Python既靈活又高效,但執行速度不如完全編譯型語言。

UseeAforloopWheniteratingOveraseQuenceOrforAspecificnumberoftimes; useAwhiLeLoopWhenconTinuingUntilAcIntiment.forloopsareIdealForkNownsences,而WhileLeleLeleLeleLeleLoopSituationSituationsItuationsItuationSuationSituationswithUndEtermentersitations。

pythonloopscanleadtoerrorslikeinfiniteloops,modifyingListsDuringteritation,逐個偏置,零indexingissues,andnestedloopineflinefficiencies


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

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

Dreamweaver CS6
視覺化網頁開發工具