---
title: "Puppeteer веб-скрапинг: руководство с практическим подходом"
description: Узнайте, как использовать Puppeteer для веб-скрапинга с помощью нашего практического гайда. Изучите реальные примеры и советы по эффективному извлечению данных.
image: https://blog.froxy.com/hubfs/blog/puppeteer-web-scraping-guide/puppeteer-web-scraping-guide.png
---

<https://froxy.com/ru>

 Продукты

- [Резидентные прокси](https://froxy.com/ru/residential-proxies)
- [Мобильные прокси](https://froxy.com/ru/mobile-proxies)
- [Серверные прокси](https://froxy.com/ru/datacenter-proxies)

 Цены

- [Резидентные прокси](https://froxy.com/ru/residential-proxies/pricing)
- [Мобильные прокси](https://froxy.com/ru/mobile-proxies/pricing)
- [Серверные прокси](https://froxy.com/ru/datacenter-proxies/pricing)

[Локации](https://froxy.com/ru/locations)

Русский

- [English](https://blog.froxy.com/en/puppeteer-web-scraping-guide?hsLang=ru)
- [Русский](https://blog.froxy.com/ru?hsLang=ru)

[![Вход](https://hubspot-no-cache-eu1-prod.s3.amazonaws.com/cta/default/25353777/628aa0b1-d701-49a3-9fc1-64cf181b50a5.png)](https://hubspot-cta-redirect-eu1-prod.s3.amazonaws.com/cta/redirect/25353777/628aa0b1-d701-49a3-9fc1-64cf181b50a5) [![Регистрация](https://hubspot-no-cache-eu1-prod.s3.amazonaws.com/cta/default/25353777/526abaec-b188-4330-8b34-97e181ba893d.png)](https://hubspot-cta-redirect-eu1-prod.s3.amazonaws.com/cta/redirect/25353777/526abaec-b188-4330-8b34-97e181ba893d)

<https://blog.froxy.com/ru?hsLang=ru>

- [Прокси](https://blog.froxy.com/ru/tag/прокси)
- [Парсинг](https://blog.froxy.com/ru/tag/парсинг)
- [Кейсы](https://blog.froxy.com/ru/tag/кейсы)
- [Новости](https://blog.froxy.com/ru/tag/новости)
- [Приватность и безопасность](https://blog.froxy.com/ru/tag/приватность-и-безопасность)
- [Антидетект](https://blog.froxy.com/ru/tag/антидетект)
- [Данные и аналитика](https://blog.froxy.com/ru/tag/данные-и-аналитика)
- [AI](https://blog.froxy.com/ru/tag/ai)
- [Поиск](https://blog.froxy.com/hs-search-results?hsLang=ru)
- Русский
- [English](https://blog.froxy.com/en/puppeteer-web-scraping-guide?hsLang=ru)
- [Русский](https://blog.froxy.com/ru?hsLang=ru)
- Продукты
- [Резидентные прокси](https://froxy.com/ru/residential-proxies)
- [Мобильные прокси](https://froxy.com/ru/mobile-proxies)
- [Серверные прокси](https://froxy.com/ru/datacenter-proxies)
- Цены
- [Резидентные прокси](https://froxy.com/ru/residential-proxies/pricing)
- [Мобильные прокси](https://froxy.com/ru/mobile-proxies/pricing)
- [Серверные прокси](https://froxy.com/ru/datacenter-proxies/pricing)
- [Локации](https://froxy.com/ru/locations)
- [![Вход](https://hubspot-no-cache-eu1-prod.s3.amazonaws.com/cta/default/25353777/8d0caf92-c619-4aca-a35e-94e08ab2d732.png)](https://hubspot-cta-redirect-eu1-prod.s3.amazonaws.com/cta/redirect/25353777/8d0caf92-c619-4aca-a35e-94e08ab2d732)
- [![Регистрация](https://hubspot-no-cache-eu1-prod.s3.amazonaws.com/cta/default/25353777/466a3309-1a3b-40b0-9230-bf10233341cd.png)](https://hubspot-cta-redirect-eu1-prod.s3.amazonaws.com/cta/redirect/25353777/466a3309-1a3b-40b0-9230-bf10233341cd)

1. [Блог](https://blog.froxy.com/ru?hsLang=ru)
2. Веб-скрапинг с помощью Puppeteer: Практический подход

Парсинг

# Веб-скрапинг с помощью Puppeteer: Практический подход

Узнайте, как использовать Puppeteer для веб-скрапинга с помощью нашего практического гайда. Изучите реальные примеры и советы по эффективному извлечению данных.

Команда Froxy 17 апр. 2025 9 мин

[Facebook](http://www.facebook.com/share.php?u=https://blog.froxy.com/ru/puppeteer-web-scraping-guide?utm_medium=social&utm_source=facebook) [linkedIn](http://www.linkedin.com/shareArticle?mini=true&url=https://blog.froxy.com/ru/puppeteer-web-scraping-guide?utm_medium=social&utm_source=linkedin) [Twitter](https://twitter.com/intent/tweet?original_referer=https://blog.froxy.com/ru/puppeteer-web-scraping-guide?utm_medium=social&utm_source=twitter&url=https://blog.froxy.com/ru/puppeteer-web-scraping-guide?utm_medium=social&utm_source=twitter&source=tweetbutton&text=)

![Веб-скрапинг с помощью Puppeteer: Практический подход](https://blog.froxy.com/hubfs/blog/puppeteer-web-scraping-guide/puppeteer-web-scraping-guide.png)

- [Преимущества web-скрапинга с Puppeteer](https://blog.froxy.com/ru/puppeteer-web-scraping-guide#advantages)
- [Руководство по веб-парсингу с использованием Puppeteer](https://blog.froxy.com/ru/puppeteer-web-scraping-guide#guide) 
    - [Установка окружения NodeJS для скрапинга с Puppeteer в Windows](https://blog.froxy.com/ru/puppeteer-web-scraping-guide#windows)
    - [Установка Puppeteer](https://blog.froxy.com/ru/puppeteer-web-scraping-guide#installation)
    - [Создание первого web-парсера Puppeteer](https://blog.froxy.com/ru/puppeteer-web-scraping-guide#first-scraper)
    - [Поиск элементов на странице в web-парсере Puppeteer](https://blog.froxy.com/ru/puppeteer-web-scraping-guide#finding-elements-on-the-page)
    - [Обработка бесконечной прокрутки при web-парсинге Puppeteer](https://blog.froxy.com/ru/puppeteer-web-scraping-guide#infinite-scroll)
    - [Обход списка страниц при web-парсинге Puppeteer](https://blog.froxy.com/ru/puppeteer-web-scraping-guide#pagination)
    - [Блокировка загрузки ненужного содержимого](https://blog.froxy.com/ru/puppeteer-web-scraping-guide#unnecessary-content)
- [Работа скрипта веб-скрапинга Puppeteer через прокси](https://blog.froxy.com/ru/puppeteer-web-scraping-guide#proxy)
- [Другие рекомендации](https://blog.froxy.com/ru/puppeteer-web-scraping-guide#tips)
- [Заключение](https://blog.froxy.com/ru/puppeteer-web-scraping-guide#conclusion)

Ранее мы уже упоминали разные web-драйвера и библиотеки с фреймворками для создания своих [программ парсинга](https://blog.froxy.com/ru/what-is-data-parsing?hsLang=ru) сайтов. В частности, к наиболее популярным решениям для управления headless-браузерами относятся Playwright, Selenium и Puppeteer. У каждого из них свои особенности и области применения. Как минимум присутствуют определённые требования по используемым языкам программирования.

В этой статье расскажем о библиотеке Puppeteer, о том, как она помогает с тестированием приложений и web-парсингом (скрейпингом сайтов). А также рассмотрим пошаговое руководство по написанию своего собственного парсера с Puppeteer и наиболее вероятные ситуации применения.

## Преимущества web-скрапинга с Puppeteer

**Puppeteer** – это Node.js-библиотека для управления браузерами Google Chrome и Chromium по протоколу [DevTool Protocol](https://chromedevtools.github.io/devtools-protocol/) (сокращённо CDP). Библиотека имеет открытый исходный код и была представлена для демонстрации возможностей встроенного API веб-браузера (за её написанием стоит та же команда Google, что и отвечает за направление браузера, [официальный сайт](https://pptr.dev/)). До 2017 года Хромом можно было управлять только через сторонние библиотеки web-драйверов, так как собственного API-интерфейса у него не было. За организацию API обычно отвечали внешние программные решения, такие как Playwright и Selenium.

[Подробное сравнение Playwright vs Puppeteer](https://blog.froxy.com/ru/playwright-vs-puppeteer?hsLang=ru)

После релиза CDP (**C**hrome **D**evtool **P**rotocol) с браузером стало возможно общаться напрямую, например, с помощью специальных флагов и команд в консоли, а также с использованием API-интерфейса.

Чтобы показать возможности управления и была написана библиотека Puppeteer.

Чуть позже поддержка CDP появилась и в существовавших web-драйверах (Playwright, Selenium и пр.), а также стали релизиться другие высокоуровневые прослойки, такие как [Chromedp](https://blog.froxy.com/ru/chromedp-with-scraping?hsLang=ru).

Но сейчас не о них, а только о Puppeteer.

**Ключевые возможности, которые предоставляет библиотека Puppeteer для web-скрапинга:**

- Поддержка одного из самых популярных языков web-программирования – JavaScript (Node.js). Он в свою очередь кроссплатформенный.
- Прямое управление [headless-браузерами](https://blog.froxy.com/ru/headless-browser-what-is-it-and-how-to-use-it-for-scraping?hsLang=ru) Chromium и Google Chrome. Даже уже установленными версиями в операционной системе (без развёртывания экземпляра в изолированной среде).
- Эта библиотека может использоваться для автоматизации тестирования браузерных расширений (для Google Chrome).
- Есть своя реализация двунаправленного веб-драйвера – WebDriver BiDi (начиная с версии 23 Puppeteer позволяет управлять не только Хромом, но и браузером Firefox).
- Максимально простой и понятный синтаксис команд.
- Встроенный синтаксический анализатор, который может искать нужные элементы в DOM-структуре (в HTML-коде) и возвращать заданные атрибуты: текст, ссылки и прочее.
- Поддержка асинхронности из коробки (парсер может ждать отрисовки определённого элемента страницы, вообще всего JS-кода или определённых событий).
- Полная совместимость с CDP-протоколом – создание скриншотов в браузере, PDF-версий страниц, отладка и прочее.
- Обработка cookie-файлов и работа с браузерными профилями.
- Поддержка работы через переменные среды, в том числе через [ротируемые прокси](https://blog.froxy.com/ru/rotating-proxy?hsLang=ru).
- Возможность эмулирования действий пользователя и работа с полями, файлами, формами ввода.

Обратите внимание! Каждый выпуск библиотеки тестирования и автоматизации web-скрапинга Puppeteer тесно связан с определённым выпуском браузера Chromium. Тут важно помнить, что Puppeteer – это эталонная реализация библиотеки для автоматизации браузера с задействованием его API. Отсюда и такой интересный подход.

Но из-за этого возникает ряд ограничений. Разработчики библиотеки концентрируют свои усилия только на одном языке программирования и не работают в сторону оркестрации, как это делают более продвинутые братья по цеху (Playwright и Selenium). Соответственно, Puppeteer подходит только для определённых узких задач. В нашем случае – для написания парсеров на языке JavaScript.

## Руководство по веб-парсингу с использованием Puppeteer

![Руководство по веб-парсингу с использованием Puppeteer](https://blog.froxy.com/hs-fs/hubfs/blog/puppeteer-web-scraping-guide/guide.png?width=1557&height=459&name=guide.png)

Начинать веб-скрапинг Puppeteer следует с установки и настройки среды NodeJS. Будем рассматривать процесс с привязкой к операционной системе Windows, как наиболее популярной платформы среди рядовых пользователей. Вместо этого вы можете установить Linux-дистрибутив (в том числе в среде Windows, например, через подсистему WSL или через платформы виртуализации, VMware, VirtualBox и т.п.) или обеспечить поддержку систем контейнеризации (например, Docker). Во многих Linux-системах установка NodeJS выполняется через штатный пакетный менеджер или через подсистему пакетов Snap.

Мы пойдём более простым путём – NodeJS, а соответственно и любой скрипт web-парсинга Puppeteer, может работать в Windows без слоёв виртуализации.

### Установка окружения NodeJS для скрапинга с Puppeteer в Windows

Скачайте инсталляционный пакет с официального [сайта NodeJS](https://nodejs.org/en/download). Там же есть примеры команд для установки через интерфейс консоли (PowerShell).

Если вам принципиально наличие менеджера версий NodeJS, то можно выполнить установку через [nvm](https://github.com/coreybutler/nvm-windows/releases), [fnm](https://github.com/Schniz/fnm/releases), [Brew](https://github.com/Homebrew/brew/releases) или [Docker](https://www.docker.com/products/docker-desktop/).

Путь установки NodeJS по умолчанию – «C:\\Program Files\\nodejs\\». Но вы можете изменить его на своё значение.

Не забудьте разрешить установку менеджера пакетов NPM и добавление путей (PATH) в переменные среды окружения Windows.

Дождитесь окончания установки (скрипт может скачивать и доустанавливать разные библиотеки и программы, например, репозиторий Chocolatey, редактор Microsoft Visual Studio, среду исполнения .Net, язык программирования Python и т.п.).

### Установка Puppeteer

Сначала создайте каталог, в котором будет храниться скрипт вашего Puppeteer-парсера:

`cd c:\``mkdir puppeteer-web-scraping-script``cd puppeteer-web-scraping-script`

Всё, мы в нужном каталоге. Теперь нужно проверить версию node и менеджера пакетов npm командами:

`npm -v``node –version`

Установите Puppeteer:

`npm install puppeteer`

В папке с вашим проектом появятся новые каталоги и файлы (в отдельной папке с модулями будет около 100 подпапок, в том числе @puppeteer, chromium-bidi, devtools-protocol, http-proxy-agent и другие).

### Создание первого web-парсера Puppeteer

В корне каталога проекта создайте текстовый файл, назовите его, например, «first-puppeteer-web-scraping-script». Смените расширение .txt на .js, должно получиться «first-puppeteer-web-scraping-script.js». Откройте этот файл в любом текстовом редакторе (мы используем Notepad++).

Наполните файл содержимым (скопируйте и вставьте код ниже):

`const puppeteer = require('puppeteer')``// Подключаем (импортируем) библиотеку с "кукловодом"``async function run(){``// Главная функция будет работать асинхронно``const browser = await puppeteer.launch({``// Тут мы создаём экземпляр headless-браузера и загружаем его. Тоже асинхронно.``// Чтобы все процессы работы скрипта можно было увидеть "вживую" отключим режим скрытия.``headless: false,``// Для этого установим флаг в "false". Если вы хотите, чтобы браузер работал без отображения окон, в фоне, изменить флаг на "true"``ignoreHTTPSErrors: true,``// Тут мы просим браузер игнорировать ошибки подключения по протоколу HTTPS``})``// Открываем в браузере новую вкладку``let page = await browser.newPage();``// И просим открыть конкретный URL-адрес``await page.goto('http://httpbin.org/html', {``// Ждём, пока загружается DOM-структура``waitUntil: 'domcontentloaded',``});``// Выводим найденный HTML-контент в консоли``console.log(await page.content());``// Закрываем вкладку и браузер``await page.close();``await browser.close();``}``run();`

Сохраните файл и запустите скрипт командой:

`node first-puppeteer-web-scraping-script.js`

Сначала откроется окно браузера, затем оно закроется и в консоли выведется HTML-содержимое страницы.

Всё, наш первый парсер отработал на 100%: он открыл браузер (вместо этого браузер может работать в фоне, без отображения графического интерфейса), перешёл на конкретную страницу и скопировал HTML-код.

Какие функции Puppeteer мы использовали:

- puppeteer.launch() – загрузка браузера, внутри могут использоваться дополнительные флаги и опции.
- newPage() – открытие новой вкладки.
- goto() – переход к нужной странице (web-адресу).
- content() – возврат HTML-содержимого страницы. При желании его можно пропустить через синтаксический анализатор и выбрать (сохранить) только нужные элементы. Об этом расскажем ниже.

Событие 'domcontentloaded' это штатное событие JavaScript, которое обозначает, что HTML-страница полностью загружена и браузер построил дерево DOM-структуры.

Вместо этого вы можете ждать загрузки определённого HTML-тега или селектора, а также выжидать время (таймаут). Например:

`await page.waitForSelector('h2', {timeout: 3_000})``// Ждём заголовок H2 в течение 3 секунд`

``

###### Резидентные прокси

Лучшие прокси-серверы для доступа к ценным данным со всего мира.

[Выбрать тариф](https://froxy.com/ru/residential-proxies) $1.99, 100Mb

### Поиск элементов на странице в web-парсере Puppeteer

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

Библиотека web-скрапинга Puppeteer поддерживает синтаксис анализатора XPath, поиск по имени, роли и тексту, а также поиск по префиксам и Shadow DOM ([документация по синтаксису запросов](https://pptr.dev/guides/page-interactions#querying-without-waiting)).

Класс «page» в Puppeteer поддерживает большое количество встроенным методов. Среди них действия пользователя, создание сессий, запись Cookie, скриншотов, скринкастов, PDF-версий страниц, установка юзер-агента и т.п. Все подробности в [официальной документации](https://pptr.dev/api/puppeteer.page).

Нас пока интересуют только методы для поиска конкретных элементов:

- page.$() – ищет на странице указанный элемент и выводит первое найденное значение.
- page.$$() – ищет на странице массив элементов, которые совпадают с указанным атрибутом.

У этих методов есть вариации с признаком “eval”, которые будут сначала исполнять JS-код страницы и только потом приступать к синтаксическому разбору.

Пример скрипта, который будет искать информацию о товарах на специальной тестовой странице:

`const puppeteer = require('puppeteer')``// Подключаем (импортируем) библиотеку с "кукловодом"``async function run(){``// Главная функция будет работать асинхронно``const browser = await puppeteer.launch({``// Тут мы создаём экземпляр headless-браузера и загружаем его. Тоже асинхронно.``// Чтобы все процессы работы скрипта можно было увидеть "вживую" отключим режим скрытия.``headless: false,``// Для этого установим флаг в "false". Если вы хотите, чтобы браузер работал без отображения окон, в фоне, изменить флаг на "true"``ignoreHTTPSErrors: true,``// Тут мы просим браузер игнорировать ошибки подключения по протоколу HTTPS``})``// Открываем в браузере новую вкладку``let page = await browser.newPage();``// И просим открыть конкретный URL-адрес``// В нашем случае это пример страницы с карточками продуктов``await page.goto('https://web-scraping.dev/products', {``// Ждём, пока загружается DOM-структура``waitUntil: 'domcontentloaded',``});``// Для примера найдём первый заголовок h3 (он имеет класс "mb-0")``// ... и скопируем из него текст, он прописан в теге <a>``let textfirsturl = await (await page.$('.mb-0 a')).evaluate( node => node.innerText);``// заодно скопируем саму ссылку, она в том же теге``let firsturl = await (await page.$('.mb-0 a')).evaluate( node => node.getAttribute("href"));``// Выводим найденный HTML-контент в консоли``console.log("First Product:", textfirsturl, "Its URL:", firsturl);``// А тут найдём сразу все товары и ссылки``// По факту alllinks изначально является массивом, так как функция page.$$ всегда возвращает массив``let alllinks = await page.$$('.mb-0 a');``//``for (const link of alllinks){``console.log("Product:", await link.evaluate( node => node.innerText));``console.log("URL:", await link.evaluate( node => node.getAttribute("href")));``}``// Закрываем вкладку и браузер``await page.close();``await browser.close();``}``run();`

Сохраняем и запускаем наш скрипт web-скрапинга Puppeteer.

Вот так будет выглядеть вывод в консоли:

![screen-2](https://blog.froxy.com/hs-fs/hubfs/blog/puppeteer-web-scraping-guide/screen-2.png?width=726&height=400&name=screen-2.png)

### Обработка бесконечной прокрутки при web-парсинге Puppeteer

Самая каверзная задача парсинга динамических сайтов (изменяющихся по JavaScript-событиям) – это обработка бесконечной прокрутки. Контент при каждой новой попытке скроллинга обновляется, так как в конец списка добавляются новые элементы.

Ниже пример нашего скрипта для парсинга списка отзывов с бесконечной подгрузкой.

Вы можете выставить свои параметры задержек и максимальное количество попыток прокрутки.

`const puppeteer = require('puppeteer')``// Подключаем (импортируем) библиотеку с "кукловодом"``// Сначала опишем функцию, которая будет отвечать за обработку скроллинга``async function scrollPageDown(page) {``// Предыдущее значение высоты экрана``let prevHeight = -1;``// Максимальное количество итераций скроллинга (если страница перестанет подгружать данные раньше, то цикл завершится досрочно)``let maxScrolls = 50;``// Переменная для подсчёта сделанных итераций``let scrollCount = 0;``// Описываем логику функции``// Пока текущее количество итераций меньше максимального, выполняем попытки прокрутки``while (scrollCount < maxScrolls) {``// Скроллим страницу вниз через специальный метод для класса Page, в качестве параметра передаём значение текущей высоты элемента body``await page.evaluate('window.scrollTo(0, document.body.scrollHeight)');``// Ждём пока страница загрузится, хотя бы 1 секунду, то есть 1000 миллисекунд``await new Promise(resolve => setTimeout(resolve, 1000));``// Вычисляем новую высоту тега body``let newHeight = await page.evaluate('document.body.scrollHeight');``// Если новое значение высоты равно предыдущему``if (newHeight == prevHeight) {``// Выводим текущее значение счётсчика скроллов``console.log("Scrolls Count:", scrollCount);``// Выходим из цикла``break;``}``// Делаем новое значение высоты body предыдущим``prevHeight = newHeight;``// Добавляем счётчик итераций скроллинга``scrollCount += 1;``}``};``// Тут описываем логику функции скрапинга с Puppeteer``async function parseReviews(page) {``// Ищем все элементы с классом testimonial, он используется в качестве корневого для каждого блока с рейтингом``let elements = await page.$$('.testimonial');``// Создаём массив для результатов``let results = [];``// Перебираем массив найденных элементов``for (let element of elements) {``//Ищем значение рейтинга, в нашем случае это пиктограммы звёзд``let rate = await element.$$eval('span.rating > svg', elements => elements.map(el => el.innerHTML))``results.push({``// Собираем текст отзыва из элемента с классом text``"text": await element.$eval('.text', node => node.innerHTML),``// Считаем количество звёздочек``"rate" : rate.length``});``}``// Возвращаем массив``return results;``};``// Тут опишем логику главной функции - что и когда запускать``async function run(){``// Загружаем экземпляр headless-браузера через Puppeteer``const browser = await puppeteer.launch({``// Для наглядности отключаем headless-режим``headless: false,``// Игнорируем ошибки HTTPS``ignoreHTTPSErrors: true,``});``// Открываем новую вкладку``page = await browser.newPage();``// Переходим на целевую страницу``await page.goto('https://web-scraping.dev/testimonials/');``// Сначала выполняем все процедуры скроллинга (пока не упрёмся в лимит итераций или пока страница не перестанем менять свою высоту)``await scrollPageDown(page);``// Создаём массив с отзывами и наполняем его данными (парсим с Puppeteer)``reviews = await parseReviews(page);``// Закрываем браузер``await browser.close();``// Массив выводим в консоли``console.log(reviews);``};``run();`

 

После запуска скрипта парсинга Puppeteer, вывод в консоли будет примерно как на скрине ниже.

В нашем случае попытки прокрутки страниц закончились на 7 итерации.

![screen-1](https://blog.froxy.com/hs-fs/hubfs/blog/puppeteer-web-scraping-guide/screen-1.png?width=539&height=400&name=screen-1.png)

### Обход списка страниц при web-парсинге Puppeteer

Другая ситуация – обход списка страниц.

На тестовом целевом сайте страницы с перечнем товаров статичные, но присутствует деление на выборки по 10 элементов. Чтобы обойти эти списки напишем скрипт, который будет менять параметр пагинации и подставлять его в URL-адрес новой страницы.

Вот так будет выглядеть код нашего Puppeteer web-скрапера:

`const puppeteer = require("puppeteer");``// Подключаем библиотеку Puppeteer``// Сначала описываем логику парсинга конкретной страницы``async function parseProducts(page) {``// Ищем все блоки с описаниями продуктов, это div-элемент с классами "row" и "product"``let boxes = await page.$$('div.row.product');``// Создаём массив``let results = [];``// Перебираем элементы в цикле``for(let box of boxes) {``results.push({``// Заголовок товара прячется за тегом "a", но собрать нужно только текстовое содержимое``"title": await box.$eval('a', node => node.innerHTML),``// Ссылка на страницу товара. Тот же тег "a", но уже собираем значение атрибута Href``"link": await box.$eval('a', node => node.getAttribute('href')),``// Цена товара, вынесена в блок div с классом price``"price": await box.$eval('div.price', node => node.innerHTML)``})``}``return results;``}``// Тут описываем логику основной функции парсинга с Puppeteer``async function run(){``// Загружаем headless-браузер``const browser = await puppeteer.launch({``// Делаем его видимым (отключаем headless-режим)``headless: false,``// Игнорируем ошибки HTTPS``ignoreHTTPSErrors: true,``});``// Открываем новую страницу``page = await browser.newPage();``// Созадём массив``data = [];``// Пока количество страниц к перебору менее 5... (то есть не более 4)``for (let i=1; i < 5; i++) {``//Переходим на страницу с нужным номером пагинации, номер берём из итерации цикла (какой цикл, такой и номер)``await page.goto(`https://web-scraping.dev/products?page=${i}`)``// Наполняем массив с описаниями товаров (выполняем функцию парсинга)``products = await parseProducts(page)``// Дополняем массив с данными массивом из функции парсинга``data.push(...products);``}``// Выводим массив в консоль``console.log(data);``// Закрываем браузер``browser.close();``}``run();`

### Блокировка загрузки ненужного содержимого

![Блокировка загрузки ненужного содержимого](https://blog.froxy.com/hs-fs/hubfs/blog/puppeteer-web-scraping-guide/content-download.png?width=1548&height=408&name=content-download.png)

Чтобы сэкономить трафик и ускорить процесс загрузки страниц, вы можете отключить ненужный вам контент. Например, самый тяжёлый: изображения, видео, шрифты и т.п.

Блокировка осуществляется за счёт специальных констант:

`const blockResourceType = ['здесь', 'список', 'типов', 'ресурсов', 'например', 'image', 'font', 'и прочие',];``const blockResourceName = ['здесь', 'список', 'ресурсов', 'например', 'cdn.api.twitter', 'fontawesome', 'google-analytics', 'googletagmanager',];``// Тогда headless-браузер нужно дополнительно настроить с помощью флагов``const page = await browser.newPage();``// А вот так выглядит активация перехвата запросов``await page.setRequestInterception(true);``// В этом случае мы получаем возможность инспектирования каждого запроса браузера``// И тогда только мы настраиваем логику: какие запросы браузеру отправлять, а какие нет``page.on('request', request => {``const requestUrl = request._url.split('?')[0];``if (``// Если тип ресурса в списке блокируемых…``(request.resourceType() in blockedResourceType) ||``// Или если конкретный ресурс в списке блокируемых…``blockResourceName.some(resource => requestUrl.includes(resource))``) {``// Исходящий запрос сбрасывается``request.abort();``// В остальных случаях``} else {``// Всё проходит как обычно``request.continue();``}``});``}`

###### Поддержка экспертов

Наша команда поддержки поможет вам всегда оставаться онлайн и не останавливаться на достигнутом.

[Получить помощь](https://froxy.com/ru/contact-us)

## Работа скрипта веб-скрапинга Puppeteer через прокси

Тут всё максимально просто и понятно. Достаточно в качестве аргумента запуска браузера передать параметры прокси. Пример:

`// Открываем новый экземпляр headless-браузера``const browser = await puppeteer.launch({``args: [ '--proxy-server=http://123.456.123.456:8080' ]``});``// А далее остальной код.`

У такого подхода есть один минус – прокси прописывается на уровне всего браузера. Соответственно, чтобы пустить поток запросов через другой прокси-сервер, вам нужно открыть ещё один экземпляр браузера.

Существуют разные скрипты принудительной ротации прокси на уровне страниц и запросов, в том числе расширение proxy-chain для NodeJS.

Но мы рекомендуем более грамотное решение – использовать ротируемые прокси. Например, вы можете арендовать ротируемые [мобильные](https://froxy.com/ru/mobile-proxies), [резидентные](https://froxy.com/ru/residential-proxies) и [серверные прокси](https://froxy.com/ru/datacenter-proxies) у нас.

Тогда за ротацию прокси будет отвечать наш сервис. [Backconnect-прокси](https://blog.froxy.com/ru/backconnect-proxies-advantages-and-disadvantages?hsLang=ru) подключатся к парсеру всего один раз. А в личном кабинете остаётся только определить логику ротации выходных IP-адресов: по времени или при каждом новом запросе.

Такой подход существенно снизит вероятность блокировки парсера и упростит процесс его написания.

Больше деталей в нашем отдельном материале о том, [как парсить без блокировок](https://blog.froxy.com/ru/the-essential-guide-to-successful-web-scraping?hsLang=ru).

## Другие рекомендации

Максимально краткие советы:

- Нужно следить за указанием [user-агента](https://blog.froxy.com/ru/what-are-user-agents-for-web-scraping?hsLang=ru), набором кук и другими параметрами [цифровых отпечатков](https://blog.froxy.com/ru/fingerprinting-and-web-scraping-connection?hsLang=ru) (разрешение экрана, поддерживаемые web-технологии, набор шрифтов в операционной системе и пр.).
- Важно стараться эмулировать поведение пользователей.
- Не стоит отправлять запросы через равные промежутки времени.

**Из специфических рекомендаций для web-скрапинга Puppeteer:**

- Различные скрипты на web-серверах могут определять headless-браузер c Puppeteer на основе специальных атрибутов, которые передаются в HTTP-запросах (заголовках). Чтобы этого избежать, нужно дополнительно скрывать эти параметры. Делается это с помощью профильных плагинов, таких как [puppeteer-stealth](https://scrapfly.io/blog/how-to-use-puppeteer-stealth-what-does-it-do/).

## Заключение

![Puppeteer скрапинг](https://blog.froxy.com/hs-fs/hubfs/blog/puppeteer-web-scraping-guide/conclusion.png?width=1548&height=634&name=conclusion.png)

Puppeteer – это действительно классный инструмент для написания своих скриптов автоматизации тестирования и для создания полнофункциональных парсеров сайтов. Под капотом есть всё необходимое для эмулирования поведения пользователей, для перехвата HTTP-запросов и блокирования ненужных ресурсов, для синтаксического анализа HTML-контента и даже для работы через прокси.

Но есть и нюансы – поддерживается только один язык программирования (JavaScript) и есть ограничения по привязке прокси к экземплярам браузеров.

Чтобы обеспечить максимальный комфорт парсинга без [блокировок](https://blog.froxy.com/ru/what-to-do-if-your-ip-was-blocked?hsLang=ru) и оперативное масштабирование нужны специальные ротируемые прокси. А качественные [мобильные](https://blog.froxy.com/ru/how-mobile-proxies-work-and-how-to-use-them?hsLang=ru) и [резидентные прокси](https://blog.froxy.com/ru/residential-proxies-special-features-and-advantages?hsLang=ru) с ротацией – это **Froxy**. Более 10 млн. IP в сети, ротация по времени и при каждом новом запросе.

###### Резидентные Прокси

Получите доступ к глобальной прокси-сети и собирайте данные, не подвергаясь блокировке.

[Выбрать прокси](https://froxy.com/ru/residential-proxies) $1.99, 100Mb

### Получайте уведомления о новых функциях и обновлениях Froxy

Узнайте первыми о новых функциях Froxy, чтобы оставаться в курсе событий происходящих на рынке цифровых технологий и получать новости о новых функциях Froxy.

## Статьи по Теме

![Получение данных с IMDb: кейс по веб-скрапингу](https://blog.froxy.com/hubfs/blog/scrape-data-from-imdb/scrape-imdb.png)

Кейсы

### Получение данных с IMDb: кейс по веб-скрапингу

Узнайте, как извлечь данные с IMDb с помощью методов веб-скрапинга. Исследуйте инструменты, подходы и лучшие практики для эффективного сбора данных с...

Команда Froxy 21 апр. 2025 7 мин 

<https://blog.froxy.com/ru/scrape-data-from-imdb?hsLang=ru>

![Как парсить с Beautiful Soup: гайд для начинающих](https://blog.froxy.com/hubfs/blog/scrape-with-beautiful-soup/scrape-with-beautiful-soup.png)

Парсинг

### Как парсить с Beautiful Soup: гайд для начинающих

Узнайте, как эффективно собирать данные с помощью Beautiful Soup. Это пошаговое руководство включает установку, ключевые функции и примеры для начала...

Команда Froxy 4 февр. 2025 9 мин 

<https://blog.froxy.com/ru/scrape-with-beautiful-soup?hsLang=ru>

Лучшие резидентные и мобильные прокси в своем классе

<https://t.me/+wVO9fgNQk7M1ZDA6> [mailto:support@froxy.com](mailto:support@froxy.com) 

[![TrustPilot](https://blog.froxy.com/hs-fs/hubfs/trustpilot-2.png?height=22&name=trustpilot-2.png) ![4.7](https://cdn.trustpilot.net/brand-assets/4.1.0/stars/stars-4.5.svg) 4.7](https://www.trustpilot.com/review/froxy.com)

Продукты [Резидентные прокси](https://froxy.com/ru/residential-proxies) [Мобильные прокси](https://froxy.com/ru/mobile-proxies) [Серверные прокси](https://froxy.com/ru/datacenter-proxies)

Кейсы [Мониторинг цен](https://froxy.com/ru/use-cases/price-monitoring) [Маркетинг](https://froxy.com/ru/use-cases/market-research) [Социальные тренды](https://froxy.com/ru/use-cases/social-listening) [Сбор данных](https://froxy.com/ru/use-cases/web-scraping) [SEO Мониторинг](https://froxy.com/ru/use-cases/seo-monitoring)

Компания [Цены](https://froxy.com/ru/get-started) [О нас](https://froxy.com/ru/about) [Отдел продаж](https://froxy.com/ru/contact-us) [Поддержка](https://froxy.com/ru/contact-us)

Ресурсы [Интеграции](https://froxy.com/ru/integrations) [Локации](https://froxy.com/ru/locations) [Партнерство](https://froxy.com/ru/referral-system) [Помощь](https://help.froxy.com/ru?hsLang=ru) [Способы оплаты](https://froxy.com/ru/payment-methods)

Copyright © 2021 – 2026. Wergames OÜ. All rights reserved. Harju maakond, Tallinn, Kesklinna linnaosa, Endla tn 4, 10142

[Terms of Use](https://froxy.com/ru/terms-of-use) [Privacy Policy](https://froxy.com/ru/privacy-policy) [Cookie Policy](https://froxy.com/ru/cookie-policy) [Refund & Cancellation Policy](https://froxy.com/ru/refund-policy) [SLA](https://froxy.com/ru/service-level-agreement)