LoginSignup
2
3

More than 5 years have passed since last update.

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

Posted at

いざ、実装

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

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

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
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3