Puppeteer Chromium实例管理

问题描述

所以我看过puppeteer-cluster程序包,但是它有非常手动的示例,我的情况非常动态,所以我会尽力解释。

好,所以我有一个应用程序,用户可以在其中安排帖子。一旦到达发布时间,puppeteer便会运行,然后转到该网站,使用我应用程序数据库中的凭据登录用户,然后相当简单地发布内容

现在,当说20位用户都决定今天下午1点发布信息时,就会出现问题。现在,木偶生成了25个Chrome实例,这与服务器内存不足的原因无关。我主要要问的是如何实现以下目标: 1)。将操纵up的并发限制为10个实例。然后基本上应该分批执行该操作,例如先执行10,然后关闭它们,然后再次启动10,依此类推。 2)。如果少于10,则只需保持正常功能即可。

我知道这似乎是我正在给您做作业,但请相信我,我只需要一些指导即可,或者向我指出正确的方向就足够了。或者您可以告诉我如何使用它:puppeteer-cluster动态地满足我的需要。非常感谢!

解决方法

  1. 首先,您需要具有高级消息队列系统 捕获所有传入的并发请求,例如Kafka / RabbitMQ
  2. 以10个请求的块的形式获取消息,并在其中运行for循环 这些块,每个循环在每个块上创建一个集群。
  3. 以下代码说明了如何实现此功能,这段代码回答了您列出的所有问题。

代码段:

const { Cluster } = require('puppeteer-cluster');
const runChunks = async (chunkArr,chunkSize) => {
    //Launching cluster for each chunk
    const cluster = await Cluster.launch({
        concurrency: Cluster.CONCURRENCY_CONTEXT,maxConcurrency: chunkSize,//Defined max chunksize
    });
    //Task to complete
    await cluster.task(async ({ page,data: url }) => {
        await page.goto(url);
        console.log('Reached: ',url);
        // Here goes the code for scraping task to complete ...
    });
    //Chunked array URLs queued for task completion
    chunkArr.forEach(data => {
        cluster.queue(data.url);
    });
    //Closing the cluster instance after it becomes idle
    await cluster.idle();
    await cluster.close();
};

function chunkArrGenerator(arr,chunkSize) {
    let chunksArr = [];
    let indexCounter = 0;
    while (indexCounter <= (arr.length - 1)) {
        chunksArr.push(arr.splice(0,chunkSize));
        indexCounter++;
    }
    return chunksArr;
}

// assume request array having 100 objects with url data
let arr = [{ url: "https://www.amazon.in/" },{ url: "https://www.flipkart.com/" },{ url: "https://www.crateandbarrel.com/" },{ url: "https://www.cb2.com/" } /* so on ... */];

let size = 2;  //chunk size
//Following line creates chunks of size 2,you change it to 10 as per your need
let chunks = chunkArrGenerator(arr,size);
//Executing each cluster on each chunk
chunks.forEach(async (chunk) => {
    await runChunks(chunk,size);
});