OS | Windows 10 64bit |
Python | 3.10.2 |
Selenium | 4.3.0 |
webdriver_manager | 3.8.1 |
Seleniumは、Webブラウザの自動化を目的として開発されているPythonライブラリです。Pythonのほかにも、RubyやJavascriptなどの実装もあります。
Seleniumでよく紹介されている活用方法は、スクレイピングです。
スクレイピングは、Webサイトやデータベースから特定の情報をかき集める行為です。機械学習やデータ分析で、データを収集するためにスクレイピングを使用する場面も多いはずです。
活用方法はスクレイピング以外にも、Webテストのため、本ブログでも紹介したFakerを使ってダミーデータを生成し、SeleniumでWebページに自動入力や自動ログインという使い方もできます。
スクレイピングを行う際は、対象となるWebサイトのルールに従って行ってください。Webサイトによっては、スクレイピング自体禁止していることもあるので、注意してください。
また、短い時間で頻繁にリクエストを送信する行為はサーバに負荷をかけ、サービスの可用性を著しく損なう危険性があるので、適度に間隔をあける処理を入れるなどサーバに負荷がかからないよう注意してください。
本記事ではSeleniumのインストール方法から簡単な使い方までをご紹介します。また、操作対象のWebブラウザはGoogle Chromeとします。
Seleniumを使うためには、SeleniumのインストールとGoogle Chrome Webドライバのインストールという2つのステップが必要です。
pip install selenium
Google Chrome Webドライバのインストール方法には2つの方法があります。
ドライバをダウンロードし、所定の場所に配置したうえで、プログラム上でその場所を指定する方法。こちらは、ドライバのバージョンとお使いのChromeブラウザのバージョンが一致しているものをダウンロードする必要があります。よくあるのが、当時は動いていたのにブラウザのバージョンが上がったためドライバのバージョンと合わなくなり動かなくなったという問題です。
もう一つは自動的にブラウザに合ったWebドライバをインストールしてくれるWebdriver Managerライブラリをインストールし、プログラム中に記述する方法です。こちらは先述したバージョン不一致問題を解決しつつ、ダウンロードして配置する煩わしい作業も行ってくれる優れたライブラリです。本記事ではこちらの方法を採用することにします。
詳しいWebdriver Managerのインストール方法は以下の記事でご紹介しております。参考にしてください。
【Webドライバのバージョン問題をスッキリ解決!】SeleniumのWebdriver Managerの紹介Seleniumの初期化はWebdriverのオブジェクトとブラウザへのオプションなどを指定します。
起点となるページを取得します。
取得したページの中から、要素を検索し取得します。
取得した要素に対して操作を行います。
この操作には次のページへ遷移することも含まれます。遷移した場合はSTEP.2へ戻ります。
以降、使い方を簡単にご紹介します。
from selenium import webdriver
from selenium.webdriver.chrome import service as fs
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=fs.Service(executable_path=ChromeDriverManager().install()))
初期化では、ブラウザに合ったWeb driverを指定しますが、今回はWebdriver ManagerライブラリのChromeDriverManager
を使用して、自動インストールおよび更新するようにしています。
ブラウザを起動する際のオプションをいくつか指定することが来ます。
ちなみに、ChromeのオプションはChromiumOptionsを継承しています。
Capabilitiesというオプションのようなものもありますが、こちらはリモートSeleniumサーバなどを利用する際に想定するマシン環境を指定するときに使うようです。
options = webdriver.ChromeOptions()
# ブラウザオプションを追加
options.add_argument(...)
driver = webdriver.Chrome(service=fs.Service(executable_path=ChromeDriverManager().install()), options=options)
以下では代表的なオプションをいくつかご紹介します。(順不同)
その他のオプションについてはこちらをご参照ください。
–headless
options.add_argument('--headless')
# または
options.headless = True
True
の場合、ブラウザを起動せずにSeleniumを実行します。
–start-maximized
options.add_argument('--start-maximized')
最大画面サイズで起動します。
add_extension
options.add_extension('EXTENSION_PATH.ctx')
起動時に利用する拡張機能を指定できます。引数に拡張機能のパスを指定します。
初めに取得するページのURLを指定します。
driver.get('https://example.com')
要素を取得するために要素検索を行います。検索方法は以下のいずれかを指定します。
項目 | 指定方法 |
---|---|
id | By.ID |
xpath | By.XPATH |
link text | By.LINK_TEXT |
partial link text | By.PARTIAL_LINK_TEXT |
name | By.NAME |
tag name | By.TAG_NAME |
class name | By.CLASS_NAME |
css selector | By.CSS_SELECTOR |
一つの要素を検索し取得するだけならfind_element
メソッドを使用します。
例えば、idを指定し一つの要素を取得するには以下のようにします。
element = driver.find_element(by=By.ID, value='id_name')
複数の要素を検索し取得するにはfind_elements
メソッドを使用します。
例えば、タグ名を指定し複数の要素を取得するには以下のようにします。
elements = driver.find_elements(by=By.TAG_NAME, value='li')
取得した要素からさらに続けて要素を検索することもできます。
element = driver.find_element(by=By.ID, value='id_name')
elements = element.find_elements(by=By.TAG_NAME, value='li') # 取得した要素からさらに要素を検索
取得した要素が持つ属性の値を取得するには、get_attribute
メソッドを使用します。
例えば、aタグのHTML要素のhref属性の値を取得するには以下のようにします。
url = element.get_attribute('href')
リンクやボタンなどのクリック操作を行うには、click
メソッドを使用します。
例えば、aタグのHTML要素をクリックする場合は以下のようにします。
element.click()
テキストボックスなどに値を挿入したい場合は、send_keys
メソッドを使用します。
例えば、inputタグのテキストボックスに値を挿入する場合は以下のようにします。
element.send_keys('example text')
クリアしたい場合は、clear
メソッドを使用します。
element.clear()
ページに対してJavaScriptを実行したい場合は、execute_script
メソッドを使用します。こちらは、要素に対してではないのでご注意ください。
driver.execute_script('console.log("js execute")')
本記事ではWebブラウザの操作を自動化するSeleniumライブラリをご紹介しました。
日々のブラウザでの単調な作業があればSeleniumに任せることで、ほかの作業に注力することも可能です。
スクレイピングで使用されることが多いですが、操作の自動化を目的とするなら応用の幅はかなり広いかと思います。
ご活用してみてはいかがでしょうか。
ただし、冒頭にも書いた通りアクセス過多により可用性を失う行為は絶対に避けて下さい!