问题描述
所以我看过puppeteer-cluster程序包,但是它有非常手动的示例,我的情况非常动态,所以我会尽力解释。
好,所以我有一个应用程序,用户可以在其中安排帖子。一旦到达发布时间,puppeteer便会运行,然后转到该网站,使用我应用程序数据库中的凭据登录用户,然后相当简单地发布内容。
现在,当说20位用户都决定今天下午1点发布信息时,就会出现问题。现在,木偶生成了25个Chrome实例,这与服务器内存不足的原因无关。我主要要问的是如何实现以下目标: 1)。将操纵up的并发限制为10个实例。然后基本上应该分批执行该操作,例如先执行10,然后关闭它们,然后再次启动10,依此类推。 2)。如果少于10,则只需保持正常功能即可。
我知道这似乎是我正在给您做作业,但请相信我,我只需要一些指导即可,或者向我指出正确的方向就足够了。或者您可以告诉我如何使用它:puppeteer-cluster动态地满足我的需要。非常感谢!
解决方法
- 首先,您需要具有高级消息队列系统 捕获所有传入的并发请求,例如Kafka / RabbitMQ
- 以10个请求的块的形式获取消息,并在其中运行for循环 这些块,每个循环在每个块上创建一个集群。
- 以下代码说明了如何实现此功能,这段代码回答了您列出的所有问题。
代码段:
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);
});