我正在尝试使用horseman登录到网站,找到一组链接,打开每个链接,刮取一些数据并将其返回。如何使用horseman和nodejs打开一个URL数组?
这里是我迄今为止...
function getLinks() {
return horseman.evaluate(function() {
var links = [];
$('#cards > tbody > tr:not(:first-child) a').each(function (i, el) {
links.push($(el).attr('href'));
});
return links;
});
}
function scrapeDataFromLink(link) {
return horseman
.open(link)
.waitForSelector('#details > fieldset > table')
.evaluate(function() {
var data = {
name: $('#name > td:nth-child(2)').html().trim(),
type: $('#type > td:nth-child(2)').html().trim(),
expiry: $('#expiry > td:nth-child(2)').html().trim()
};
return data;
}
)
}
horseman
.userAgent('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0')
.open(LOGIN_URL)
.type('input[id=username]', username)
.type('input[id=password]', password)
.click('[id="login"]')
.waitForSelector('table[id=cards]')
.then(getLinks)
.then(function(links){
var promises = [];
links.forEach(function(link){
promises.push(scrapeDataFromLink(link));
});
Promise.all(promises).then((result) => {
console.log(result);
})
})
编辑 - 现在我可以回去使用上面的代码的结果,但他们都同样的结果,使用链条的最后一环。我认为发生的事情是每个循环在前一个URL完成之前打开每个URL,因此只返回最后打开的链接的结果。我如何确保这些承诺是同步执行的?