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 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
によって処理を途中で止めることができます。
(もう少し理解がまとまったら、追記したい)
参考
- 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