3

我正在使用 async 模块使用 nightmarejs 迭代多个 url。我无法创建新的噩梦实例,因为我每次都必须重新进行身份验证。

所以我正在尝试使用异步模块。我遇到了一个(我认为是经典的)问题,所有迭代的 url 都是数组中的最终 url——而不是每个单独的 url。我认为使用异步模块可以解决这个问题(我也尝试过使用 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 回答