2014年3月12日水曜日

[Python] Seleniumでブラウザ作業を効率化!

「エクセルの表を見ながら、ウェブサイト上の該当するチェックボックスをひたすらポチる」みたいな作業が最近あって、Seleniumを久々に使ったのでメモ。

Selenium は簡単に言うと、ブラウザでの作業を自動化するときに使うライブラリです。たぶん色んな言語用のものがあるのだけど、Python版しか使ったこと無いので今回はそれで。
作業自動化の方法とかは色々ありますが、これのいいところは、
  1. HTML Elementsを直接いじるので、直感的に分かりやすい
  2. ログインが必要なページとかでもセッションとか気にせず使える
  3. なんか勝手にブラウザが動いて楽しい
公式のDocumentが大変にわかりやすいのでまずはこれを見ましょう。

Selenium with Python
http://selenium-python.readthedocs.org/

インストール後は使い方も簡単で、よく使いそうなものをまとめました。

ブラウザの起動

webdriverに対して欲しいブラウザを呼んでやればOK。例えばFirefoxなら

browser = webdriver.Firefox()

Chromeも対応してます。

elementの取得

主に2種類。find_element_by系とfind_elements_by系です。
find_elements_by系だと該当するelementsを全て取得してくれるので、これで複数のelementsを一気に取得して、forで回して使う感じです。
例えば、'abc' っていうclassの要素を一挙取得する時はこんな感じ。

abc_elements = driver.find_elements_by_class('abc')

もっと細かく指定するときはfind_elements_by_xpathを使うとXPathが使えるので、例えば「'abc'っていうclassを持つformの中の一番最初のinput = "//form[@class='abc']/input[1]"」とか指定できます。
取得したelementに対してさらにfind_element_by_xpathをすると、相対パスを辿れるのも便利です。例えば一個前なら element.find_element_by_xpath('../') という感じ。

動作系

フォーム入力とか、クリックとか、ページ遷移とか。

element.send_keys('text') # formへの入力
element.click() # buttonのクリックや、チェックボックスのチェック(toggle
driver.get('http://www.google.com') # ページ遷移
driver.back() # ブラウザの「戻る」
driver.forward() # ブラウザの「次へ」

あとは、DOM要素の変化を待って何か次の動作を起こす Wait系 があります(割愛)。

実装自体は超簡単で、正直手間取るところはxpathの指定くらいです。
というか、自動化対象のサイト構造を把握する必要があるので、自分のサイトじゃない場合はそこが一番時間かかります。最初に挙げたDocumentには、xpathの取得におすすめのツールがいくつか紹介されてるのですが、あんまり試してないのでこれはまた試したら感想載せます。