Node.js 木偶演员通过多页并行抓取
我想同时抓取多个URL,所以我使用Node.js 木偶演员通过多页并行抓取,node.js,puppeteer,Node.js,Puppeteer,我想同时抓取多个URL,所以我使用p-queue来实现Promise-queue 例如,请参见下面的代码,使用一个浏览器和多个页面来完成此工作 const queue=新PQUE({ 并发:5 }); ( 异步()=>{ 让实例=等待pptr.launch({ 无头:错, }); //任务处理器功能 const createInstance=async(url)=>{ let page=wait instance.newPage(); 等待页面。转到(电子邮件); //(问题)这里有更多的操作
p-queue
来实现Promise
-queue
例如,请参见下面的代码,使用一个浏览器和多个页面来完成此工作
const queue=新PQUE({
并发:5
});
(
异步()=>{
让实例=等待pptr.launch({
无头:错,
});
//任务处理器功能
const createInstance=async(url)=>{
let page=wait instance.newPage();
等待页面。转到(电子邮件);
//(问题)这里有更多的操作
...
返回等待页面。关闭();
}
//将任务添加到队列
for(让url的url){
添加(异步()=>createInstance(url))
}
}
)()
问题是,确实可以通过多个页面同时打开多个URL,但看起来只有浏览器关注的一个(并且只有一个)页面将继续执行操作(请参见上面的代码更多操作转到此处
部分),其他页面(或选项卡)只要停止工作,除非我点击那个页面去关注它
那么,有什么办法可以同时运行所有页面吗?我找到了上述代码不起作用的原因,我不应该在worker函数之外等待实例,而应该在内部等待,见下文
(
async () => {
let instance = pptr.launch({ // don't await here
headless: false,
});
// task processor function
const createInstance = async (url) => {
let real_instance = await instance; // await here
let page = await real_instance.newPage();
await page.goto(email);
// (PROBLEM) more operations go here
...
return await page.close();
}
// add tasks to queue
for (let url of urls) {
queue.add(async () => createInstance(url))
}
}
)()
也许这些问题中的一些提示会有所帮助:,。@vsemozhetbyt谢谢