Seleniumは、ChromeやEdgeなどのブラウザを自動的に操作するライブラリです。
利用用途として、WebサイトやWebアプリケーションの単体テスト、Webスクレイピングによるデータ収集に使われます。
ここでは、Seleniumのインストールから使い方まで解説します。
- SIer/Web系企業での実務経験があるフリーランスエンジニア
- プログラミングスクールでの講師実績あり
- HR領域によるエンジニア特化の採用代行を業務委託で兼務
Seleniumとは
Seleniumは、ブラウザを自動的に操作するライブラリであるため、自動化テストの実施やWebスクレイピングに利用されます。
また、SeleniumはWebサイト・Webアプリに対してブラウザ操作するため、静的ページで構成されたサイトだけでなく動的ページにも対応できます。
特に、SNS等のWebサイト・Webアプリも操作できるので、ログイン機能などが実装されるページにおいても対応できる利点があります。
SeleniumによるWebスクレイピングの流れ
Seleniumによるスクレイピングの流れは、以下の3ステップを踏みます。
スクレイピング時の準備プロセス
API・クローラー/Webスクレイピング等で収集・リクエストし、データを収集します。
解析から対象になるデータを特定要素(classやxpathなど)から抽出します。
抽出・加工・整形したデータを保存し、目的に沿ったCSVやExcelファイルに出力します。
Webスクレイピングは大きく3ステップに分けられますが、Seleniumはデータ収集とデータ抽出に利用されます。
また、データ収集に対する考え方を詳しく知りたい人は「代表的なデータ収集方法とデータ活用の目的や種類」を一読ください。
Seleniumのインストール
Seleniumは、Pythonの標準ライブラリとしてインストールされていないため、別途インストールする必要があります。
Seleniumはバージョン3とバージョン4の書き方がネット上で混同されているケースが多いです。
そのため、Seleniumのバージョン確認を実施していただけると幸いです。
ここでは、バージョン3とバージョン4の書き方を並行して記載していきます。
pip show selenium
上記コマンドをMacであればターミナル、Windowsであればコマンドプロンプトで実施すれば、Seleniumのバージョンを確認できます。
pip install selenium==3.141.0
上記のpipコマンドでは、バージョン3を指定していますが任意のバージョンを指定し実施してください。
Webdriverとは
Webdriverは、各driver(ChromeDriverやFireFoxDriver・Microsoft Edge webdriverなど)を通じてブラウザと通信します。
また、Webdriverは各driverを通じてブラウザにコマンドを渡し、同ルートを介して情報を受け取ります。
webdriver(ChromeDriver)のインストール
seleniumでは、webdriverとセットで利用する必要があります。
本記事では、最も利用されるChromeDriverによるwebdriverになります。
まだお使いのPCにChromeブラウザがインストールされていない場合、以下のリンクからChromeのダウンロードとインストールを実施してください。
あるいはMicrosoft Edge Chromiumがインストールされていない場合、以下のリンクからダウンロードとインストールを実施してください。
また、ChromeDriverも同様に以下のリンクからダウンロードを実施してください。
- https://sites.google.com/a/chromium.org/chromedriver/downloads
- https://developer.microsoft.com/ja-jp/microsoft-edge/tools/webdriver/?form=MA13LH
webdriverのパス指定について、Selenium3と4で異なるため、注意が必要です。
Chrome用とEdge用にて、それぞれSelenium3,4を記載します。
# Selenium 3
from selenium import webdriver
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path="./path/to/driver", options=options)
以下は、改めてSelenium3におけるGoogle Chromeの具体的な手順を示します。
- Chromeのバージョンに一致するWebDriverをダウンロードします。
- ダウンロードリンク: Google Chrome WebDriver
- ダウンロードした
chromedriver.exe
のパスを指定します。
これで、Google Chromeブラウザを使用したSelenium3のテストを実行できます。
# Selenium 4
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
options = webdriver.ChromeOptions()
service = Service(executable_path="./path/to/driver")
driver = webdriver.Chrome(service=service, options=options)
以下は、改めてSelenium4におけるGoogle Chromeの具体的な手順を示します。
- Edgeのバージョンに一致するWebDriverをダウンロードします。
- ダウンロードリンク: Google Chrome WebDriver
- ダウンロードした
chromedriver.exe
のパスを指定します。
これで、Google Chromeブラウザを使用したSelenium4のテストを実行できます。
# Selenium 3
from selenium import webdriver
options = webdriver.EdgeOptions()
driver = webdriver.Edge(executable_path="./path/to/msedgedriver", options=options)
以下は、改めてSelenium3におけるMicrosoft Edgeの具体的な手順を示します。
- Edgeのバージョンに一致するWebDriverをダウンロードします。
- ダウンロードリンク: Microsoft Edge WebDriver
- ダウンロードした
msedgedriver.exe
のパスを指定します。
これで、Microsoft Edgeブラウザを使用したSelenium3のテストを実行できます。
# Selenium 4
from selenium import webdriver
from selenium.webdriver.edge.service import Service
options = webdriver.EdgeOptions()
service = Service(executable_path="./path/to/msedgedriver")
driver = webdriver.Edge(service=service, options=options)
以下は、改めてSelenium4におけるMicrosoft Edgeの具体的な手順を示します。
- Edgeのバージョンに一致するWebDriverをダウンロードします。
- ダウンロードリンク: Microsoft Edge WebDriver
- ダウンロードした
msedgedriver.exe
のパスを指定します。
これで、Microsoft Edgeブラウザを使用したSelenium4のテストを実行できます。
端的に言えばSelenium3では、直接executable_pathを指定します。
一方で、Selenium4ではServiceオブジェクトを経由してexecutable_pathに渡します。
webdriver-managerのインストール
Seleniumを利用するにあたり、webdriver(ChromeDriver/EdgeDriverなど)をインストールする必要があります。
また、Chrome等のブラウザは定期的にアップデートされ、古いバージョンのwebdriverが使用できなくなるケースがあります。
そのため、webdriverを自動更新するライブラリであるwebdriver-managerのインストールをおすすめします。
pip install webdriver-manager
上記コマンド実施後、Successfullyが表示されればインストール完了です。
また、Selenium3とSelenium4によってPythonファイルへの記述方法が異なります。
# Selenium 3
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
# Selenium 4
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# Selenium 3
from selenium import webdriver
from webdriver_manager.microsoft import EdgeChromiumDriverManager
driver = webdriver.Edge(executable_path=EdgeChromiumDriverManager().install())
# Selenium 4
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from webdriver_manager.microsoft import EdgeChromiumDriverManager
driver = webdriver.Edge(service=Service(EdgeChromiumDriverManager().install()))
上記コードを記述することで、ブラウザバージョンのアップデートの度に、webdriver更新時の手間が省けます。
Seleniumのメソッドの使い方
代表的なSeleniumのメソッドは以下の4つです。
メソッド名 | 説明 |
---|---|
.get() | 対象URLを指定しアクセス/データ取得するメソッド |
.find_element_by_〇〇(“”) | Selenium3にて利用されるfind系メソッド |
.find_element(By.〇〇, “xx”) | Selenium4にて利用されるfind系メソッド |
.send_keys() | 対象にデータ送信するメソッド |
.click() | 対象をEnterするメソッド |
本記事では、ブラウザ操作に利用するため、上記メソッドを重点的に解説します。
.get()メソッドの使い方
Seleniumでは、webdriverを利用しブラウザを起動する必要があります。
#Googleにアクセス
target_url = "https://www.google.co.jp"
driver.get(target_url)
上記コードを記述することで、Chromeブラウザが起動します。
.find系メソッドの使い方
Chromeブラウザを起動後、.find系メソッドで要素を取得する必要があります。
要素参照先 | 説明 |
---|---|
.find_element_by_name(“xx”) | name要素のデータ抽出 |
.find_element_by_id(“xx”) | id要素のデータ抽出 |
.find_element_by_class_name(“xx”) | class要素のデータ抽出 |
.find_element_by_xpath(“xx”) | xpath要素のデータ抽出 |
.find_element_by_css_selector(“xx”) | cssセレクタ要素のデータ抽出 |
Selenium4の場合、Byオブジェクトを使用するため、以下のモジュールをインポートしておきましょう。
from selenium.webdriver.common.by import By
要素参照先 | 説明 |
---|---|
.find_element(By.NAME,”xx”) | name要素のデータ抽出 |
.find_element(By.ID,”xx”) | id要素のデータ抽出 |
.find_elements(By.CLASS_NAME,”xx”) | class要素のデータ抽出 |
.find_element(By.XPATH,”xx”) | xpath要素のデータ抽出 |
.find_element(By.CSS_SELECTOR,”xx”) | cssセレクタ要素のデータ抽出 |
Selenium3と4で異なる記述になります。
また、単一データの場合は上記の場合で取得できますが、複数データを取得する場合はelement(s)のように、”s”を付与してください。
本記事では、Chromeの初期画面にて検索ボックス(textarea)を抽出しますが、以下のパターンで抽出できるか確認しました。
# Selenium3
# nameの場合
print(driver.find_element_by_name("q"))
# idの場合
print(driver.find_element_by_id("APjFqb"))
# classの場合
print(driver.find_element_by_class_name("gLFyf"))
# xpathの場合
print(driver.find_element_by_xpath("/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/textarea"))
# cssセレクタの場合
print(driver.find_element_by_css_selector("#APjFqb"))
# Selenium4
# nameの場合
print(driver.find_element(By.NAME, "q"))
# idの場合
print(driver.find_element(By.ID, "APjFqb"))
# classの場合
print(driver.find_element(By.CLASS_NAME, "gLFyf"))
# xpathの場合
print(driver.find_element(By.XPATH, "/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/textarea"))
# cssセレクタの場合
print(driver.find_element(By.CSS_SELECTOR, "#APjFqb"))
これで無事WebElementを取得できました。
.send_keys()メソッドの使い方
ここでは、上述したChromeの初期画面にて検索ボックス(textarea)を抽出し、文字列データを送信します。
パターンは一つに絞りますが、それぞれ要素取得できるパターンで変更してもらえたらと思います。
# Selenium3
driver.find_element_by_name("q").send_keys("Python Selenium")
# Selenium4
driver.find_element(By.NAME, "q").send_keys("Python Selenium")
ブラウザを確認すると、文字列データが検索ボックス(textarea)に入力されていることがわかると思います。
.click()メソッドの使い方
ここでは、上述したChromeの初期画面にて検索ボックス(textarea)に文字列データを送信後、クリック/Enterキーの処理を加えます。
また、Pythonファイルの処理がブラウザ操作より速いため、ブラウザの表示速度に合わせ、timeモジュールにて時間調整します。
import time
Pythonの標準ライブラリであるtimeモジュールをインポートしておきましょう。
# Selenium3
driver.find_element_by_name("q").send_keys("Python Selenium")
time.sleep(1) #処理調整
# form(クリック用)
search_button = driver.find_element_by_xpath("/html/body/div[1]/div[3]/form")
search_button.click()
# Selenium4
driver.find_element(By.NAME, "q").send_keys("Python Selenium")
time.sleep(1) #処理調整
# form(クリック用)
search_button = driver.find_element(By.XPATH, "/html/body/div[1]/div[3]/form")
search_button.click()
これで、Chromeブラウザにて検索結果が表示されているかと思います。
上記の方法を利用することで、ログインID&パスワードなどによるBasic認証を突破するスクレイピングプログラムが作成可能になります。
Selenium3,4におけるタブ・ウィンドウの切り替え方法
Selenium3とSelenium4では、それぞれタブ・ウィンドウの切り替え方法が異なります。
Selenium4は新しいドライバーオブジェクトを作成せず、同じセッションで新しいタブやウィンドウを作成し、フォーカスできます。
そのため、Selenium4は新しいタブあるいは新しいウィンドウを作成し自動的に切り替えるAPIである.new_window
が用意されています。
一方でSelenium3は、URLを新しいタブあるい新しいウィンドウを作成後、ハンドルの切り替えswitch_to.window()
を実行する必要があります。
Selenium3 | メソッド |
---|---|
タブの作成 | driver.execute_script(“window.open()”) |
タブの切り替え | driver.switch_to.window(driver.window_handles[1]) |
Selenium4 | メソッド |
---|---|
タブの作成/切り替え | driver.switch_to.new_window(“tab”) |
ウィンドウの作成/切り替え | driver.switch_to.new_window(“window”) |
どちらもタブ・ウィンドウ作成後、前のタブ・ウィンドウに戻したい場合はハンドルの切り替えで調整しましょう。
仮に作成後のタブ・ウィンドウの作業が終了し、 ブラウザーで最後に開いたウィンドウまたはタブではない場合、以前使用していたタブ・ウィンドウに切り替える必要があります。
ウィンドウを閉じた後に、別のウィンドウハンドルに切り替えを忘れると、現在閉じられたページでWebDriverが実行されたままになり、No Such Window Exception
といったエラーが発生します。
Seleniumの実行を継続するには、有効なウィンドウハンドルに切り替える必要があるため注意しましょう。
SeleniumのWebDriverWaitの使い方
Seleniumを利用してブラウザ操作する場合、ブラウザに対する待機時間もうまく処理する必要があります。
また、Seleniumにおけるエラーの原因は、指定した要素が見つからないことがほとんどです。
人間の操作より遥かに速い操作でプログラムが処理するため、指定要素の存在有無でエラーを引き起こします。
ここでは以下に3つの待機処理を紹介します。
- .implicitly_wait()による暗黙的な待機処理
- WebDriverWait.until()による明示的な待機処理
- time.sleep()の待機処理
また、Seleniumで待機処理を実施する場合に以下のWebDriverWaitモジュールをインポートしておきます。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
SeleniumによるWebDriverWaitの使い方(各待機処理の方法)を知りたい人は、「【Python】 SeleniumにおけるWebDriverの使い方を徹底解説!」を一読ください。
本格的にエンジニアへのキャリアチェンジを考えてる人へ
プログラミングスキルを社内やプライベートで活用している人が増えています。
- 一部業務プロセスの効率化/自動化
- 分析システム構築による担当業務改善
- 社内公開によるチーム/プロジェクトの業務時間短縮
Pythonは特にデータ収集や分析に特化したライブラリが豊富なため、業務プロセスの一元管理やDX化に貢献しています。
また、プログラミングに触れてエンジニアへのキャリアチェンジを実現したい人の人材規模も年々高まっています。
一度、あなたのキャリアプランを振り返ってみてください。
- 収入アップが見込めている
- キャリアアップが見込めている
- 働き方を明確に決めれている
上記の項目をYESと答えられる人は、特に言うことはありません。
現在、エンジニアへのキャリアチェンジでお悩みの方は、「【Python特化】厳選したおすすめプログラミングスクール」を一読ください。
コメント