• SIS Lab
  • >
  • Blog
  • >
  • Nightmare.jsでAmazonアフィリエイトのレポートを取得する

Nightmare.jsでAmazonアフィリエイトのレポートを取得する

更新日:2020.02.01 作成日:2016.02.01

次の本 を読み進めることで、RubyのライブラリであるCapybara, Poltergeistを利用してスクレイピングを行うことができました。PoltergeistPhantomJSというHeadless Browserを操作するためのCapybara用Driverです。

PhantomJSJavaScriptライブラリということで、JavaScriptからPhantomJSを操作するにはどのような方法があるのか調べてみました。これを機会にJavaScriptを書けるようになりたい。

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例
Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例
出版社:SBクリエイティブ
著者:佐々木 拓郎るびきち
発売日: 2014/08/22

Nightmareとは

Nightmare.jsは、ブラウザの挙動を自動化できるJavaScriptライブラリです。以前は、PhantomJSのラッパーでしたが、現在は内部的にElectronを利用するようになりました。

segmentio/nightmare: A high-level browser automation library.

npm install nightmare

Amazonアフィリエイトの前日のレポートを取得する

まずは、完成品をどうぞ。

var Nightmare = require('nightmare');
var vo = require('vo');

vo(function* () {
  var nightmare = Nightmare({ show: false });
  var link = yield nightmare
	  .goto('https://affiliate.amazon.co.jp/')
		.type('input#username', 'USERID')
		.type('input#password', 'PASSWORD')
		.click('#signin > input[type="image"]')
		.wait('#mini-report')
		.evaluate(function () {
			return document.querySelector('#mini-report > div.line-item-total > div.data').textContent;
		});
	yield nightmare.end();
  return link;
})(function (err, result) {
  if (err) return console.log(err);
  console.log(result);
});

サンプルコードを動かす

npm install nightmare vo
node --harmony yahoo.js

JavaScript初心者の自分は、まず下記のサンプルコードが動かせず、何が原因かわかりませんでした。

JavaScriptの背景と現状を追ってみると、次のことがわかりました。

  • function*, yieldなどのコードを含むのは、ES2015(ES6)のバージョンの書き方である
  • Node.jsのバージョンが古いとES2015(ES6)で書かれたコードを動かせないこと

Node.jsのバージョンをv5.5.0に上げて、再実行したところ、Electronが立ち上がり、yahoo.comを検索するのを確認できます。

var Nightmare = require('nightmare');
var vo = require('vo');

vo(function* () {
  var nightmare = Nightmare({ show: true });
  var link = yield nightmare
    .goto('http://yahoo.com')
    .type('input[title="Search"]', 'github nightmare')
    .click('.searchsubmit')
    .wait('.ac-21th')
    .evaluate(function () {
      return document.getElementsByClassName('ac-21th')[0].href;
    });
  yield nightmare.end();
  return link;
})(function (err, result) {
  if (err) return console.log(err);
  console.log(result);
});

Genaratar function*とは何か

ここ数日の自分の理解だと、「非同期処理を同期的に記述する」ための記述方法であるという理解です。yieldによって処理を途中で止めることができます。 (もう少し理解がまとまったら、追記したい)

参考

参考図書

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例
Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例
出版社:SBクリエイティブ
著者:佐々木 拓郎るびきち
発売日: 2014/08/22

Effective JavaScript
Effective JavaScript
出版社:翔泳社
著者:David Herman吉川 邦夫吉川 邦夫
発売日: 2013/02/19

Related contents