如何使用puppeteer进行cachewarmer?

时间:2019-03-08 05:59:41

标签: javascript node.js web-scraping puppeteer

我有一个长长的txt文件,带有〜1000个URL,需要执行这些文件以预热清漆缓存。
由于我需要操纵p,因此AJAX调用会加载重要的内容。

这是我的第一次尝试,但不是节点中的主节点。
真正的问题是它造成了100%的负载,并且启动了太多线程。

const puppeteer = require('puppeteer');
const readline = require('readline');
const fs = require('fs');

const rl = readline.createInterface({
    input: fs.createReadStream('varnish-warmer.txt')
  });

rl.on('line', (line) => {
(async () => {
    if (line != '') {
    const browser = await puppeteer.launch();
        const page = await browser.newPage();
        await page.goto(line);
        await page.waitFor(1000);

        browser.close();
    }

})();
});

1 个答案:

答案 0 :(得分:1)

您已经注意到,您的代码会并行启动所有浏览器,这会使系统过载。您可以依次访问每个网址(选项1),也可以使用pool of browsers加快访问速度(选项2)。

选项1

启动一个浏览器,然后一个接一个地访问所有页面:

 @override
 void initState() {
   super.initState();
   loadjson();
 } 

选项2

由于选项1可能需要一段时间才能获取1000个URL,因此您可能希望使用浏览器池来并行访问页面并加快处理速度。您可以为此使用puppeteer-cluster(免责声明:我是该库的作者)。

const puppeteer = require('puppeteer');
const fs = require('fs');

const lines = fs.readFileSync('varnish-warmer.txt').toString().split('\n');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    for (const line of lines) {
        await page.goto(line);
        await page.waitFor(1000);
    }
    await browser.close();
})();

您可以使用const { Cluster } = require('puppeteer-cluster'); const fs = require('fs'); (async () => { const cluster = await Cluster.launch({ concurrency: Cluster.CONCURRENCY_BROWSER, maxConcurrency: 10, // how many URLs should be visited in parallel // monitor: true, // uncomment to see information about progress }); // Define the task for each URL await cluster.task(async ({ page, data: url }) => { await page.goto(url); await page.waitFor(1000); }); // Queue the URLs const lines = fs.readFileSync('varnish-warmer.txt').toString().split('\n'); lines.forEach(line => cluster.queue(line)); // Wait for the tasks to finish and close the cluster after that await cluster.idle(); await cluster.close(); })(); 的值来更改工作程序的数量,具体取决于系统的功能(CPU /内存)。