Реалізація парсингу через Puppeteer/Playwright (headless browser)
При спробі спарсити інтернет-магазин на Next.js ми зіткнулися з типовою проблемою: статичний HTML-парсер повертав порожню сторінку. Контент на React, Vue або Angular підвантажується динамічно — lazy-loading, infinite scroll та асинхронні запити до API. Без headless-браузера дані не отримати. Ми перепробували кілька інструментів і зупинилися на зв'язці Playwright з проксі-ротацією.
Наш досвід (понад 50 проєктів) показує: правильний вибір інструменту та оптимізація процесів скорочують час розробки скрапера на 30–50%. Наприклад, один із клієнтів автоматизував збір даних про ціни конкурентів, що дозволило скоротити витрати на ручний збір інформації. Інший проєкт показав аналогічну економію.
Чому headless-браузер необхідний для динамічних сайтів?
Сучасні фронтенд-фреймворки (React, Vue, Angular) рендерять контент на клієнті. HTTP-запит до сторінки дає лише HTML-обгортку. Щоб отримати реальні дані, потрібно виконати JavaScript. Headless-браузер робить це у фоні — ви отримуєте DOM, як у звичайному браузері, але без GUI.
Які сайти потребують headless-браузера?
- SPA (React, Vue, Angular) — контент будується на клієнті.
- Infinite scroll та lazy-loading — дані підвантажуються при скролі.
- Капчі та аутентифікація — вимагають виконання JS.
- Сайти із захистом від ботів (Cloudflare, DataDome) — без headless не обійтися.
Який headless-браузер краще для парсингу?
| Параметр | Puppeteer | Playwright |
|---|---|---|
| Браузери | Chrome/Chromium | Chrome, Firefox, Safari |
| Мова | Node.js | Node.js, Python, Java, C# |
| Auto-wait | Ні (явні очікування) | Так (авто-очікування елементів) |
| Швидкість розробки | Середня | Вища на 30-40% |
Playwright є кращим вибором для нових проєктів: його auto-wait значно зменшує кількість помилок — не потрібно вручну чекати кожен елемент. За даними офіційної документації, це прискорює розробку скриптів на 30-40%. У Puppeteer кожен waitForSelector доводиться налаштовувати окремо, що сповільнює роботу.
Як уникнути блокувань headless-браузера?
Захисти (DataDome, PerimeterX, Cloudflare Bot Management) аналізують десятки сигналів автоматизації. Основні методи обходу:
-
playwright-stealth— патчитьnavigator.webdriverта інші поля. - Реалістичні рухи миші через
playwright-mouse-helper. - Унікальні fingerprints — різні viewport, timezone, locale для кожної сесії.
- Ротація проксі та user-agent.
Без цих заходів до 80% запитів блокується. У наших проєктах комбінація методів дає прохідність 95%+.
Деталі налаштування стелс-бібліотек
- Встановіть
playwright-stealthта застосуйте патчі до запуску браузера. - Налаштуйте реалістичні рухи миші за допомогою
playwright-mouse-helper. - Для кожної сесії генеруйте новий fingerprint: viewport, timezone, locale, user-agent.
- Використовуйте пул проксі з ротацією через кожні N запитів.
Типовий сценарій парсингу
// Playwright: парсинг каталогу з infinite scroll
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({
userAgent: 'Mozilla/5.0 ...',
viewport: { width: 1280, height: 900 }
});
const page = await context.newPage();
await page.goto('https://example.com/catalog');
// Скрол до кінця сторінки
let prevHeight = 0;
while (true) {
const height = await page.evaluate(() => document.body.scrollHeight);
if (height === prevHeight) break;
await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
await page.waitForTimeout(1500 + Math.random() * 1000);
prevHeight = height;
}
// Витягнення даних
const items = await page.$$eval('.product-card', cards =>
cards.map(card => ({
title: card.querySelector('.title')?.textContent?.trim(),
price: card.querySelector('.price')?.textContent?.trim(),
url: card.querySelector('a')?.href
}))
);
Оптимізація продуктивності: як знизити навантаження?
Запуск браузера дорогий. Для промислового парсингу:
- Пул браузерних контекстів — один процес Chrome, кілька ізольованих контекстів.
- Відключення ресурсів — блокування завантаження шрифтів, картинок, аналітики через
page.route(). - Кластеризація —
playwright-clusterабо самописний пул зworker_threads.
Блокування зайвого трафіку знижує час завантаження сторінки на 40–70% та витрати пам'яті. Наприклад, скрапер інтернет-магазину з 10 000 товарів потребував на 60% менше пам'яті після відключення зображень.
Процес розробки скрапера
| Етап | Тривалість | Результат |
|---|---|---|
| Аналіз цільового сайту | 0.5–1 день | Схема структури даних, список ендпоінтів |
| Розробка логіки парсингу | 1–3 дні | Робочий скрипт з обробкою пагінації/скролу |
| Інтеграція обходу захисту | 1–2 дні | Стелс-бібліотеки, проксі, ротація |
| Тестування та налагодження | 0.5–1 день | Перевірка на 100+ запитах, фікс помилок |
| Деплой та моніторинг | 0.5 дня | Запуск на сервері, алерти при збоях |
Що входить в роботу
- Повна документація щодо розгортання скрапера.
- Код з коментарями та інструкцією по запуску.
- Налаштування проксі-ротації та user-agent.
- Тестовий прогін на обраному сайті (до 1000 сторінок).
- Гарантія роботи протягом 30 днів після здачі.
Терміни та вартість
Базовий скрапер одного сайту: 2–4 дні. Скрапер з обходом захисту, проксі-ротацією та моніторингом: 7–10 днів. Вартість розраховується індивідуально після аналізу вашого проєкту. Зв'яжіться з нами, щоб отримати консультацію — ми допоможемо обрати оптимальне рішення та оцінимо економію для вашого бізнесу. Замовте попередній аналіз вашого проєкту безкоштовно.







