3

async モジュールを使用して、nightmarejs で複数の URL を反復処理しています。毎回再認証する必要があるため、新しいナイトメア インスタンスを作成できません。

だから私は非同期モジュールを使用しようとしています。個々の URL ではなく、すべての反復の URL が配列内の最終的な URL であるという (古典的な) 問題が発生しています。asyncモジュールを使用するとこれが修正されると思いました(letも使用してみました)が、まだ問題が発生しています

'use strict'

var Nightmare = require("nightmare");
var async = require("async");

//Creates the authenticated nightmare instance

var scraper = new Nightmare()
  .goto('https://www.example.com/signin')
  .type('#login', 'username')
  .type('#password', 'password')
  .click('#btn')
  .run(function(err, nightmare) {
    if (err) {
      console.log(err);
    }
    console.log('Done.');
  });

//Trying to use async module to iterate through urls

function load(url, callback){
  scraper
  .goto(url)
  .wait(2000)
  .screenshot('pic'+url[25]+'.png')
  .run(function(err, nightmare) {
    if (err) {
      console.log(err);
    }
    console.log('Done with ', url[25]);
    callback()
  }); 
}

var urls = [
  'https://www.example.com/p1',
  'https://www.example.com/p2',
  'https://www.example.com/p3',
]

async.each(urls, load, function (err) {
  console.log('done!');
});

アドバイスをありがとう

4

1 に答える 1

4

問題は次の行にありました。

async.each(urls, load, function (err) {

デフォルトでは、並行して実行されます (async興味がある場合は、こちらのドキュメントを参照してください)。Nightmare は複数のリクエストを並行して実行することができないため、実行すると、表示されているような誤った結果が生じます。each

解決策は簡単です: を使用するように切り替えasync.eachSeriesます。これにより、リクエストが連続して実行されることが保証され、Nightmare が設計どおりに動作できるようになります。

于 2016-01-31T21:48:06.933 に答える