目的
リアルタイムに値の変わるデータがWEB上にありました。その値を定期的にチェックするプログラムを作ることになったわけですが、ページにログインする必要があったりと、スクレイピングのコードを書くのが面倒でした。その対策としてseleniumを使ってWebブラウザを操作し、スクレイピングをすることにしました。その過程を備忘録的にまとめていきます。
なお、手元のPCを使い、Webブラウザをバッチ処理で自動実行しても良かったのですが、、、普段使いの自身のPC上で、勝手にWebブラウザが立ち上げるのは邪魔だったので、レンタルサーバ上(Ubuntu16.04)で勝手に動かすようにします。
より具体的には以下のイメージになります。
(1)python経由でWebブラウザを立ち上げる → Part1(本投稿)で説明
(2)seleniumでWebブラウザを操作し、WEBデータを処理する → Part2で説明
(3)処理したデータをmongoDBに格納する → Part3で説明
(4)(1)〜(3)を実行するpyプログラムをcronで自動実行する → Part3で説明
(5)値に一定の変動があった場合メールで知らせる → おまけ編で説明
環境
OS : Ubuntu16.04 (さくらVPS)
python : python3.5
Step1) Webブラウザの選定
初期は、Google Chromeを作業をしていたが、いくつかの点でヘッドレスブラウザであるPhantomJSが良いことが分かったため、PhantomJSを使うようになりました。
PhantomJSを選定した理由は以下の点になります。
- Javascriptで取得しているデータもスクレイピングできる
- Chromeと違い、PhantomJSはGUIが無いので仮想ディスプレイが不要
※もし、何かしらの事情でChromeを利用したい場合は、こちらにChromeの話を書きましたので、ご参照ください。
Step2) PhantomJS 2.1.1のインストール
以下の手順でPhantomJSをインストールしました。
$ wget -O /tmp/phantomjs-2.1.1-linux-x86_64.tar.bz2 https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
$ cd /tmp
$ bzip2 -dc /tmp/phantomjs-2.1.1-linux-x86_64.tar.bz2 | tar xvf -
$ sudo mv /tmp/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/
$ phantomjs --version
> 2.1.1
最後の行のバージョン確認で、インストールした意図したバージョンが表示されれば完了です。
(参考URL) http://bit.ly/2bRGnYI
Step2) Seleniumをインストールする
Web上のデータを定点観測するためにSeleniumを利用する。
Seleniumとは、WEBアプリケーションのテストツールの1つです。人がブラウザを操作する代わりにSeleniumがブラウザを操作をしてくれます。
Seleniumはプログラムコードで操作をすることができますが、要するに、Seleniumを使えばプログラムでブラウザを自由に操作できるようになります。例としては、「loginという名前のbuttonをクリックする」「useridという名前のテキストボックスにメールアドレスを自動入力する」などの操作ができます。現在開いているページのHTML文を取得することもでき、それによってスクレイピングを行ったりします。
私はpython3でseleniumを操作しました。
pip3のインストールも含め、以下の手順でseleniumをインストールします。
sudo apt-get install python3-setuptools
sudo easy_install3 pip
pip3 install selenium
Step3) SeleniumとPhantomJSのテストプログラム
SeleniumとPhantomJSを使って、Googleのページを起動して、Googleのtitleタグの値を取得してみましょう。
import time
from selenium import webdriver
browser = webdriver.PhantomJS(executable_path='<path/to/phantomjs>')
browser.get("http://www.google.com")
time.sleep(3)
print(browser.title)
browser.close()
上記のコードは直感的に分かりやすく、seleniumが初めての方でも戸惑うことはほとんどないと思います。"Google"と出力されれば正常にプログラムが動いています。
1点だけ注意が必要なのは、4行目です。
webdriver.PhantomJS()でPhantomJSを呼ぶ時に、引数にphantomJSのパスを記述する必要があります。上記のコードにある通り、webdriver.PhantomJS(executable_path='...')という形でパスを指定してください。 パスが分からない場合は、
which phantomjs
で返ってきた値がパスなのでその場所を指定しましょう。
なお、5行目は browser.get(...)で指定したURLにGETリクエストを送っています。取得したレスポンスはbrowserの中に格納され、browser.titleでGoogleのtitleタグの値を出力することができます。
seleniumやPhantomJSの起動が確認できたところで、次は実際にスクレイピングをして特定のデータを抽出したいと思います。
続きは続編の(2)にて。