Как я могу использовать кукловод для кешвормера? - PullRequest
1 голос
/ 08 марта 2019

У меня есть длинный txt файл с ~ 1000 URL, который необходимо выполнить, чтобы прогреть кеш лака.
Так как мне нужен кукловод, есть ли важный контент, загружаемый вызовом 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 Ответ

1 голос
/ 08 марта 2019

Как вы уже заметили, ваш код запускает все браузеры параллельно, что перегружает вашу систему. Вы можете либо просматривать каждый URL один за другим (вариант 1), либо использовать пул браузеров для ускорения процесса (вариант 2).

Вариант 1

Запускает один браузер и посещает все страницы одну за другой:

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();
})();

Вариант 2

Поскольку для варианта 1 может потребоваться некоторое время для 1000 URL-адресов, вы можете использовать пул браузеров для параллельного посещения страниц и ускорения процесса. Для этого вы можете использовать puppeteer-cluster (отказ от ответственности: я автор библиотеки).

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();
})();

Вы можете поиграть со значением maxConcurrency, чтобы изменить количество рабочих в зависимости от возможностей (ЦП / память) вашей системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...