Nightmare.jsでAmazonアフィリエイトのレポートを取得する
次の本
を読み進めることで、RubyのライブラリであるCapybara, Poltergeistを利用してスクレイピングを行うことができました。PoltergeistはPhantomJSというHeadless Browserを操作するためのCapybara用Driverです。
PhantomJSはJavaScriptライブラリということで、JavaScriptからPhantomJSを操作するにはどのような方法があるのか調べてみました。これを機会にJavaScriptを書けるようになりたい。
Nightmareとは
Nightmare.jsは、ブラウザの挙動を自動化できるJavaScriptライブラリです。以前は、PhantomJSのラッパーでしたが、現在は内部的にElectronを利用するようになりました。
segmentio/nightmare: A high-level browser automation library.
npm install nightmareAmazonアフィリエイトの前日のレポートを取得する
まずは、完成品をどうぞ。
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.jsJavaScript初心者の自分は、まず下記のサンプルコードが動かせず、何が原因かわかりませんでした。
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によって処理を途中で止めることができます。
(もう少し理解がまとまったら、追記したい)
参考
- Nightmareがv2(Electronベース)になり、使いやすく感動したのでLIGブログのPV/UUデータ取得を自動化してみた。 - Qiita
- ChatOps + NightmareでメトリクスグラフとBIレポートをSlackに投げるようにした - Glide Note - グライドノート
- Nightmare.jsでQiitaのコントリビューション数をスクレイピング - Qiita
- Web scraping with Nightmare.js | azurelogic.com (PhantomJSの時の例)
参考図書
Related contents

TECH
2016.09.03

TECH
2016.08.28
TECH
2016.08.27

TECH
2016.08.24

TECH
2016.05.11

TECH
2016.02.20

TECH
2016.02.07

TECH
2016.02.07


