gpt4 book ai didi

javascript - 如何在 nightmare.js 中运行多个评估方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:13:33 25 4
gpt4 key购买 nike

我正在使用 nightmare.js 抓取网页内容。

在对 Nightmare 实例进行身份验证后,我循环遍历多个页面(需要登录),然后调用执行所有页面加载的运行方法。

我想从每个页面获取特定内容,因此我调用了评估函数,以确保我们在浏览器范围内执行。无论从 evaluate 函数返回什么,都将成为 run 方法中的参数

但我试图多次运行评估函数(每个页面一次)。但是 evaluate 函数只能将输出返回给 run 方法一次。我尝试将内容推送到全局变量(在主范围内),但无法从浏览器范围内访问它。

谁能建议如何在一个 Nightmare 实例上运行多个评估方法并从每个方法中提取信息?

var Nightmare = require("nightmare");

//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.');
});

for (var i = 0; i < 4; i++) {
scraper
.goto('https://www.example.com/page'+i)
.wait(1000)
.evaluate(function(){
return $('#result > h3').text()
})
}

scraper.run(function(err, result) {
console.log(result)
if (err) {
console.log(err);
}
}); )

最佳答案

我真的不太了解 Nightmare ,但看起来你可能只是简单地遇到了异步问题,这通常是 js 中的一个难题。

好消息是,您可以重构代码并依靠生成器使其工作得相当简单。

实现的关键是,当您在函数名称前使用 * 时,该函数将成为一个生成器函数,它允许您使用 yield 关键字。每当您 yield 时,该行代码将等待返回的 promise 完成,然后再转到下一行代码,并将返回该 yield 值作为结果。您可以使用 vo将生成器函数转换为回调的库,该回调返回所有生成结果的数组。

var Nightmare = require('../nightmare')
var vo = require('vo')

vo(run)(function(err, result) {
if (err) throw err
console.log('#result > h3: ', result)
})

function *run() {
var nightmare = Nightmare();
yield nightmare
.goto('https://www.example.com/signin')
.type('#login', 'username')
.type('#password', 'password')
.click('#btn')

for (var i = 0; i < 4; i++) {
yield nightmare
.goto('https://www.example.com/page'+i)
.wait(1000)
.evaluate(function(){
return $('#result > h3').text()
})
}

yield nightmare.end()
}

关于javascript - 如何在 nightmare.js 中运行多个评估方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35168144/

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