Web Browser Automation は人気を集めており、多くのフレームワークやツールが開発者に自動化サービスを提供するために生まれました。
Web Browser Automation は、開発環境や本番環境でのテスト目的で使用されることが多いですが、公開ソースからの Web スクレイピングデータ、分析、データ処理にもよく使用されます。
自動化ツールで作成された「ボット」は、しばしば法律やサイトの利用規約を侵害する可能性があるため、自動化で何を行うかはあなた次第ですが、あなたが行っていることが合法であることだけは確認してください。
Seleniumは、Webブラウザの自動化に広く使われているツールの1つで、ブラウザ上で多くの機能とパワーを提供します。
C#、Java、Perl、PHP、Rubyなど多くの言語をサポートしていますが、このチュートリアルでは、Windows上のPythonで使用することにします。
セレンとは?
Selenium は、開発者がわずか数行のコードでエンドユーザーをシミュレートすることを可能にする素晴らしいツールです。このツールを使えば、人間の行動を本当に再現することは難しいですが、ウェブページを使い、人間をシミュレートすることはとても簡単です。
人間を模倣する「ボット」に対抗するため、多くの高度なシステムが人間のような行動を認識するために使われていますが、プログラミングツールを使って再現することは不可能に近いのです。
Seleniumでアプリケーションを構築する場合、Webブラウザオートメーションに関連するすべての法律を遵守することを確認するか、単に自分の生産環境でのテスト目的のために使用します。
Seleniumで実現される最も一般的なタスクは次のとおりですが、これらに限定されません。
- ボタンをクリックする
- テキストを入力する
- テキストの抽出
- クッキーにアクセスする
- キーを押す
前提条件
始める前に、いくつかのセットアップを行う必要があります。
- 他のブラウザでもシミュレートできますが、この記事ではGoogle Chromeを使用します。
- chromedriver.exeを取得します。実際にブラウザをシミュレートするためには、コンピュータ上でこの実行ファイルへのパスが必要になるからです。
- コマンドラインで
pip install selenium
を使用して、selenium パッケージをインストールします。
基本的なこと
さて、これでSeleniumを使い始める準備が整いました。最初に必要なことは、ブラウザを起動することです。
from selenium import webdriver
EXE_PATH = r'path ochromedriver.exe'
driver = webdriver.Chrome(executable_path=EXE_PATH)
driver.get('https://google.com')
これを実行すると、Google Chromeが起動し、https://google.com
に移動します。
ここで重要なことは、Web ページへの接続は driver
オブジェクトの get(URL)
関数で行われるということです。
お気づきのように、driver
は Selenium WebDriver
オブジェクトであり、プログラム的にブラウザにアクセスする場合などに使用されます。
print(driver.page_source)
上記のコードは、ページ全体のソース HTML コードを表示します。データを収集する必要がある場合、これは非常に便利です。
エレメントの位置決め
通常、ページ全体の内容が必要なのではなく、特定の要素が必要な場合があります。
そのためには、Google ChromeのInspect Elementというツールを使って、まずページ上で目的の要素を検出する必要があります。
つまり、ページ内の特定の要素の内容が必要な場合、タグのIDを取得するには、以下のようにします(Google Chomeの通常セッションで)。
- 要素上で右クリック
- “Inspect “を選択します。
- 新しいウィンドウで、要素のHTMLを見ることができ、IDは
id=
の後にあります。
必要な要素を取得したら、その要素に対してさまざまな操作を行うことができます。
IDによる要素の取得
探している要素の正確なIDがわかれば、簡単に取得することができます。
element = driver.find_element_by_id('element_id')
名前で要素を取得する
先ほどの方法と同様です。
element = driver.find_element_by_name('element_name')
クラスによる要素の取得
そしてまた、先ほどの方法と同様に
element = driver.find_element_by_class_name('element_class_name')
HTMLタグによる要素の取得
ある特定のタグを指定して、すべての要素を取得したい場合があります。
links = driver.find_elements_by_tag_name('a')
この場合、 links
にはすべての a
タグが入力され、ページ内の各リンクが含まれるようになります。これはウェブクローリングに便利です。
XPathによる要素の取得
すべての要素が ID を持っているわけではありませんし、すべての a
HTML タグにアクセスしたいわけでもないでしょう。非常に特定の要素を取得する方法として、XPath のような方法もあります。XPathを使えば、より簡単に、より効率的に要素を見つけることができます。
tag_list = driver.find_elements_by_xpath("//tag[@attr='val']")
tag_listは、
attrの属性が
valに設定されている各
tag` を含むようになりました。
<tag attr="val"Foo</tag
これで tag_list
を繰り返し表示して、その中の Selenium WebElement
を操作できるようになりました。
Selenium の XPath システムについては、こちらを参照してください。
Selenium WebElement
Selenium の WebElement
は、実質的に HTML の要素を表します。これらの要素に対して、エンドユーザーと同じような操作を行うことができます。
これらの操作には以下のようなものがあります。
- 要素内のテキスト (
element.text
) のような、要素の単純なプロパティにアクセスする。 - WebElement
型の親要素にアクセスする (
element.parent`) - a
タグの
hrefのような、特定の属性へのアクセス (
element.get_attribute(‘href’)`) - その中を検索する (
driver
で検索するのと同じ方法です) - クリックする (
element.click()
) - 可能であればテキストを入力する (
element.send_keys('Input Text')
)
Selenium WebDriver
WebDriverは
WebElement` と似ていますが、主な違いはそのスコープです。後者のスコープは要素そのものであるのに対し、前者のスコープはページ全体です。
Selenium の WebDriver
オブジェクトを使用して多くのことを行うことができ、人間として通常のブラウザでできることはほとんど何でもできます。
他にとても便利なことがいくつかあります。
- JavaScriptを実行する。JavaScriptの実行:
driver.execute_script("script")
- スクリーンショットを保存する。スクリーンショットの保存:
driver.save_screenshot('image.png')
- ブラウザがページをレンダリングしないことで時間を節約する “ヘッドレスモード” で開始する。
from selenium.webdriver.chrome.options import Options
options = Options()
options.headless = True
driver = webdriver.Chrome(executable_path=EXE_PATH, chrome_options=options)
driver.set_window_size(1440, 900)
ウィンドウサイズが (1440, 900)
に設定されていることに注意してください。これは、ヘッドレスモードのために一部の要素が正しく読み込まれないという、あらゆる種類のバグを防ぐためです。
他の適度な大きさの解像度に変更することもできますが、ヘッドレスモードに移行する際には、解像度がデフォルトから変更されていることを確認する必要があります。
ページのナビゲーション
クッキーにアクセスする
ブラウザのCookieを追加したり削除したりする必要がある場合があります。
ck = {'some_attr': 'foo', 'some_other_attr': 'bar'}
driver.add_cookie(ck)
これはブラウザにクッキーを追加するもので、例えば認証やプリファレンスのクッキーを追加する必要がある場合に便利です。クッキーが dict
フォーマットであることを確認することが重要です。
また、ブラウザからクッキーを取得するのはとても簡単です。
cookies = driver.get_cookies()
for ck in cookies:
print(ck)
上のコードはブラウザにあるそれぞれのクッキーを表示します。
HTMLを変更する
時々、特定の要素のプロパティを変更する必要があることに気づくかもしれません。
前述したように、Selenium WebDriver
を使ってJavaScriptを実行することができ、要素のプロパティを変更することは、偶然にもJavaScriptで非常に簡単に行うことができます。
driver.execute_script("arguments[0].setAttribute('attr','value')", element)
ここで element
は変更する要素、 attr
は変更する属性、 value
は新しい値です。
ダウンロードリンクを使ってファイルをダウンロードする
Webサイトからファイルをダウンロードする必要がある場合があります。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_experimental_option("prefs", {
"download.default_directory": r"path odirectory",
"download.prompt_for_download": False,
"download.directory_upgrade": True,
"safebrowsing.enabled": True
})
driver = webdriver.Chrome(executable_path=EXE_PATH, chrome_options=options)
保存場所のパスは download.default_directory
を定義することで、pathtodirectory
のように指定することができる。
キーを押す
import time
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
action = ActionChains(driver)
for _ in range(3):
action.send_keys(Keys.ARROW_DOWN)
time.sleep(.1)
action.perform()
このコードは下矢印 (Keys.ARROW_DOWN
) を3回押します。各 action.send_keys(Keys.ARROW_DOWN)
の後、プログラムは少し待ちます。これはすべてのキーが登録されていることを確認するために推奨されています。
もし、単純にいくつかのコマンドを発行した場合、処理中に紛失してしまい、実際には登録されないかもしれません。
Keysにはキーボードのすべてのキーが含まれています。つまり、このメソッドを使用してページ上の要素間でタブ (
Keys.TAB) を使用することもでき、ページの操作が簡単になります (
Keys.RETURNと
Keys.SPACE` も同様に非常に重要です)。
ボタンをクリックする
例えば、タブやスペースを使ってチェックボックスに入力したり、矢印キーを使ってドロップダウンメニューの項目を移動することができます。
もちろん、チェックボックスやドロップダウンメニューを選択するには、ドライバを使って要素を取得し、それをクリックするのがより自然な方法でしょう。
checkbox = driver.find_element_by_id('checkbox')
checkbox.click()
フォームの入力
また、要素自体の中でキー押下をシミュレートすることも可能です。
element.send_keys(Keys.CONTROL, 'a')
element.send_keys(value)
この方法では、キーは element
の内部に登録されるので、textarea
に入力したい場合は、このようにすることができます。
ちなみに、このコードではキーボードショートカット(CTRL + A)を使って、要素の中のすべてのテキストを選択しています。次の行では、選択されたテキストを入力された value
で置き換えています。
キーボードショートカットを登録するには、 send_keys
のパラメータに目的のキーをすべて渡します。
スクロール
Instagramのフィードやその他の無限スクロールのページのように)スクロールダウンした後にのみページの一部が読み込まれることがあります。これは、簡単なJavaScriptスクリプトを実行することで簡単に実現することができます。
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
上記のコードでは、JavaScriptコマンドを使用してページの下部までスクロールします。これで再び driver.page_source
を使用して、新しいコンテンツを取得できます。
結論
SeleniumはWebブラウザの自動化に広く使われているツールの1つで、人間が操作するブラウザよりも多くの機能とパワーを提供します。
主に本番環境や統合環境のテスト/自動化に使用されますが、研究目的などでウェブスクレイパーとして使用することも可能です。公共コンテンツのWebスクレイピングを実践する際には、法律に抵触しないよう、必ず法律を遵守してください。