仕事をするにも、Webから情報を集めてきたり、特定のサイトの更新情報を見つけに行ったり、データが置いてあるページから数値などをコピペしたりする作業は実はマクロ化して、自動的にPCに行わせたほうが効率的でしょう。
これは以前にも記事に書いた「RPA」という手法で、こうした思考を持っている人が、仕事をどんどん数多くこなせるようになれるわけです。
RPAのもたらす未来
そして、それを実現させる方法は、ブラウザの機能拡張や、Selenium、アプリケーション開発・・・など、色々なやり方が存在しますが、以下のポイントを考慮して、今回はMacでDockerを使って、NodejsのSpookyjsライブラリで構築して、実運用できるようにしてみたいと思います。
【要件定義】
・手元のノートPC(mac)で手軽に使いたい。
・初期構築に大規模な開発を行いたくない。
・WEBページと親和性の強いJavascriptを内部で扱えるようにしたい。
・仕事でも、自宅でも使いたいので、手元のノートPCじゃなくても環境を移行できるようにしたい。
環境想定
以前にSpookyjsの構築記事を書いたのですが、時間が立っているのと、Dockerベースで環境構築を行いたかったので、改めて手順を残したいと思います。
サーバーサイドで画面キャプチャ #その4 SpookyJS
ノートPC
MacOSX 10.12.4 Sierra
これは、会社でも自宅でも使っているのと、windowsでは色々な制限が入ってしまうので、とりあえずこの条件にしますが、
下記のDocker環境が別OSで構築出来る場合は、Macでなくても、同一環境が可能です。
Docker
別環境にOSごとコンテナとしてコピーできてしまうお手軽さがあり、VertualBoxよりも軽い事と、Linuxサーバーと親和性が高い事で、
あえてDocker構築にします。
特にDockerである必要はないので、VirtualBoxやVMWware、直接のLinuxOSでも問題ないと思います。
ただ、今回はUbuntuベースで作っていくので、CentOS系の場合は、若干手順が違う箇所があるので、その点は自己責任で行ってください。
OS内部構造
・Ubuntu 16.04.1
・Nodejs v4.2.6
・Phantomjs 2.1.1
・Casperjs 1.1.4
・Spookyjs 1.8
これらのバージョンは今現在のインストール環境にあるものを抜き出しただけなのですが、個人的にバージョン依存させたくないので、どれも最新バージョンで構築してもいいようにしたいと思いますが、書くライブラリの仕様が大きく変わった場合はご了承ください。
環境構築手順
MacにDockerをインストール
Dockerのインストールも以前に記事書いてあるので、そちらを参照してください。
Mac版Dockerを使って開発環境の構築
Nodejsインストール
通常のインストールは下記で問題ないです。
$ apt-get install -y nodejs npm
# 確認
$ node -v
v4.2.6
$ npm -v
3.5.2
最新版のインストールまたは、特定バージョンのインストールにこだわりたい場合は、nvmを使ってインストールしましょう。
# nvmライブラリをgithubから取得
$ git clone git://github.com/creationix/nvm.git ~/.nvm
# nvm実行
$ source ~/.nvm/nvm.sh
# インストールできるバージョン確認
$ nvm ls-remote
# 最新バージョンをインストールする事をオススメ。(別のバージョンでも可)
$ nvm install v7.10.0
# 確認
$ node -v
v7.10.0
$ npm -v
4.2.0
$ nvm --version
0.33.2
ただし、Dockerを使っている場合、コンテナを再起動するたびに、「source ~/.nvm/nvm.sh」コマンドを実行しないといけないので、通常のaptインストールをオススメします。
そして、npmはnodejsのバージョンに合わせて対象のバージョンがインストールされるようです。
phantomjsとcasperjsのインストール
これらのインストールは下記の3パターン存在するようです。
1. apt-getでインストール
2. npmでインストール
3. ソースコードを取得してインストール
これも1番、2番は、トラブったこともあるので、3番をオススメします。
1. apt-getでインストール
# phantomjs
$ apt-get install phantomjs
# casperjs
$ apt-get install casperjs
2. npmでインストール
# phantomjs
$ npm install -g phantomjs
# casperjs
$ npm install -g casperjs
3. ソースコードを取得してインストール
$ cd /usr/local/share
# phantomjs
$ wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
$ tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
$ mv phantomjs-2.1.1-linux-x86_64 phantomjs
$ ln -sfn /usr/local/share/phantomjs/bin/phantomjs /usr/local/bin/
# casperjs
$ git clone https://github.com/casperjs/casperjs.git
$ ln -s /usr/local/share/casperjs/bin/casperjs /usr/local/bin/
# 確認
$ phantomjs --version
2.1.1
$ casperjs --version
1.1.4
関連リンク
phantomjs
casperjs
Spookyjsのインストール
そして、今回の主役であるSpookyjsのインストールはnpmで行います。
グローバル環境にインストールしてもいいですが、今回は、ローカル環境にインストールしてみます。
$ npm install spookyjs
ここで問題発生!!
以前作ったプログラムが、今回の環境で動きません。
いろいろ調べてみたところ、Spookyjsのモジュールがおかしいようです。
解決
そして更にわかったのは、npmインストールした時に、nom_modulesフォルダに、「spooky」以外のフォルダが作られていることに気が付きました。
node_modules/spooky
node_modules/***
これは、モジュールが利用するパッケージを同時にインストールしているらしいのですが、以前は、こうした階層構造ではなく、
node_modules/spooky/nodemodules/***
という階層に入っていました。
spooky以外のフォルダを「node_modules/spooky/nodemodules/」この下に移動させてみたらちゃんと動作出来ました。
これは、npmのバージョンの問題なのか?
何かしらの仕様が変わったのか、今のところは深掘りせずに、そのうち手が空いた時に調べてみたいと思います。
Docker環境でよかった・・・本番だったらトラブってたところだ。
関連リンク
spookyjs
起動テスト
インストール作業が完了したら、モジュールの起動テストです。
下記ソースコードを設置して、実行してみましょう。
ソースコード
※このコードはspookyjsのgithubページにサンプルで置いてあるものです。
try {
var Spooky = require('spooky');
} catch (e) {
var Spooky = require('../lib/spooky');
}
var spooky = new Spooky({
child: {
transport: 'http'
},
casper: {
logLevel: 'debug',
verbose: true
}
}, function (err) {
if (err) {
e = new Error('Failed to initialize SpookyJS');
e.details = err;
throw e;
}
spooky.start(
'http://en.wikipedia.org/wiki/Spooky_the_Tuff_Little_Ghost');
spooky.then(function () {
this.emit('hello', 'Hello, from ' + this.evaluate(function () {
return document.title;
}));
});
spooky.run();
});
spooky.on('error', function (e, stack) {
console.error(e);
if (stack) {
console.log(stack);
}
});
/*
// Uncomment this block to see all of the things Casper has to say.
// There are a lot.
// He has opinions.
spooky.on('console', function (line) {
console.log(line);
});
*/
spooky.on('hello', function (greeting) {
console.log(greeting);
});
spooky.on('log', function (log) {
if (log.space === 'remote') {
console.log(log.message.replace(/ \- .*/, ''));
}
});
実行
$ node spooky.js
Hello, from Spooky the Tuff Little Ghost - Wikipedia
メッセージが表示されたら、成功ですね。
とりあえず、今回は環境構築ですが、次回は、クローリングの基礎コードを書いてみたいと思います。
関連リンク
クローリングシステム構築
$ yum -y install fontconfig-devel
を実行するといい感じ。$ npm install spooky