PhantomJS + selenium を使ってみる

四季報の文章を検索できたり、ネガポジ分析できたりしたら便利だなと思い、 おそらく四季報CD-ROMや有料版四季報オンラインであれば可能なのでしょうが、 そのためだけにお金払うの嫌だし、 証券会社に口座を作ると無料で四季報を見られるのを利用して、 自分でWEBスクレイピングして四季報データベースをつくってしまおう、と。

その時の技術的メモです。環境:CentOS/Python3.5.2

とりあえず、証券会社にログインする処理を書かなくてはならないのですが、 PhantomJS(ヘッドレスブラウザ)を、seleniumで動作させてログイン処理をさせます。

最初は「urllib.request」のライブリを用いて、WEBページ取得を考えていたのですが、 javascriptの有効化が必要なサイトや、 セキュリティのためHTTPヘッダの中身を確認しているサイトでは弾かれてしまうそうです。(ボット対策ですね) cookieも保存してくれませんし。 seleniumを利用してヘッドレスブラウザで取得する方法が、使い勝手良いようです。

phantomjsをインストールします。

# yum install phantomjs

yumリポジトリにphantomjsがない場合、バイナリファイルをダウンロードして解凍してあげます。 ダウンロード元は以下のサイト。

ariya / phantomjs / Downloads — Bitbucket

# wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
# mkdir -p /opt/phantomjs
# bzip2 -d phantomjs-2.1.1-linux-x86_64.tar.bz2
# tar -xvf phantomjs-2.1.1-linux-x86_64.tar -C /opt/phantomjs --strip-components 1
# ln -s /opt/phantomjs/bin/phantomjs /usr/bin/phantomjs
#
# phantomjs /opt/phantomjs/examples/hello.js
Hello, world!

続いて、seleniumを追加します。

$ pip install selenium

SBI証券にログインする処理は以下。 user_idとuser_passwordにそれぞれ値を入れてあげます。

import os
from time import sleep
from selenium import webdriver

user_id = "XXXXXXXXXXX"
user_password = "XXXXXXXXXXX"

browser = webdriver.PhantomJS(service_log_path=os.path.devnull)
browser.implicitly_wait(10)
browser.get("https://www.sbisec.co.jp/ETGate/")
assert "SBI証券" in browser.title, "cannot find TOPPAGE"

element_user_id = browser.find_element_by_name("user_id")
element_user_id.send_keys(user_id)
element_user_password = browser.find_element_by_name("user_password")
element_user_password.send_keys(user_password)
browser.find_element_by_name("ACT_login").click()
sleep(5)
assert "最終ログイン" in browser.page_source, "cannot login"

デフォルトではghostdriver.logが作成され、それが邪魔くさく、インスタンス作成時に「service_log_path=os.path.devnull」を与えてあげます。