我正在使用异步模块使用nightmarejs迭代多个网址。我无法创建一个新的梦魇实例,因为我每次都必须重新进行身份验证。
所以我正在尝试使用异步模块。我得到一个(我认为,经典)问题,所有迭代的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!');
});
感谢您的任何建议
答案 0 :(得分:4)
问题在于这一行:
async.each(urls, load, function (err) {
默认情况下,async
并行运行each
(see the documentation here,如果您有好奇心的话)。梦魇无法并行执行多个请求,因此,这样做会导致错误的结果,例如您所看到的。
解决方案很简单:切换到使用async.eachSeries
。这将保证您的请求将按顺序运行,允许Nightmare按设计工作。