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

/

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

本記事ではPythonSeleniumを使用して、ブラウザ操作から静的・動的(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はスクレイピングによるデータ収集の際によく使用されます。

IT用語の確認

スクレイピングとは、インターネット上の様々な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を使うのが一般的です。

注意事項

スクレイピングを行う場合は、そのページの規約で禁止されている場合があります。
特にログインする会員専用ページなどではスクレイピングが禁止されていることが多いです。

スクレイピングは相手のサーバーに大きな負荷をかけてしまうこともありますので、使用には十分注意してください。

Seleniumの準備

準備の流れ

Pythonが使える環境であることを想定して説明していきます。
Seleniumを使用したプログラム作成をする前に、いくつか事前準備があります。

  1. Seleniumをインストール
  2. WebDriverをダウンロード

まずはそれぞれの準備方法を見ていきましょう。

Seleniumをインストール

Seleniumは標準ライブラリではないため、pipコマンドでインストールする必要があります。

pip install selenium

本番環境または仮想環境でインストールしてください。
仮想環境の構築方法は以下記事をご参照ください。

WebDriverをダウンロード

Seleniumでブラウザを操作するには、そのブラウザに対応するWebDriverをダウンロードする必要があります。
プリンターを使うときに、そのプリンターのドライバをダウンロードするのと同じようなことです。

ブラウザにはEdgeやIE、Chrome、Firefoxなど数多くありますが、ここではGoogle ChromeのWebDriverをダウンロードする方法を記載します。

まず下記リンクからGoogle ChromeのWebドライバーダウンロードページへ移動します。

ChromeDriver - WebDriver for Chrome

「All versions available in Downloads」の「Latest stable release」から最新のChromeDriverをダウンロードします。

Selenium:chromeDriverのダウンロード

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

chrome用Seleniumのwebdriverダウンロード開始

WebDriverはzipファイルでダウンロードされます。
解凍して得られたexeファイルは使いやすい場所に保存してください。

静的・動的ページから情報(HTMLテキスト)を取得する流れ

静的・動的ページから情報(HTMLテキスト)を取得する流れを以下に記します。

  1. ブラウザの起動
  2. Webサイトへアクセス
  3. HTML要素を取得
  4. 取得した要素に対して操作(クリック、入力、ログイン処理)
  5. 動的ページの場合、Ajax・javascriptを動かす
  6. 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)

各メソッドの引数は大文字・小文字を区別しますので注意してください。

HTML要素に対しての操作

HTML要素から検索して得られたWebElementオブジェクトには、クリックやテキスト入力、テキスト消去などができるメソッドが用意されています。

クリック

WebElementオブジェクトに対してclick()メソッドを使用することで、その要素をクリックできます。

element.click()

リンクのクリックや、ボタンのクリック、ラジオボタンの選択などマウスでクリックするのと同等の操作を行います。

テキスト入力

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サイトからも問題なくスクレイピングできますし、ブラウザ操作もできるようになります。

特殊キーの使い方については以下記事をご参照ください。

サンプルプログラム

以下に本サイト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にはここでは解説できていない、有用な機能がまだまだあります。
今後少しずつ解説記事をアップしていきたいと思います。