いざ、実装
下記のように実装しました。
// 助ネコ商品マスターダウンロード
try {
var Spooky = require('spooky');
} catch (e) {
var Spooky = require('../lib/spooky');
}
// 日付のフォーマットを楽にするモジュール
var dateformat = require('dateformat');
var now = new Date();
var date = dateformat(now, 'yyyymmdd_HHMMss');
// console.log(dateformat(now, 'yyyy年mm月dd日 HH時MM分ss秒'));
const spooky = new Spooky({
child: {
transport: 'http'
},
casper: {
logLevel: 'debug',
verbose: true,
waitTimeout: 100000,
viewportSize: {
width: 1280,
height: 1024
},
pageSettings: { // BASIC認証
userName: 'hoge',
password: 'hogehoge'
}
}
}, function(err) {
if(err) {
e = new Error('failed to init.');
e.details = err;
throw e;
}
spooky.start();
spooky.debug = false;
// UserAgent(PC)
spooky.userAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36');
// ページを表示
spooky.open('https://example.co.jp/');
// spookyと通常のnodejsとのメモリ空間は別々
// https://github.com/SpookyJS/SpookyJS/wiki/Introduction
// トップページ
spooky.then(function() {
this.mouse.move('a[href="item.cgi"]'); // 「商品マスター」メニュー上にマウスオーバー
});
// 商品マスターメニューをマウスオーバー
spooky.waitUntilVisible('a[href*="item_import_goods.cgi"]', function() {
this.click('a[href*="item_import_goods.cgi"]');
});
// 受注検索画面が表示されるまで待つ
spooky.waitFor(function() {
return this.getCurrentUrl() === 'https://example.co.jp/item_import_goods.cgi?';
});
// ここから、商品マスター画面
spooky.then([{
date: date
}, function() {
var path = "/output/";
// CSVダウンロード
var csvname = path + date + "_basic.csv";
this.download("https://example.co.jp/item_import_goods.cgi?GET_CSV=CSV%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89", csvname);
}]);
// run()内のfunctionは、spooky処理終了時にコールされる。exitを呼ばないとphantomプロセスが残ってしまう
// ちなみにspookyインスタンスのfunction内でコメントを入れると動作しない
spooky.run(function() {
this.emit('next', "now exit!");
this.exit();
});
spooky.on('next', function(msg) {
console.log(msg);
});
spooky.on('error', function(e, stack) {
console.error(e);
if (stack) {
console.log(stack);
}
});
});
this.mouse.move()で、マウスオーバーを再現できる。
今回ダウンロードしたいデータは、【csvダウンロード】ボタンを押すとダウンロードが始まるようなサイトだが、this.click()では、ダウンロードは始まらない。
this.download()の引数に、ファイルをダウンロードしたいURLとパラメーターを渡すことでファイルがダウンロードされる。
cronで定期的にダウンロードしたい
とある商品マスターcsvのバックアップのために作成したので、このバックアップを定期的に実行したい。
定期的に実行する=cronが思いつくのだが、下記のように書くだけだと動作しない。
* */1 * * * /usr/local/bin/node /home/hoge/backup.js
原因はcronの環境変数がザルのため、Phantom.JSの実行ファイルパスが見つけられないことが原因。
下記のサイトを参考に、crontab内にPATHを設定することで動作するようになった。
http://dqn.sakusakutto.jp/2014/04/crontab_path.html
PATH=/usr/local/bin:/usr/bin:/bin
* */1 * * * /usr/local/bin/node /home/hoge/backup.js