SpookyJS

Spooky.jsでファイルのダウンロード - スクレイピング(実装編)

いざ、実装

下記のように実装しました。

// 助ネコ商品マスターダウンロード

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