Web の自動化は、現代のソフトウェア開発とテストにおいて不可欠なツールとなっています。この包括的な Selenium Python チュートリアルでは、現実世界のシナリオを処理できる堅牢な Web オートメーション フレームワークを構築する方法を学びます。 Python での自動テストの実装や、複雑な Web スクレイピング自動化ソリューションの作成に興味がある場合は、このガイドで業界でテスト済みのアプローチと Selenium のベスト プラクティスを説明します。
Web 自動化は、最新のソフトウェア開発、テスト、データ収集において不可欠です。そのアプリケーションは、Web アプリケーションのエンドツーエンドのテストから、フォームの送信や Web スクレイピングなどの反復的なワークフローの簡素化まで多岐にわたります。 Selenium WebDriver Python の統合は強力な機能を提供しますが、堅牢な Web 自動化は、単にユーザー操作を模倣するスクリプトを作成するだけではありません。それは、ターゲット Web アプリケーションへの変更に対する保守性、適応性、回復力を備えたワークフローとフレームワークを設計することです。
以下は、このチュートリアル全体で説明する重要な側面です:
Selenium のベスト プラクティスを遵守しながら、これらの概念を実証するデモ サイトとして Books to Scrape を使用して、電子商取引 Web サイトの価格トラッカーのための Web スクレイピング自動化プロジェクトを構築します。
このチュートリアルを進めるには、次のものが必要です:
このチュートリアルのコードは 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
上記のコードは、WebDriver の初期化と構成を処理する BrowserManager クラスを作成します。このクラスは、安定性とパフォーマンスのために Chrome オプションを構成することにより、Selenium のベスト プラクティスを実装します。 headless パラメータを使用すると、ブラウザ ウィンドウを表示せずにテストを実行できます。これは CI/CD パイプラインにとって重要です。
次に、次のメソッドを BrowserManager クラスに追加して、コアのブラウザ管理機能を実装します。
pip install -r requirements.txt
上記のコードでは、start_browser メソッドは webdriver-manager を利用してドライバーのインストールと更新を自動的に処理し、close_browser は適切なリソースのクリーンアップを保証します。この実装には、動的ページの読み込みを適切に処理するための暗黙的な待機構成が含まれています。
次に、要素対話システムの実装に進みましょう。これは、Selenium のベスト プラクティスに従いながら、信頼性の高い方法で要素を検出して対話できるため、Web オートメーション フレームワークにおいて重要です。コード スニペットを 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
上記のコードでは、Selenium WebDriver Python インタラクション パターンをカプセル化する ElementHandler クラスを作成しました。このクラスは、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 を使用して要素を検出するため、要素が非同期で読み込まれる可能性のある動的 Web ページも処理できます。
テキスト抽出ロジックを実装する別のメソッドを追加します:
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
このメソッドには、Web オートメーションにおける一般的な課題である StaleElementReferenceException を処理するための再試行ロジックが含まれています。
次に、自動テスト Python の概念と堅牢なエラー処理を組み込んだ、メインのスクレイピング機能を構築しましょう。以下のコード スニペットを core/scraper.py ファイルに追加します:
mkdir price_tracker_automation && cd price_tracker_automation python3 -m venv env source env/bin/activate
上記のコードでは、ブラウザと要素処理コンポーネントを統合する BookScraper クラスを作成しました。このクラスは、要素ロケーターを一元化し、スクレイピング操作用のクリーンな API を提供することにより、Web オートメーション フレームワーク設計の重要な概念であるページ オブジェクト モデル パターンに従います。
次に、BookScraper クラスを更新して、コア製品データ抽出メソッドを追加します。
selenium==4.16.0 webdriver-manager==4.0.1 python-dotenv==1.0.0 requests==2.31.0
上記の方法では、構造化されたアプローチを使用して製品情報を収集し、デバッグと監視のための詳細なログを維持します。
スクレイピングしたデータの永続ストレージを処理する、Web オートメーション フレームワークのデータベース層を実装しましょう。このコンポーネントにより、時間の経過に伴う価格の変化を追跡できるようになります。以下のコード スニペットをデータベース/db_manager.py に追加します:
pip install -r requirements.txt
上記のコードでは、すべてのデータベース操作を処理する DatabaseManager クラスを定義しました。データベースのセットアップと構成を避けるために、シンプルさと移植性のために SQLite を使用しました。SQLite は大量のデータを保存しないため、Web スクレイピング自動化プロジェクトにも最適です。
次に、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
上記のコードでは、Web スクレイピング自動化ソリューションのすべてのコンポーネントを調整するメインの 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
ここでは、Web スクレイピングを処理し、スクレイピングされたデータを保存する主要な製品追跡ロジックを実装しました。
自動化スクリプトを実行するための実行スクリプトを作成しましょう。次のコード スニペットを 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-strings を使用して動的に生成され、詳細な価格変更情報と正確な通貨形式が組み込まれます。
次に、価格アラートを含めるように実行スクリプトを変更しましょう:
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 自動化ツールを構築する方法を学習しました。まず Web オートメーションの基礎を理解してから、このチュートリアルのデモンストレーション用に構築した Price Traker ツールの開発環境をセットアップしました。次に、製品の価格を追跡し、価格の変更をユーザーに通知する価格トラッカー アプリケーションの構築にさらに進みました。この知識が得られたので、次はどのようなツールを構築しますか。コメント欄でお知らせください。コーディングを楽しんでください!
以上がSelenium と Python を使用した堅牢な Web オートメーションの構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。