そんな今日この頃でして、、、

コード書いたり映画みたり。努力は苦手だから「楽しいこと」を探していきたい。

phantomjs-nodeでスクレイピングしてみる

藤井太洋氏の小説『アンダーグラウンド・マーケット』を読んで興味を持ち、仮想通貨ってやつをちょっとかじってみようということでBtcboxに登録してみた先週。

blue1st.hateblo.jp

「儲けたいぜー」というよりは「ちょっと遊んでみよう」というスタンスではあるけれど、それでも手持ちのコインが値上がりすると少しワクワクしますな。

BTCボックス|ビットコイン取引所

ヘルプによるとAPIが用意されているらしく、確かにサンプルの通りに叩くとそれらしい値が返ってくるが、どうもBitcoinだけが対象でより単価の低いLitecoinやDogdecoinについては見当たらない。

サイトを確認するかぎりスクレイピング自体を禁止する規約は無さそうだった(拾った情報を使ったウェブアプリとかになると流石にNGぽい)ので、各コインの現在の状況を取得できるスクリプトを書いてみた。


使うもの

以前はCasperJSを使用していたものの、あれらはNodeとは独立して動く仕組みなため、取得してきたデータを活用するには「外部コマンドの形で呼んで戻り値として・・・」とか「ファイルを定期的に吐かせて・・・」とか何かしらの歪曲的な手段が必要になる。

blue1st.hateblo.jp


そんなわけで今回はNodeからPhantomJS使えるようにするブリッジphantomjs-nodeを使用してみた。

github.com


また、Hubotのスクリプトを書いていてフィーリングが悪くなかったCoffeescriptを使用してみた。


導入

PhantomJS自体とCoffeescriptをインストールした上でnpm install phantom cheerioで今回使用するphantomjs-nodeおよびcheerioをインストール


記述

githubのReadmeを参考にCoffeescriptで記述する。

btcboxの各種値をスクレイピングするスクリプト。


引数として指定されたコインの種類のURLをpage.openで開き、取得してきたhtmlタグをcheerioに食わせてスクレイピングする。

phantomJSの説明は割愛。(一番上で挙げたエントリの方に書いた)

cheerioはjQueryを再実装したもの(らしい)で、つまり使い慣れたセレクタでhtmlの要素を取得したりできる。

よってChromeディベロッパーツールなんかで欲しい部分のタグを調べてそれを記述してやればよいのだ。


使用法

例えばLitecoinについて取得したければ・・・

$ coffee btcbox.coffee ltc
opened btcbox-ltc? success
価格 ¥169
高値 ¥172
安値 ¥169
売気配値 ¥169
買気配値 ¥168
出来高 668.244

てな具合。


Coffeescriptなんで当然のごとくコンパイルしてJavascriptにもできる。

$ coffee -c btcbox.coffee
$ node btcbox.js doge
opened btcbox-doge? success
価格 ¥0.0144
高値 ¥0.0145
安値 ¥0.0144
売気配値 ¥0.0144
買気配値 ¥0.0125
出来高 17756

今回のスクリプトだけだと特に何をするでもないけど、例えばこれをcronで動かしてストレージに貯めて長期的な値動きをみるとか自動取引に使うとか、何かしらのメッセージにより自分への通知として流すだとか、Nodeなんでそれなりに使いようはあると思う。


Coffeescript最初は目が慣れずに戸惑ったけど、書いていってみればなかなか合理的な文法で面白いですな。

Javascriptのコールバック無間地獄がかなり見易く書き易くなる。

コンパイルされたJavasciptも人間が読める記述になっているのは好印象。

AltJSはそんなに気乗りしなくてやるとしてもDartかなーと思ってたけど、これはちょっと始めてみても良いかなって気がしてきた。

つくって覚えるCoffeeScript入門

つくって覚えるCoffeeScript入門


追記

と、ここまでやってきて、Githubに同じくbtcbox関連のプロジェクトを見つけて読んでみたら、何か普通にltcとかdogeとかも扱えそうな雰囲気。

もしやと思ってAPIの後ろにcoinパラメータ追加してみたら取れた!

https://www.btcbox.co.jp/api/v1/ticker/?coin=btc

https://www.btcbox.co.jp/api/v1/ticker/?coin=ltc

https://www.btcbox.co.jp/api/v1/ticker/?coin=doge

そういうのあるなら書いといてよー・・・

ヘルプ


まあそれはそれとして、Node&Coffeescriptでphantomjsを扱えたので、例えばHubot越しにページのスクリーンショットを取得するとか、もっと複雑なことをさせるとかできるわけだ。

応用は効きそうである。