gpt4 book ai didi

node.js - 将 Nightmare 包裹在 promise 中/一次处理一个网址

转载 作者:太空宇宙 更新时间:2023-11-03 22:53:02 27 4
gpt4 key购买 nike

我正在尝试使用nightmarejs从一些网站上抓取信息。我遇到的问题是,我只想一次打开一个窗口并等待它关闭,然后再处理下一个网址。

// index.js

var urls = // an array of urls.

var l = 10; // urls.length;
while (l--) {
// g.findById(id).then()....
// y.findById(id).then()....

UrlProcessing.findById(id).then(function(results) {
console.log(results);
});
}

现在是 findByid:

//UrlProcessing.js

class UrlProcessing {


findById(id) {
var address = id;

return new Promise(function (resolve, reject) {
vo(function*(address) {
var nightmare = new Nightmare({show: true});
var link = yield nightmare
.goto(address)
.wait(2000)
.evaluate(function() {
return document.getElementsByTagName('html')[0].innerHTML;
});
yield nightmare.end();
return yield link;

})(address, function(err, res) {
if(err) reject(err);

resolve(res);
});
});
}
module.exports = UrlProcessing;
}

关于如何实现这一目标有什么建议吗?我想在 while 循环中执行每个 findById

最佳答案

无需修改findById,您就可以使用reduce模拟系列或 waterfall 式行为:

var urls = ['http://www.yahoo.com', 'http://example.com', 'http://w3c.org'];
urls.reduce(function(accumulator, url) {
return accumulator.then(function(results) {
return findById(url)
.then(function(result) {
results.push(result);
return results;
});
});
}, Promise.resolve([])).then(function(results){
//do what you need to do with the results
});

为了完整起见,并且因为我必须进行一些修改,所以对 findById 方法进行了(轻微)修改:

function findById(address) {
return new Promise(function(resolve, reject) {
vo(function * (address) {
var nightmare = new Nightmare({
show: true
});
var link = yield nightmare
.goto(address)
.wait(2000)
.evaluate(function() {
return document.getElementsByTagName('html')[0].innerHTML;
});
yield nightmare.end();
return link;
})(address, function(err, res) {
if (err) reject(err);
resolve(res);
});
});
}

...话虽如此,我不确定这种方法是最好的。为什么你希望它们在单独的 Nightmare 实例中一次出现一个?我意识到这并不完全适合您原来的实现,但这可能是您想要考虑的事情 - 您可以更改 findById 来接受数组而不是单个 URL,并且还(可选)使用同一个 Nightmare 实例。调用findById:

var urls = ['http://www.yahoo.com', 'http://example.com', 'http://w3c.org'];
findById(urls)
.then(function(results) {
//do what you need to do with the results
});

...和 ​​findById 本身:

function findById(addresses) {
return new Promise(function(resolve, reject) {
vo(function * (addresses) {
var nightmare = new Nightmare({
show: true
});
var results = [];
for (var i = 0; i < addresses.length; i++) {
results.push(yield nightmare
.goto(addresses[i])
.wait(2000)
.evaluate(function() {
return document.getElementsByTagName('html')[0].innerHTML;
}));
}
yield nightmare.end();
return results;

})(addresses, function(err, res) {
if (err) reject(err);
resolve(res);
});
});
}

当然,如果您每次仍然想要新鲜的 Nightmare 实例,则可以将构造函数调用和对 .end() 的调用移至 for 循环内部。

关于node.js - 将 Nightmare 包裹在 promise 中/一次处理一个网址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35419604/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com