7

nightmare.js を使用して Web サイトをスクレイピングする単純なノード スクリプトを作成しました

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

vo(run)(function(err, result) {
    if (err) throw err;
});

function *run() {
    var x = Date.now();
    var nightmare = Nightmare();
    var html = yield nightmare
    .goto('http://google.com')
    .evaluate(function() {
        return document.getElementsByTagName('html')[0].innerHTML;
    });

    console.log("done in " + (Date.now()-x) + "ms");
    console.log("result", html);

    yield nightmare.end();
}

ES6 機能をサポートしていない古いバージョンのノードを使用する環境でこれを実行したいと考えています。「yield」キーワードなしでこれを行う方法に関する github ページの例はありません。

ここで ES6 構文を使用しない使用例を見つけました: Webscraping with nightmare

私はこのように書きました:

var night = new Nightmare()
.goto('http://www.google.com')
.evaluate(function () {
  return document.getElementsByTagName('html')[0].innerHTML;
},function (html) {
   console.log("result", html);
  }
)
.run(function (err, nightmare) {
  if (err) return console.log(err);
  console.log('Done!');
});

クラッシュはしませんが、結果のログ機能は呼び出されません。

yield 構文を使用すると、「評価」からの戻り値を取得するのは非常に簡単ですが、それがないと、それを行う方法が見つかりませんでした。

更新 受け入れられた回答とそのコメントのおかげでこれを書きました。「Q」を使用し、0.12 より前のノード バージョンで動作します。

var Nightmare = require('nightmare');

var Promise = require('q').Promise;

var x = Date.now();
var nightmare = Nightmare();
Promise.resolve(nightmare
  .goto('http://google.com')
  .evaluate(function() {
      return document.getElementsByTagName('html')[0].innerHTML;
})).then(function(html) {
    console.log("done in " + (Date.now()-x) + "ms");
    console.log("result", html);
    return nightmare.end();
}).then(function(result) {

}, function(err) {
   console.error(err); // notice that `throw`ing in here doesn't work
});
4

1 に答える 1