gpt4 book ai didi

javascript - 我的递归函数不是无限循环的。为什么?

转载 作者:行者123 更新时间:2023-12-03 13:23:55 25 4
gpt4 key购买 nike

Nightmare 一直在起作用,当然我正在测试此工具,但是总的来说,主要的问题是为什么我的函数没有在无限循环上发生?由于我没有为页面设置条件。我可能做错了吗?

我想要的情况是:每当加载页面时,我都会得到带有页面标题的标题,然后再次调用该函数到下一页直到最后一页。

我也尝试了setTimeout,但没有成功。谁能帮我?提前致谢。

我的控制台日志仅打印1,然后完成。

代码段在这里:

var pagn = 1;
function ab(page){
nightmare.goto(url_base+"&page="+page)
.evaluate(() => {
return document.title;
})
.end()
.then((title) => {
console.log(title + ":" + page);
ab(++pagn);
//setTimeout("page(" + page + ")", 5000);
}).catch(()=>{console.log("Error");});
}
ab(pagn);

最佳答案

问题在于,您将使用.end()语句结束 session ,该语句将停止 Nightmare 引擎,因此在运行完其余.then语句后,节点将退出。

为了测试您的代码,我稍微重写了您的功能,以便它刮取一个特定的网站,并在它多次找到相同页面时退出(这是我的测试情况,因此您可能必须对其进行调整以适应您的代码)

const Nightmare = require('nightmare')
const nightmare = Nightmare({ show: true })

function scrapePages( targetUrl, curPage = 0, transform = (url, page) => `${url}?page=${page}`, pageSet = new Set() ) {
console.info('Trying to scrape page ' + transform( targetUrl, curPage ) );
return nightmare
.goto( transform( targetUrl, curPage ) )
.evaluate( () => document.title )
.then( (title) => {
if (pageSet.has( title )) {
throw 'page already exists';
}
pageSet.add( title );
console.info( title + ':' + curPage );
return scrapePages( targetUrl, curPage + 1, transform, pageSet );
})
.catch( ( err ) => {
console.error( err );
return { maxPages: curPage, pages: pageSet };
} );
}

scrapePages( 'some-paged-url', 0, (url, page) => url + '/' + (page + 1) )
.then( ({ maxPages, pages }) => {
// end nightmare process
nightmare.end().then( () => {
console.info(`Found ${maxPages} pages`);
});
} )
.catch( err => console.error('Error occured', err ) );

如您所见,最大的不同是,梦once过程的结束仅在爬取完成后才发生。届时,您将拥有可用的总页面数和成功调用的所有页面数

关于javascript - 我的递归函数不是无限循环的。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49527378/

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