【Python】Selenium:ブラウザ操作して静的・動的(Ajax、javascript)ページから情報を取得
2021.01.31 /

本記事ではPythonのSeleniumを使用して、ブラウザ操作から静的・動的(Ajax、javascript)ページの情報を取得する方法を解説します。
RPAのようにブラウザで行っている作業を自動化したい場合や、データ収集の自動化をする方法の1つにSeleniumが候補に上がります。
SeleniumはRequestsなどよりも高度なWebページ操作ができるので、様々なことが実現できるようになります。
Seleniumについて学んで、今まで手作業で行っていたことを自動化できるようになりましょう!
本記事のプログラムは以下の環境で実行しております。
- OS:Windows10
- Google Chrome: 88.0.4324.104(Official Build)
- ChromeDriver:88.0.4324.96
- Python:Python 3.7.6
- Selenium:3.141.0
本記事を通して以下の知識を学べます。
- Seleniumモジュールについて
- Seleniumを使う前の準備について
- Seleniumの基本操作(ブラウザ操作、要素の検索・操作、HTML情報の取得)
Seleniumモジュール
Seleniumとは
Pythonでブラウザを操作・制御するにはSeleniumモジュールを使用します。
Seleniumモジュールにより、Webページのリンクやボタンをクリックしたり、ログイン情報の入力、Webページの情報取得などができます。
Seleniumはスクレイピングによるデータ収集の際によく使用されます。
スクレイピングとは、インターネット上の様々なWebサイトから自動的に数多くの情報を集める手法です
スクレイピングにはHTTP通信を行うRequests、HTML分析のためのBeautiful Soup 4が有名です。
SeleniumはRequestsも高度にWebページの操作ができます。
しかしSeleniumはブラウザを操作するため、Requestsよりもスピードは遅く、バックグラウンドでの実行はできません。
通常の静的なページからHTML情報を集めるだけであれば、Requestsを使用する方がいいです。
スクレイピング以外ではブラウザの動作検証でも使用されます。
WEBサイトを構築した際に、正常に動作するかをテストする際にSeleniumを使用することもあります。
動的なページ(javascript、Ajax)でも使用可能
Webページを取得する際に静的(static)なページであれば、HTTP通信を行うライブラリであるRequestsで事足ります。
しかし動的なページ、javascriptやAjaxを使用しているページであればRequestsでは望む情報を取得できないことがあります。
そこで動的なWebページの取得には、ブラウザを操作するSeleniumを使用します。
Seleniumであれば、Ajaxやjavascriptをブラウザで動作させてから、望む情報を取得することができます。
BeautifulSoupと組み合わせる
スクレイピングではBeautifulSoupと組み合わせてSeleniumを使うと効果的です。
クローリングにはSeleniumを使い、スクレイピング(HTML分析)にはより高速なBeautifulSoupを使います。
SeleniumではHTML分析が遅いので、より高速なBeautifulSoupを使うのが一般的です。
BeautifulSoup4の使い方については以下記事をご参照ください。

【Python】スクレイピング:BeautifulSoup4によるHTML解析
注意事項
スクレイピングを行う場合は、そのページの規約で禁止されている場合があります。
特にログインする会員専用ページなどではスクレイピングが禁止されていることが多いです。
スクレイピングは相手のサーバーに大きな負荷をかけてしまうこともありますので、使用には十分注意してください。
Seleniumの準備
準備の流れ
Pythonが使える環境であることを想定して説明していきます。
Seleniumを使用したプログラム作成をする前に、いくつか事前準備があります。
- Seleniumをインストール
- WebDriverをダウンロード
まずはそれぞれの準備方法を見ていきましょう。
Seleniumをインストール
Seleniumは標準ライブラリではないため、pipコマンドでインストールする必要があります。
pip install selenium
本番環境または仮想環境でインストールしてください。
仮想環境の構築方法は以下記事をご参照ください。

【Python】仮想環境の構築と有効化の方法
WebDriverをダウンロード
Seleniumでブラウザを操作するには、そのブラウザに対応するWebDriverをダウンロードする必要があります。
プリンターを使うときに、そのプリンターのドライバをダウンロードするのと同じようなことです。
ブラウザにはEdgeやIE、Chrome、Firefoxなど数多くありますが、ここではGoogle ChromeのWebDriverをダウンロードする方法を記載します。
EdgeのWebDriverのダウンロード方法や操作については以下記事をご参照ください。

【Python】Selenium:Edgeを自動操作する方法
まず下記リンクからGoogle ChromeのWebドライバーダウンロードページへ移動します。
ChromeDriver - WebDriver for Chrome
「All versions available in Downloads」の「Latest stable release」から最新のChromeDriverをダウンロードします。

次に使用しているOSのWebDriverを選択して、ダウンロードを開始します。
私の場合はWindowsなのでWindows用ドライバをダウンロードします。

WebDriverはzipファイルでダウンロードされます。
解凍して得られたexeファイルは使いやすい場所に保存してください。
静的・動的ページから情報(HTMLテキスト)を取得する流れ
静的・動的ページから情報(HTMLテキスト)を取得する流れを以下に記します。
- ブラウザの起動
- Webサイトへアクセス
- HTML要素を取得
- 取得した要素に対して操作(クリック、入力、ログイン処理)
- 動的ページの場合、Ajax・javascriptを動かす
- HTMLテキストを取得
上記の流れで希望するWebページからHTMLテキストを取得します。
取得した後はBeautifulSoupを使用して、HTML分析(情報を抽出する)を行います。
BeautifulSoupの使い方は別記事で今度解説します。
では各プロセスのプログラミング方法を解説していきます。
seleniumの基本
seleniumのインポート
ダウンロードしたwebdriverが使えるように、プログラムの先頭でseleniumのwebdriverをインポートします。
from selenium import webdriver
ブラウザ起動
webdriver.Chrome()を呼び出すと、Chromeが起動します。
driver = webdriver.Chrome(executable_path=webdriver_path)
webdriver_pathには保存したWebdriverのパスを指定します。
webdriver.Chromeの戻り値はWebDriverオブジェクトであることがtype()よりわかります。
from selenium import webdriver
driver = webdriver.Chrome(executable_path='chromedriver.exe')
print(type(driver))
# class 'selenium.webdriver.chrome.webdriver.WebDriver'
webdriver.Chromeより取得したWebDriverオブジェクトにはブラウザ操作や、Webページの要素を検索するためのメソッドが用意されています。
Webページへのアクセス
WebDriverオブジェクトに対してget()メソッドを使用することで、引数に指定したURL先のWebページへアクセスします。
driver.get(url)
Webページ情報の取得
タイトルの取得
WebDriverオブジェクトに対してtitleを使用することで、Webページのタイトルを戻り値で返します。
title = driver.title
URLの取得
WebDriverオブジェクトに対してcurrent_urlを使用することで、WebページのURLを戻り値で返します。
url = driver.current_url
ソースコード(HTMLテキスト)の取得
WebDriverオブジェクトに対してpage_sourceを使用することで、Webページのソースコード(HTMLテキスト)を戻り値で返します。
source_code = driver.page_source
ログイン操作やAjaxなどを動かして、対象ページまで移動できたら最後にpage_sourceを使用してHTMLテキストを取得します。
ブラウザ機能の使用
ブラウザページ操作(更新・戻る・進む)
WebDriverオブジェクトに対してrefresh()メソッド、back()メソッド、forward()メソッドを使用することで、Webページの更新・戻る・進む(取り消し)ができます。
driver.refresh() # 更新
driver.back() # 戻る
driver.forward() # 進む(取り消し)
ページを閉じる
WebDriverオブジェクトに対してclose()メソッドを使用することで、開いているWebページを閉じることができます。
driver.close()
ブラウザを閉じる
WebDriverオブジェクトに対してquit()メソッドを使用することで、WebDriverオブジェクト(ブラウザ)を閉じます。
driver.quit()
ウィンドウの最大化
WebDriverオブジェクトに対してmaximize_window()メソッドを使用することで、ウィンドウを最大化できます。
driver.maximize_window()
スクリーンショットの保存
WebDriverオブジェクトに対してsave_screenshot ()メソッドを使用することで、ブラウザのスクリーンショットを保存できます。
driver.save_screenshot(path)
pathには保存先のパスを指定します。
HTML要素の検索
操作を行いたいWebページのHTML要素の検索方法について解説していきます。
Webページのボタンクリックや、ログインのためにIDやパスワードのテキスト入力などするためには、まず対象の要素を検索する必要があります。
WebページのHTMLを閲覧するには開発者ツール(デベロッパーツール)を使ってみてください。
Windowsの場合はキーボードのF12キーで開発者ツールを開くことができます。

find_element_by_*とfind_elements_by_*
WebDriverオブジェクトに対してfind_element_by_*メソッドまたはfind_elements_by_*メソッドを使用することで、条件にマッチする要素を、WebElementオブジェクトを返します。
find_element_by_*メソッドは、条件にマッチした最初の要素をWebElementオブジェクトとして返します。
find_elements_by_*メソッドは、条件にマッチした複数の要素をWebElementオブジェクトのリストとして返します。
要素を検索するメソッド一覧
ページの要素検索の条件にはメソッドによってCSSセレクタ、id属性、class属性、name属性などを指定できます。
以下一覧表ではfind_element_by_*のメソッドを記しています。(elementをelementsにすれば複数要素のリスト取得になります)
ここでは変数driverに格納されたWebDriverオブジェクトに対してのメソッド実行方法を示しています。
指定要素 | メソッド |
---|---|
CSSセレクタ | driver.find_element_by_css_selector(CSS selector) |
id属性 | driver.find_element_by_id(id) |
class属性 | driver.find_element_by_class_name(class name) |
name属性 | driver.find_element_by_name(name) |
タグ名 | driver.find_element_by_tag_name(tag) |
XPath | driver.find_element_by_xpath(XPath) |
各メソッドの引数は大文字・小文字を区別しますので注意してください。
またXPathによる要素の指定はとても便利な方法です。XPathが詳しくわからない方は以下記事をご参照ください。

XPathによる要素の指定方法:スクレイピング・RPAで利用しよう!
find_element_by_xpath()の使用方法については以下記事をご参照ください。

【Selenium】属性から要素を検索(指定):XPathの利用方法
HTML要素に対しての操作
HTML要素から検索して得られたWebElementオブジェクトには、クリックやテキスト入力、テキスト消去などができるメソッドが用意されています。
クリック
WebElementオブジェクトに対してclick()メソッドを使用することで、その要素をクリックできます。
element.click()
リンクのクリックや、ボタンのクリック、ラジオボタンの選択などマウスでクリックするのと同等の操作を行います。
ダブルクリックを要素に対して行うためにはAction Chainsという特殊な方法を用います。
Seleniumでダブルクリックを行う方法については以下記事をご参照ください。

【Python】Selenium:ダブルクリックを実行する(Action Chains)
テキスト入力
inputやtextareaなどの要素に対してテキスト入力するにはsend_keys()メソッドを使用します。
element.send_keys(text)
send_keys()メソッドの引数には、入力したいテキスト情報を指定します。
フォーム入力やログイン操作でsend_keys()メソッドは使用されます。
テキスト消去
inputやtextareaなどの要素からテキストを消去するにはclear()メソッドを使用します。
element.clear()
テキスト取得
inputやtextareaなどの要素から入力されているテキストを取得するにはtextを使用します。
element.text
特殊キーの送信
SeleniumではEnterやCtrl、Shiptキーなどの特殊キーを送信することができます。
特殊キーを使いこなすことでJavaScriptやAjaxが使用されているWebサイトからも問題なくスクレイピングできますし、ブラウザ操作もできるようになります。
特殊キーの使い方については以下記事をご参照ください。

【Python】Selenium:Ajax非同期通信を特殊キー送信で実行させる
サンプルプログラム
以下に本サイトOFFICE54にアクセスして、Pythonタブをクリックするプログラムを記します。
from selenium import webdriver
driver = webdriver.Chrome(executable_path='chromedriver.exe')
url = "https://office54.net"
driver.get(url)
selector = 'header ul.category-name li.category-python a'
element = driver.find_element_by_css_selector(selector)
element.click()
まとめ
本記事「Selenium:ブラウザ操作して静的・動的(Ajax、javascript)ページから情報を取得」はいかがでしたか。
RPAの開発やスクレイピングプログラムの開発に利用されるSeleniumの基本的な使い方を解説してきました。
Seleniumにはここでは解説できていない、有用な機能がまだまだあります。
今後少しずつ解説記事をアップしていきたいと思います。