Seleniumとは本来は微量元素、セレンのことですが、ここではブラウザをスクリプトから操作するツール群のことです。公式ページはこちら[3]。
これを使うとWebアプリのテストなどの自動化が可能です。
それ以外にも、例えばログインなどの面倒なサイトへ自動ログインして自動で情報の取得、更新ができる自分用のツールを作ったりもできます。
もちろん、コマンドラインだけでログインなども可能なのですが、Javascriptなどで情報のやりとりを行っているサイトも多く、意外にうまくいかないこともあります。かといってディベロッパーツールなどでネットアクセスを解析するのも面倒です。そんなときにはブラウザでアクセスできるSeleniumが便利です。
対応言語はJava、C#、Ruby、Python、Javascripと幅広く、対応ブラウザもChrome、FireFox[4]など主なところはだいたい対応していると思ってよいでしょう。
個人的にはログインの面倒なサイトなどの自動化でPythonとChromeの組み合わせで使っており、ここでもその二つを中心に解説します。
SeleniumをPythonで動かすには二つのステップが必要です。
他にSeleniumサーバというのもありますが、個人でちょっとしたことに使う分には必要ありません。
pipに対応しているので、コマンドラインから簡単にインストールできます。
sudo pip install selenium
もし「-H」オプションが必要と言われたらつけてください。
sudo -H pip install selenium
ブラウザのドライバーはサードパーティーなどによって各ブラウザごとに開発されています。こちら[11]のページからダウンロード可能です。 ここではChromeのものをダウンロードしてきます。
解凍したドライバはパスの通った場所に置く必要があります。 または、メンテナンスなどを考えるとリンクの方が楽かも知れません。
ln -s /yourlocationdir/chromedriver /usr/local/bin/chromedriver
これで準備は完了です。
まずインポートします。
from selenium import webdriver
次にドライバーのオブジェクトを取得します。
driver = webdriver.Chrome()
この段階で、新しいプロセスでブラウザが立ち上がり、空の画面が表示されます。
移動は
driver.get("http://njf.jp")
でそのページに移動します。
そのページに表示されている要素の取得も可能で「find_element_by〜」というメソッドで行います。 特によく使うのは、
find_element_by_name find_element_by_id find_element_by_xpath
あたりです。それぞれname、id、XPathをもと要素に取得します。XPathとはその文書の要素のパスです。Chromeだとディベロッパーツールの中のエレメントタブから好きなエレメントを右クリックし、「copy」を選ぶとXPathをコピーできます。どの要素でも一意に指定できるので、nameやidで区別できない要素を取得するのに便利です。
また取得した要素にはsend_keysというメソッドがあり、これによってフォームに値を入力できます。
driver.find_element_by_name("email").send_keys("mymail@mymail.jp") driver.find_element_by_name("password").send_keys("mypassword")
日本語を入力するときはUTF-8を使いましょう。
driver.find_element_by_name("comment").send_keys(u"テストです")
ボタンのクリックも可能です。
driver.find_element_by_id("form_button").click()
Seleniumはスクレイパーとしての機能はさほど優れてはいないため、情報の取得を行うときは、別途Beautiful Soupなどを使うのがおすすめです。 表示中のhtmlソースはpage_sourceで取得できます。
html = driver.page_source bf = BeautifulSoup(html,"html.parser")
画面を閉じるのはcloseメソッドです。
driver.close()
注意としては、普段使っているブラウザでもクッキーなどは共有されないようで、ログイン処理などは毎回しなければなりません。
また、起動のたびにプロセスが立ち上がるので、開発中は自分で閉じるのを忘れるとメモリを圧迫するので注意が必要です。
プロセスが終わるとブラウザも落ちてしまうことがあります。その時は以下のような処理を最後に入れて、「q」とコマンドラインで入力するまでプログラムを終了させないようにするとよいでしょう。
print "Type 'q' to end" while True: inputline = raw_input() if inputline == "q": break
(This host) = https://njf.jp