CasperJSとCoffee Scriptによるデータ収集
2ヶ月ぶりの投稿です。今日は私が最近ちょいちょい利用しているCasperJSによるWebクロールについて、まとめておこうと思います。環境はMacです。
簡単な概要
CasperJSを使うには、Node.jsとPhantomJSが必要です。簡単に紹介します。
Node.js
サーバー上で動くJavaScript処理系です。JavaScriptはブラウザ上で動かす方がメジャーですが、Node.jsはサーバーサイドのJavaScriptです。
PhantomJS
Webkit(ChromeやSafariが搭載)ベースのブラウザです。普通のブラウザと違ってGUIの画面無しです。それだけで静的なWebスクレイピングを行えます。が、Node.jsと協業すればリンクを辿ったり、フォーム入力した後の情報を取得するなどの動的クローラを作成できます。
CasperJS
PhantomJSのユーティリティです。指定サイトにアクセスしてリンクをクリックしたり、キャプチャーを撮るなどについて、PhantomJS+Node.jsでの処理を簡単に記述できます。
Coffee Script
JavaScriptを生成するスクリプト言語です。CasperJSは直接CoffeeScriptを解釈してくれます。JavaScriptよりも見た目も量もすっきりしたコードが書けます。
文法:
ちなみに、CasperJSはクローラー以外にも便利な利用方法はあります!例えば、One Clickでお買い物とか・・・w
CasperJSを使いコマンドラインからAmazon.co.jp で買い物するスクリプトでCoffeeScriptでコーヒーを買った
Macにインストール
これらをMacで環境構築するなら、nodebrewがおすすめです。
このサイトがわかりやすいです。ついでにCoffeeScriptもインストールしておきましょう♡
Qiita – node.jsのversionを管理するためにnodebrewを利用する
それから、PhantomJSとCasperJSをインストールします。
Qiita – CasperJSでWEBサイトの画面キャプチャを取得してみた
インストール後に、↑のサンプルを試してみるのをオススメします。
CentOS(6.5)にインストール
サーバーで動かしたい場合もあるので、一応インストール手順をメモ。>>参考
yum -y update yum install nodejs npm --enablerepo=epel npm install -g phantomjs npm install -g casperjs
CoffeeScriptのエディタを用意する
私は基本的に何でもEclipseで開発しているので、CoffeeScriptエディタもEclipse Pluginで調達しました。
使い勝手は、ぶっちゃけ今ひとつ・・・。そのうち、他のエディタも試してみようと思っています。
CoffeeScriptはインデントが構文解釈に影響します。そのためインデントがずれていたり、タブと空白が変に混ざっていたりすると正しく動作しないです。そこがCoffeeScriptのコードを書く上での要注意事項です。
実行する方法
こんな感じでOKです。
casperjs sample.coffee
もしCoffeeScript自体に文法エラーがあれば、
Unable to load script test.coffee; check file syntax
という感じのメッセージが出るのですが、エラーの場所までは教えてくれません。そこで、
coffee -c sample.coffee
で一度コンパイルすればエラー箇所を表示してくれるので、デバッグに役立ちます。
実践編その1
配列に入れたURLに順にアクセスして、それぞれキャプチャーを撮ってみます。
iPhone6のUser-Agent, viewportを指定してみました。captureを撮る前に、0.5秒のwait timeを挿入しました。読み込み時の一連の処理が終わってからキャプチャを撮るためです(入れないと、正しい画面が撮れないことがある)。
実践編その2
いくつかのリンクを辿って、目的の情報を入手するコードを書いてみました。ローソンの店舗情報から、1軒目のリンクを順に辿って、店舗名と住所をコンソール出力します。
casper.waitForSelectorは、指定セレクタの存在が確認できるまで処理を停止してくれます。もし、暫く待っても指定セレクタが確認できない場合は、処理が中断されます。待機する上限時間はcasper.timeout()で設定できます。
なおAPI Documentには、サンプルコードも載っており充実しています。