Як використовувати Puppeteer Cluster для масштабування вебскрапінгу

Як використовувати Puppeteer Cluster для масштабування вебскрапінгу?

У цій статті ми покажемо, як масштабувати ваш вебскрапінг за допомогою Puppeteer Cluster, що дає змогу виконувати більше завдань одночасно та прискорювати весь процес. Давайте розберемося!

Що таке кластеризація Puppeteer?

Кластеризація Puppeteer допомагає пришвидшити роботу вебскрапінг запускаючи одночасно кілька екземплярів браузера або воркерів. Замість того щоб збирати дані з кожної URL-адреси одну за одною одним браузером, кластеризація розподіляє навантаження між кількома воркерами, даючи їм змогу обробляти завдання паралельно. Кожен воркер бере завдання, збирає дані, а потім переходить до наступного зі спільної черги. Такий підхід дає змогу збирати дані з кількох сторінок одночасно, скорочуючи час, потрібний для обробки великих наборів даних. Кластеризація особливо корисна, коли потрібно швидко зібрати великі обсяги даних.

Навіщо використовувати кластеризацію Puppeteer?

Ось ключові переваги використання кластеризації Puppeteer:

  1. Підвищена швидкість і ефективність: Коли ви займаєтеся вебскрапінгом великих сайтів або кількох URL-адрес, запуск одного екземпляра браузера може зайняти багато часу. Кластеризація Puppeteer дає змогу пришвидшити процес, запускаючи кілька екземплярів браузера паралельно. Це скорочує загальний час, потрібний для вебскрапінгу всіх сторінок.
  2. Resource Optimization: Паралельний запуск кількох екземплярів браузера дає змогу максимально ефективно використовувати доступні ресурси. Замість запуску одного екземпляра на кожне завдання, що може бути неефективним, кластеризація дає змогу оптимально використовувати ресурси, розподіляючи навантаження між кількома воркерами.
  3. Better Load Distribution: У випадках, коли сайти повільні або ресурсомісткі, кластеризація може допомогти рівномірно розподілити навантаження між кількома воркерами. Це гарантує, що жоден окремий воркер не буде перевантажений, а завдання виконуватимуться якомога швидше.
  4. Avoiding Detection: Коли ви збираєте дані з кількох сторінок одного й того самого сайту, кластеризація допомагає розподіляти завдання між різними екземплярами браузера, що ускладнює виявлення вебскрапінгу сайтами. Кожен воркер може використовувати власний набір кукі, агентів користувача та сесій, зменшуючи ймовірність, що вас позначать як бота.

Налаштування Puppeteer Cluster

Щоб почати використовувати кластеризацію Puppeteer, потрібно встановити необхідні залежності. До них належать і Puppeteer, і бібліотека Puppeteer Cluster.

Встановіть Puppeteer і Puppeteer-Cluster: Спочатку встановіть потрібні бібліотеки, виконавши таку команду:

npm install puppeteer puppeteer-cluster

Import the Libraries: Після встановлення імпортуйте необхідні бібліотеки у свій скрипт. Для роботи з функціональністю кластеризації вам знадобиться бібліотека puppeteer-cluster:

const { Cluster } = require('puppeteer-cluster');

Запустіть кластер: Once the libraries are imported, you can launch the cluster. The Cluster.launch function allows you to configure several parameters, such as the concurrency model (how the workers operate), the maximum number of workers to run concurrently, and other cluster settings. For example, to create a cluster with three browser instances, you can use the following code:

const cluster = await Cluster.launch({
concurrency: Cluster.CONCURRENCY_BROWSER, // Use separate browser instances
maxConcurrency: 3, // Limit the number of concurrent browser instances
});

Як працює Puppeteer Cluster?

Бібліотека puppeteer-cluster пропонує простий спосіб керувати пулом воркерів, які паралельно збирають дані з сайтів. Кожен воркер відповідає за виконання завдання, яке може включати перехід за URL-адресою, вебскрапінг даних зі сторінки або взаємодію зі сторінкою. Ось як працює цей процес:

Task Queues: Коли ви запускаєте кластер, ви визначаєте завдання, яке виконуватиме кожен воркер. Завдання може передбачати перехід за певною URL-адресою та вебскрапінг деяких даних. Завдання додаються до черги завдань кластера, а кожен воркер підхоплює завдання, коли звільняється.

Concurrency Models: У Puppeteer Cluster є три моделі паралельного виконання, кожна з яких підходить для різних сценаріїв використання:

  • CONCURRENCY_BROWSER: Ця модель запускає кожен воркер в окремому екземплярі браузера. Вона ідеально підходить, коли потрібна повна ізоляція між завданнями, наприклад коли кожному завданню потрібен власний набір кукі, агентів користувача або проксі.
  • CONCURRENCY_CONTEXT: Ця модель запускає кожен воркер в окремому контексті браузера в межах одного екземпляра браузера. Вона дає змогу спільно використовувати ресурси браузера, як-от user agents або файли cookie, але все одно зберігати певну ізоляцію між завданнями.
  • CONCURRENCY_PAGE: Ця модель запускає кожен воркер в одному й тому самому екземплярі браузера та контексті, спільно використовуючи такі ресурси, як cookies, сесійні дані та локальне сховище. Вона найекономніша щодо використання пам’яті, але її слід використовувати під час вебскрапінгу різних доменів.

Running Tasks Concurrently: Once the cluster is set up, you can add tasks to the queue using cluster.queue(url). Each worker picks a task from the queue, processes it, and moves to the next one. This allows the tasks to run concurrently, significantly reducing the time required to scrape data.

Закриття кластера: After all tasks are processed, you can call cluster.close() to close the cluster and release any resources used by the workers.

Приклад: Паралельний вебскрапінг кількох URL-адрес

Ось простий приклад того, як можна паралельно збирати дані з кількох сторінок за допомогою Puppeteer Cluster. У цьому прикладі ми збиратимемо заголовки різних сторінок:

const { Cluster } = require('puppeteer-cluster');
(async () => {
// Launch the cluster with three browser instances
const cluster = await Cluster.launch({
concurrency: Cluster.CONCURRENCY_BROWSER,
maxConcurrency: 3,
});
// Define the task to scrape page titles
await cluster.task(async ({ page, data: url }) => {
await page.goto(url);
console.log(await page.title());
});
// Queue up multiple URLs to scrape
const URLs = [
'https://example.com/page1',
'https://example.com/page2',
'https://example.com/page3',
];
URLs.forEach((url) => cluster.queue(url));
// Wait for all tasks to finish
await cluster.idle();
// Close the cluster
await cluster.close();
})();

У наведеному вище коді одночасно запускаються три екземпляри браузера. Кожен воркер виконує завдання перейти за URL-адресою та записати в журнал заголовок сторінки. Кожна URL-адреса додається до черги, а воркери підхоплюють завдання й обробляють їх паралельно, суттєво скорочуючи час, потрібний для вебскрапінгу всіх трьох сторінок.

Advanced Cluster Features

Puppeteer Cluster також пропонує кілька розширених можливостей, які роблять його потужнішим і гнучкішим. Ці опції допомагають ефективніше керувати масштабними завданнями вебскрапінгу:

1. Ліміт повторних спроб і затримка: Якщо завдання завершується збоєм (наприклад, через мережеву помилку або збій завантаження сторінки), ви можете встановити ліміт повторних спроб і затримку, щоб дати завданню ще один шанс успішно виконатися.

const cluster = await Cluster.launch({
retryLimit: 3, // Maximum retries per task
retryDelay: 2000, // Delay between retries (in milliseconds)
});

2. Timeouts: Можна встановити загальний тайм-аут для завдань, щоб надто тривалі завдання автоматично зупинялися.

const cluster = await Cluster.launch({
timeout: 6000, // Timeout for each task (in milliseconds)
});

3. Skip Duplicate URLs: Щоб уникнути повторної обробки тієї самої URL-адреси, можна увімкнути опцію skipDuplicateUrls.

const cluster = await Cluster.launch({
skipDuplicateUrls: true, // Prevent duplicate URLs from being processed
});

4. Worker Creation Delay: Якщо вам потрібно контролювати темп створення воркерів, можна додати затримку між створенням кожного воркера.

const cluster = await Cluster.launch({
workerCreationDelay: 100, // Delay between worker creations (in milliseconds)
});

Масштабування вебскрапінгу за допомогою хмарних рішень

Хоча Puppeteer Cluster може допомогти масштабувати ваш вебскрапер на локальному комп’ютері, одночасний запуск занадто великої кількості екземплярів браузера може призвести до проблем із використанням пам’яті. Щоб подолати ці труднощі, можна скористатися хмарним рішенням для керування проксі та браузерами, наприклад Bright Data. Bright Data пропонує потужну інфраструктуру, яка дає змогу без зусиль масштабувати ваші операції вебскрапінгу.

Підключивши ваш вебскрапер на Puppeteer до хмарного рішення на кшталт Bright Data, ви зможете обробляти тисячі одночасних запитів, не переймаючись системними обмеженнями. Bright Data пропонує ротаційні проксі, геотаргетингом і можливістю легко масштабувати операції вебскрапінгу на кілька хмарних вузлів, що робить його ідеальним вибором для великих проєктів вебскрапінгу.

Ось приклад інтеграції Bright Data’s Proxy Manager з вашим вебскрапером Puppeteer Cluster:

const puppeteer = require('puppeteer-core');
const { Cluster } = require('puppeteer-cluster');
(async () => {
// Set up Bright Data's Proxy Manager
const browser = await puppeteer.connect({
browserWSEndpoint: 'wss://your-proxy-manager-endpoint',
});
// Launch the cluster with the Bright Data connection
const cluster = await Cluster.launch({
concurrency: Cluster.CONCURRENCY_BROWSER,
maxConcurrency: 3,
browser,
});
// Define scraping tasks
await cluster.queue('https://example.com', async ({ page, data }) => {
await page.goto(data);
console.log(await page.title());
});
// Close the cluster
await cluster.idle();
await cluster.close();
await browser.close();
})();

Conclusion

Puppeteer Cluster — це потужний інструмент для масштабування завдань вебскрапінгу шляхом одночасного запуску кількох екземплярів браузера. Завдяки кластеризації ви можете значно підвищити швидкість і ефективність свого вебскрапера, обробляти великі обсяги даних і зменшити ризик виявлення з боку вебсайтів. Незалежно від того, чи збираєте ви дані для досліджень, аналізу чи бізнес-аналітики, Puppeteer Cluster пропонує простий і ефективний спосіб масштабувати ваші операції вебскрапінгу.

Для завдань вебскрапінгу у великих масштабах варто розглянути хмарне рішення на кшталт Bright Data або Firecrawl, щоб обробляти великі обсяги запитів і масштабувати ваш вебскрапер без упору в системні обмеження.

Схожі записи