四季報の文章を検索できたり、ネガポジ分析できたりしたら便利だなと思い、 おそらく四季報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」を与えてあげます。