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の導入方法を下記リンク先にまとめていますので参照してください。
おすすめ書籍
JavaScriptとNode.jsを使ったクローラー作成について学びたい方におすすめの書籍です。
全8章からなり、前半はクローラーとスクレイピング方法に関して解説されています。
後半は取得したデータの形態素解析、機械学習や手書き文字の認識、解析結果のグラフ描画など、どのように分析するのか解説されています。
一通りクローリングとスクレイピングを学びたい人におすすめの一冊です。
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す