CasperJSは、PhantomJSをより簡潔な記述により操作可能にしたユーティリティである。PhantomJS は、「ヘッドレスブラウザ」と呼ばれるグラフィカルな画面のないブラウザ「WebKit」で、JavaScript APIによりコマンドラインからブラウザの機能を使うことができ、フォームの操作やページの要素を取得することができます。よくCI ツールと組み合わせて自動テストを行ったり Web スクレイピングで使われたりします。Webkitは、SafariブラウザやChromeブラウザに使用されている。

ここでは、Raspberry Pi 3にcasperjsをインストールして、スクレイピングできる環境を構築します。

Raspberry Pi 3にcasperjsのインストール

次のコマンドでcasperjsをインストールし、casperjsをどこからでも実行できるようにリンクを張ります。

$ git clone git://github.com/n1k0/casperjs.git
$ cd casperjs
$ sudo ln -sf `pwd`/bin/casperjs /usr/local/bin/casperjs

次のコマンドでphantomjsをインストールし、実行可能とし、phantomjsをどこからでも実行できるようにリンクを張ります。

git clone https://github.com/piksel/phantomjs-raspberrypi.git
$ cd phantomjs-raspberrypi/bin
$ sudo chmod +x phantomjs
$ sudo ln -s /home/pi/casperjs/phantomjs-raspberrypi/bin/phantomjs /bin/phantomjs

次のコマンドで正常にインストールされたかを確認します。

$ phantomjs --version
1.9.8
$ casperjs
CasperJS version 1.1.1 at /root/casperjs, using phantomjs version 1.9.8
Usage: casperjs [options] script. [script argument [script argument ...]]
       casperjs [options] test [test path [test path ...]]
       casperjs [options] selftest
       casperjs [options] __selfcommandtest

Options:

--verbose   Prints log messages to the console
--log-level Sets logging level
--help      Prints this help
--version   Prints out CasperJS version
--engine=name Use the given engine. Current supported engine: phantomjs and slimerjs

Read the docs http://docs.casperjs.org/

casperjsでスクレイピングの実施

casperjsを使用して、実際に次のスクリプトでスクレイピングしてみます。

CasperHelloWorld.js

var casper = require('casper').create();
 
casper.start('https://tomosoft.jp/design/', function() {
    this.echo(this.getTitle());
});
 
casper.run();

casperjsでCasperHelloWorld.jsを実行すると次のように表示されます。

$ casperjs CasperHelloWorld.js
ネットワークソフトウェア開発|TomoSoft

取得したhtmlスクリプトを、ファイルに保存するには次のように行います。ファイルシステムを使用するときは、require(‘fs’)により、ファイル入出力用のオブジェクトを生成します。getHTML()でhtmlソースコードを読み込み、ファイル入出力用のオブジェクトでファイルをオープンして書き込みます。

var fs = require('fs');
var casper = require('casper').create();
 
casper.start('https://tomosoft.jp/design/', function() {
    this.echo(this.getTitle());
    var html = this.getHTML();
    var f = fs.open('jepx', 'w');
	f.write(html);
	f.close();
});
 
casper.run();