【スクレイピングのド定番】Seleniumの紹介

OSWindows 10 64bit
Python3.10.2
Selenium4.3.0
webdriver_manager3.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つのステップが必要です。

Seleniumのインストール

Shell
pip install selenium

Google Chrome Webドライバのインストール

Google Chrome Webドライバのインストール方法には2つの方法があります。

ドライバをダウンロードし、所定の場所に配置したうえで、プログラム上でその場所を指定する方法。こちらは、ドライバのバージョンとお使いのChromeブラウザのバージョンが一致しているものをダウンロードする必要があります。よくあるのが、当時は動いていたのにブラウザのバージョンが上がったためドライバのバージョンと合わなくなり動かなくなったという問題です。

もう一つは自動的にブラウザに合ったWebドライバをインストールしてくれるWebdriver Managerライブラリをインストールし、プログラム中に記述する方法です。こちらは先述したバージョン不一致問題を解決しつつ、ダウンロードして配置する煩わしい作業も行ってくれる優れたライブラリです。本記事ではこちらの方法を採用することにします。

詳しいWebdriver Managerのインストール方法は以下の記事でご紹介しております。参考にしてください。

【Webドライバのバージョン問題をスッキリ解決!】SeleniumのWebdriver Managerの紹介【Webドライバのバージョン問題をスッキリ解決!】SeleniumのWebdriver Managerの紹介

基本的な流れ

Seleniumの初期化

Seleniumの初期化はWebdriverのオブジェクトとブラウザへのオプションなどを指定します。

初期ページの取得

起点となるページを取得します。

要素の取得

取得したページの中から、要素を検索し取得します。

要素やページに対して操作

取得した要素に対して操作を行います。
この操作には次のページへ遷移することも含まれます。遷移した場合はSTEP.2へ戻ります。

使い方

以降、使い方を簡単にご紹介します。

初期化

Python
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サーバなどを利用する際に想定するマシン環境を指定するときに使うようです。

Python
options = webdriver.ChromeOptions()
# ブラウザオプションを追加
options.add_argument(...)
driver = webdriver.Chrome(service=fs.Service(executable_path=ChromeDriverManager().install()), options=options)

以下では代表的なオプションをいくつかご紹介します。(順不同)
その他のオプションについてはこちらをご参照ください。

–headless

Python
options.add_argument('--headless')
# または
options.headless = True

Trueの場合、ブラウザを起動せずにSeleniumを実行します。

–start-maximized

Python
options.add_argument('--start-maximized')

最大画面サイズで起動します。

add_extension

Python
options.add_extension('EXTENSION_PATH.ctx')

起動時に利用する拡張機能を指定できます。引数に拡張機能のパスを指定します。

ページを取得

初めに取得するページのURLを指定します。

Python
driver.get('https://example.com')

要素を取得

要素を取得するために要素検索を行います。検索方法は以下のいずれかを指定します。

項目指定方法
idBy.ID
xpathBy.XPATH
link textBy.LINK_TEXT
partial link textBy.PARTIAL_LINK_TEXT
nameBy.NAME
tag nameBy.TAG_NAME
class nameBy.CLASS_NAME
css selectorBy.CSS_SELECTOR

一つの要素を取得

一つの要素を検索し取得するだけならfind_elementメソッドを使用します。
例えば、idを指定し一つの要素を取得するには以下のようにします。

Python
element = driver.find_element(by=By.ID, value='id_name')

複数の要素をリストで取得

複数の要素を検索し取得するにはfind_elementsメソッドを使用します。
例えば、タグ名を指定し複数の要素を取得するには以下のようにします。

Python
elements = driver.find_elements(by=By.TAG_NAME, value='li')

要素からさらに要素を取得

取得した要素からさらに続けて要素を検索することもできます。

Python
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属性の値を取得するには以下のようにします。

Python
url = element.get_attribute('href')

クリック

リンクやボタンなどのクリック操作を行うには、clickメソッドを使用します。
例えば、aタグのHTML要素をクリックする場合は以下のようにします。

Python
element.click()

値の挿入とクリア

テキストボックスなどに値を挿入したい場合は、send_keysメソッドを使用します。
例えば、inputタグのテキストボックスに値を挿入する場合は以下のようにします。

Python
element.send_keys('example text')

クリアしたい場合は、clearメソッドを使用します。

Python
element.clear()

JavaScriptの実行

ページに対してJavaScriptを実行したい場合は、execute_scriptメソッドを使用します。こちらは、要素に対してではないのでご注意ください。

Python
driver.execute_script('console.log("js execute")')

まとめ

本記事ではWebブラウザの操作を自動化するSeleniumライブラリをご紹介しました。
日々のブラウザでの単調な作業があればSeleniumに任せることで、ほかの作業に注力することも可能です。
スクレイピングで使用されることが多いですが、操作の自動化を目的とするなら応用の幅はかなり広いかと思います。

ご活用してみてはいかがでしょうか。
ただし、冒頭にも書いた通りアクセス過多により可用性を失う行為は絶対に避けて下さい!

参考

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です