X

Node.js Spookyjsを使ったクローリング

Spookyjs

spookyjsとはヘッドレスブラウザを実現しているPhantomjsをNode.jsから使えるようにしたものです。詳細は以前のブログを参照してください。

Node.js WEBクローリング Spookyjsのメリットとデメリット

導入方法

SpookyjsはPhantomjsとCasperjsをインストールしておかないと使えないので下記npmコマンドでグローバルにインストールしておいてください。

npm install -g phantomjs casperjs

spookyjsは下記コマンドでインストールして下さい。

npm install --save spookyjs

サンプルコード

yahooのトップページを取得して検索を実行するコードです。下記はES6で記述しているためbabelでトランスパイルする必要があります。トランスパイルの方法はこちらを参考にしてください。

import Spooky from 'spooky';

const spooky = new Spooky({
    child: {
        transport: 'http'
    },
    casper: {
        logLevel: 'info',
        verbose: true
    }
}, function (err) {
    if (err) {
        let e = new Error('Failed to initialize SpookyJS');
        e.details = err;
        throw e;
    }

    // yahooのTOPページにアクセス
    spooky.start('https://www.yahoo.co.jp/');

    // thenのスコープ内ではconsole.log()が使えない
    // 外のスコープで定義した変数も使えないしコメントも挿入できない
    // getHTML()でアクセス先のHTMLを全て取得
    spooky.then(function() {
        this.capture('top.png');
        this.emit('consolelog', this.getHTML());
    });

    spooky.then(function() {
        this.fill('form', {p: 'nodejs'}, false);
        this.click('.srchbtn');
    })

    spooky.then(function() {
        this.capture('search.png');
    });

    // run()を実行するとクローリング開始
    spooky.run();
});

spooky.on('consolelog', function(data) {
    console.log(data)
});

spooky.start()メソッドで指定したURLのページを取得します。取得が完了したらthen()の中のコールバック関数が呼ばれます。capture()メソッドでその時点での画面のキャプチャを取得することができます。

フォームへの入力

spooky.fill()メソッドはフォームに入力することができます。yahooの検索フォームにnodejsと入力してclick()メソッドで検索ボタンを押しています。クリックした後のページをキャプチャしたのが下記になります。

注意点として、spooky.then()内はCasperjsのスコープになるためスコープ外の変数への参照ができません。また、スコープ内はPhantomjsのヘッドレスブラウザ側で実行されるのでconsole.log()でログを表示させようとしてもNode.js側のコンソールには何も表示されません。

ログを表示させたい場合はthis.emit()でスコープ内からイベントを送信し、Node.js側で受け取って表示させるしかないです。

あと、ハマリポイントとして、then()内では//を使ったコメントアウトも使用できません。自分はこれに気づくまでにかなりの時間を使ってしまったので気をつけてください。

今回のサンプルコードはES6で書いていますのでES5に書き直すか、ES6の導入方法を下記リンク先にまとめていますので参照してください。

Node.jsでES6を導入する最短手順

おすすめ書籍

JavaScriptとNode.jsを使ったクローラー作成について学びたい方におすすめの書籍です。

全8章からなり、前半はクローラーとスクレイピング方法に関して解説されています。

後半は取得したデータの形態素解析、機械学習や手書き文字の認識、解析結果のグラフ描画など、どのように分析するのか解説されています。

一通りクローリングとスクレイピングを学びたい人におすすめの一冊です。

 

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。
髙妻智一: 2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。