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よりも見た目も量もすっきりしたコードが書けます。

文法:

CoffeeScript 言語リファレンス

qiita – CoffeeScript入門メモ

 

ちなみに、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で調達しました。

Nodecript CoffeeScript Editor

使い勝手は、ぶっちゃけ今ひとつ・・・。そのうち、他のエディタも試してみようと思っています。

 

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には、サンプルコードも載っており充実しています。