我有以下情况:
- 我的擦伤在登录后面,所以我总是需要先点击一个登录页面
- 然后我有一个 30 个 url 的列表,可以异步抓取,我只关心
- 然后在最后,当所有这 30 个 url 都被抓取后,我需要点击最后一个单独的 url,将 30 个 URL 抓取的结果放入 firebase 数据库并进行一些其他突变(如地址的地理查找等)
目前,我在请求队列中有所有 30 个 url(通过 Apify 网络界面),我正在尝试查看它们何时完成。
但显然它们都是异步运行的,因此数据永远不可靠
const queue = await Apify.openRequestQueue();
let pendingRequestCount = await queue.getInfo();
我需要将最后一个 URL 分开的原因有两个:
- 最明显的原因是,在将所有内容发送到数据库之前,我需要确保获得所有 30 次刮擦的结果
- 30 个 URL 中的任何一个都不允许我进行 Ajax / Fetch 调用,我需要将其发送到 Firebase 并进行地址的地理查找
编辑:根据@Lukáš Křivka 的回答对此进行了尝试。while 循环中的handledRequestCount 达到最大值2,从不达到4 ...并且Puppeteer 正常结束。我将“return”放在 while 循环中,否则请求永远不会完成(当然)。
在我当前的测试设置中,我有 4 个要抓取的 url(在 Puppeteer Scraper(在 Apify.com 上)的 Start URLS 输入字段中,并且此代码:
let title = "";
const queue = await Apify.openRequestQueue();
let {handledRequestCount} = await queue.getInfo();
while (handledRequestCount < 4){
await new Promise((resolve) => setTimeout(resolve, 2000)) // wait for 2 secs
handledRequestCount = await queue.getInfo().then((info) => info.handledRequestCount);
console.log(`Curently handled here: ${handledRequestCount} --- waiting`) // this goes max to '2'
title = await page.evaluate(()=>{ return $('h1').text()});
return {title};
}
log.info("Here I want to add another URL to the queue where I can do ajax stuff to save results from above runs to firebase db");
title = await page.evaluate(()=>{ return $('h1').text()});
return {title};