スクレイピングという言葉を聞いたことはあるでしょうか?プログラムを使って、Webサイトから様々な情報を取得することを言います。通常人間が閲覧するWebサイトを機械が閲覧して、情報を取得します。
また、Webシステムのテストで、何度も繰り返すUI操作を自動化させたい、というニーズもあります。
このスクレイピングやテスト自動化に使えるライブラリがSeleniumです。Webサイトを自動操作することに長けたライブラリで、JavaScriptが動的に内容を変えるようなWebサイトでもスクレイピングすることができます。
SeleniumはJavaやRubyなどにも対応していますが、Pythonにも対応しています。
今回は、そんなPython版Seleniumの使い方を紹介します。
Seleniumとは?
Seleniumは、元々Web自動操作のために開発されたライブラリです。
しかしその特性を活用し、スクレイピングにも使われています。
PythonでスクレイピングするライブラリというとBeautifulsoapがありますが、Beautifulsoapではロード時にDOMが全て決定されるWebサイトしかスクレイピングできません。ECサイトなどはBeautifulsoapで対応可能ですが、時に、刻々と内容が変わるWebサイトをスクレイピングしたいというときがあります。そんなときはSeleniumの出番です。
Seleniumのインストール
Seleniumのライブラリは
pip install selenium
でインストールします。
が、Seleniumはこれだけでは動作しません。
ブラウザごとに開発されている、Webドライバーという実行時にPythonプログラムと同時に実行されるソフトウェアが実行環境にインストールされている必要があります。
Chrome向けのChromeDriverはこちらから。
ダウンロードのリンク先に、Windows、Mac、Linuxそれぞれのバージョンがあります。
Firefox向けGekkoDriverはこちらから。
各OS向けがありますね。
ここで注意。Linuxでは、必ずPythonから実行可能なディレクトリにWebドライバーをインストールしてください。Pythonスクリプトと同じディレクトリにインストールしても、通常実行可能ではありません。
Seleniumスクリプトの書き方
まず、Seleniumからwebdriverをimportします。
from selenium import webdriver
そして、Seleniumが操作するブラウザを立ち上げて、Webサイトにアクセスします。
driver = webdriver.Firefox() driver.get("https://www.google.co.jp/")
それからスクリプトを記述します。
終わったら、
driver.quit()
でブラウザを閉じます。
Selenium入門
ここでは、簡単な例として、Googleにアクセスし、検索キーワード「Python」で検索させてみるスクリプトを書いてみます。
初めに、スクリプト全文を掲載しておきます。
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys driver = webdriver.Firefox() driver.get("https://www.google.co.jp/") wait = WebDriverWait(driver, 180) element = wait.until(expected_conditions.presence_of_element_located((By.XPATH, "/html/body/div/div[2]/form/div[2]/div[1]/div[1]/div/div[2]/input"))) element.send_keys("Python") webdriver.ActionChains(driver).send_keys(Keys.ENTER).perform() #driver.quit()
要素を取得する
まず大前提として、要素が出現するのを待たなければなりません。
wait = WebDriverWait(driver, 180)
と書くと、要素が出現するのを待つ最大秒数が決められます。通信環境、Webサイトの重さに応じて調整します。
wait.until
でDriverを待たせます。
expected_conditions.presence_of_element_located
で要素が出現するのを捕まえています。
ここでは、XPATHで捕まえています。
XPATHとは、そのWebサイト内での要素の絶対的な位置を示す書き方です。このDOM階層のところに要素があります。
Firefoxの場合、インスペクターを表示させHTMLソースから右クリックでコピーできます。
要素に値を渡す
element.send_keys("Python")
は、Pythonという文字列を要素に送っています。テキストフィールドなら当然入力されます。
その下の
webdriver.ActionChains(driver).send_keys(Keys.ENTER).perform()
はENTERキーを押しています。これはこういう書き方をします。
要素をクリックする
このスクリプトでは出てきませんが、要素をクリックするのは
element.click()
です。Googleの場合、検索履歴が表示されボタンがうまくクリックできないので、ENTERキーを押したのでした。
まとめ
この記事では、Seleniumの基本について見てきました。
最後に、Seleniumの開発で参考になるサイトを案内しておきます。
Seleniumで機能から関数名を引くサイトです。Seleniumでやりたいことが定まったらこのサイトで関数名を調べればいいでしょう。
Seleniumでは様々なサイトをスクレイピングできます。筆者もスクレイピング困難かと思われたサイトをいくつもスクレイピングしてきました。タイミングの調整やより良い要素の指定方法など、スクレイピングにはコツがありますが、それも開発していけば習得できます。あなたも、スクレイピングに踏み出してみてください。