はじめに
PhantomJS(CasperJS)を使って、サイトの情報をCSVにまとめて出力する簡単なJavaScriptを書いてみました。
ひとまずタイトル、ディスクリプション、キーワードとしましたが、スクリプトを少し変えるだけでその他要素も簡単に習得可能かと思います。
PhantomJSとは・・・コマンドで使えるヘッドレスブラウザ(Webブラウザで表示されるデータの取得・操作などができる)
CasperJSとは・・・PhantomJSをより簡単に使うモジュールをまとめたもの
スクリプト実行環境の用意
必要となる2つのパッケージをインストール
- PhantomJS: 例)
$ sudo npm install -g phantomjs@1.9.7-15
- CasperJS: 例)
$ sudo npm install -g casperjs
※PhantomJSの1.9.8がインストールされるとCasperJS実行時にエラーが出たため、1.9.7を指定しています
※この場合Node.jsはインストール済みとします
JSONファイルを用意し、取得したいページのURLを列挙していく
src.json
[
"http://www.yahoo.co.jp/",
"http://www.google.co.jp/",
"http://www.livedoor.com/"
]
実行するJavaScriptファイルを作成
※jQueryを使用しているため、並びにjQuery.jsファイルを配置しています
var fs = require('fs');
var json = require('./files/src.json'); // URLを配列形式で記載したJSONファイルを読み込む
/* データを格納する多次元配列を作成する */
/* 子配列には、title, descriptionなど各データを格納するための空スペース '' を4つ作成 */
/*
data[i][0] = url
data[i][1] = title
data[i][2] = meta description
data[i][3] = meta keyword
*/
var data = (function() {
var arr = [];
var i, j;
var l = json.length;
for (i = 0; i < l; i++) {
arr[i] = [];
for(j = 0; j < 4; j++) {
arr[i][j] = '';
}
}
return arr;
})();
/* casperの定義 */
/* jQueryを実行できるように(ファイルはこのJSの並びに配置) */
var casper = require('casper').create({clientScripts: ['./jquery.js']});
/**
* casperをループ実行
* @param {array} json: 各URLが設定された配列
* @param {object} self: Casperオブジェクト
* @param {string} link: 処理している現在のURL
*/
casper.start().each(json, function(self, link, i) {
self
/* 指定ページを開く */
.thenOpen(link, function () {
/* URLとタイトルの取得 */
var url = this.getCurrentUrl(); // この場合はlinkと同じ
var title = this.getTitle();
/* metaタグの取得 */
var metaDes = this.evaluate(function() {
return $('meta[name=description]').attr('content');
});
var metaKey = this.evaluate(function() {
return $('meta[name=keywords]').attr('content');
});
/* dataの子配列に取得したページ情報を追加 */
/* カンマ区切りが入ってきても大丈夫なように項目には "" を付けてエスケープ */
/* データが存在しない時(null)は "" は付けない */
data[i][0] = '"' + url + '"';
data[i][1] = (title !== null) ? '"' + title + '"' : '';
data[i][2] = (metaDes !== null) ? '"' + metaDes + '"' : '';
data[i][3] = (metaKey !== null) ? '"' + metaKey + '"' : '';
this.echo('Loading... ' + title);
})
/* 読み込んだらCSVに書き込む */
.then(function() {
/* ファイルはutf-8なのに注意 */
fs.write('./files/output.csv', data.join('\n'));
})
;
});
casper.run();
ファイル構成
以下のような構成になりました
root/─┬─jquery.js
├─output.js(実行するスクリプト)
│
└─files/─┬─src.json(読み込むURLソース)
└─output.csv (自動出力)
実行する
$ cd root/
$ casperjs output.js
~Fin~
おわりに
出力されたcsvはutf-8なので、場合によっては変換作業が必要となるかもしれません。
また取得したいURL群を動的に生成したり、jQueryで特定の記事を指定するなど色々と応用できるかと思います。