---
title: "Cheerio vs Puppeteer: что выбрать для парсинга сайтов"
description: "Сравниваем Cheerio и Puppeteer: реальный тест скорости, примеры кода, настройка прокси и когда стоит использовать обе библиотеки Node.js вместе."
---

[Блог Froxy | Новости, полезные статьи о использовании прокси](https://blog.froxy.com/ru)

# [Cheerio vs Puppeteer: что выбрать для парсинга сайтов](https://blog.froxy.com/ru/cheerio-vs-puppeteer)

 Written by [Команда Froxy](https://blog.froxy.com/ru/author/team-froxy) | 30 сент. 2026 г., 03:00:00

И библиотека Cheerio, и библиотека Puppeteer предназначены для использования в среде Node.js (этот бэкенд написан на JavaScript и может запускаться практически в любых современных операционных системах, в том числе на серверах и внутри виртуальных контейнеров). Однако сравнение Cheerio и Puppeteer чем-то напоминает ситуацию поиска сходств и различий между тёплым и мягким.

Обе библиотеки предназначены для парсинга сайтов, но работают принципиально по-разному: Cheerio обрабатывает только HTML-содержимое и не умеет рендерить страницы динамических сайтов, а Puppeteer позволяет управлять [безголовыми браузерами](https://blog.froxy.com/ru/headless-browser-what-is-it-and-how-to-use-it-for-scraping?hsLang=ru) Google Chrome или Mozilla Firefox с помощью специальных протоколов (CDP или BiDi).

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

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

## Что такое Cheerio

Cheerio — это решение для обхода DOM-структуры результирующей страницы с HTML-разметкой. То есть на вход он принимает HTML-код, а на выходе позволяет обращаться к конкретным элементам и извлекать их содержимое.

Библиотека во многом работает так же, как синтаксический анализатор [Beautiful Soup](https://blog.froxy.com/ru/scrape-with-beautiful-soup?hsLang=ru) для Python. Только синтаксис Cheerio ближе к синтаксису jQuery. Тем, кто знаком с этим фреймворком, будет проще сориентироваться в алгоритмах поиска элементов.

При этом полноценный парсер на Cheerio не построить без дополнительных компонентов, так как Cheerio не умеет обращаться к сайтам напрямую и не может рендерить страницы.

Для обхода этого ограничения чаще всего используются связки:

- HTTP-клиент [Fetch](https://blog.froxy.com/ru/node-fetch-proxy?hsLang=ru) или Axios + Cheerio.
- Веб-драйвер [Playwright](https://blog.froxy.com/ru/web-scraping-with-playwright?hsLang=ru) или Puppeteer + Cheerio.

Технически у Cheerio есть метод .fromURL(url, options?): Promise\<CheerioAPI\>.

Поэтому при особом желании вы сможете получить HTML или XML-документы напрямую, по URL-адресам. Даже поддерживается HTTPS-подключение (через undici). Можно поменять строку user-agent и другие HTTP-заголовки.

Но встроенный HTTP-клиент не сможет заменить работу полноценного браузера и имеет массу технических ограничений: работает только с HTML и XML-ответами (жёсткий фильтр на Content-Type), не умеет загружать содержимое более 500 МБ, обрабатывает не более 5 редиректов и т.п. JavaScript на странице не выполняется.

Ключевые фичи Cheerio — это скорость отработки, простота синтаксиса и гибкость применения.

Команда для установки:

```
npm install cheerio
```

Подключение библиотеки к своему скрипту парсинга:

```
import * as cheerio from 'cheerio';
```

или

```
const cheerio = require('cheerio');
```

Допустим, что целевой HTML-код выглядит следующим образом:

```
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Моя первая страница</title>
</head>
<body>
<h2 class="main-title">Список моих любимых занятий</h2>
<ul id="hobby-list">
<li class="my-class-for-list-elements">Чтение книг</li>
<li class="my-class-for-list-elements">Программирование</li>
<li class="my-class-for-list-elements">Путешествия</li>
<li class="my-class-for-list-elements">Спорт</li>
<li class="my-class-for-list-elements">Музыка</li>
</ul>
</body>
</html>
```

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

```
const $ = cheerio.load('СЮДА ПОМЕЩАЕТСЯ HTML-КОД');
// Извлекаем элемент Title
const title = $('title').text();
// Извлекаем элемент H2
const h2 = $('h2.main-title').text();
// Второй элемент списка
const secondItem = $('li').eq(1).text();
```

Все элементы списка:

```
const { listLi } = $.extract({ listLi: ['.my-class-for-list-elements'] });
```

**Общий итог для лучшего понимания:**

Cheerio — это инструмент для быстрого и удобного извлечения данных из HTML.

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

Идеальные прокси для доступа к ценным данным со всего мира.

[Попробовать](https://froxy.com/ru/residential-proxies) $1.99, 100 МБ

## Что такое Puppeteer

Puppeteer — это библиотека, которая обеспечивает возможность управления безголовыми браузерами: для Chrome и Chromium — по протоколу Chrome DevTools Protocol (CDP), а для Firefox — по протоколу WebDriver BiDi. В наличии также поддержка WebMCP API.

Читайте полный обзор [веб-парсинга с Puppeteer](https://blog.froxy.com/ru/puppeteer-web-scraping-guide?hsLang=ru).

То есть основная задача применения Puppeteer — автоматизация браузера. Вообще библиотека изначально задумывалась для демонстрации возможностей протокола CDP.

Исходя из этого уже можно понять, что библиотека поддерживает не только команды запуска или остановки экземпляров браузера, но и все команды управления действиями пользователя: ввод с клавиатуры, перемещение курсора, прокрутка страниц и т.п. Есть в том числе и поиск по элементам DOM-структуры — уже по результирующему HTML-коду (после рендеринга или в процессе).

По этой причине установка и настройка Puppeteer заметно сложнее. А набор возможностей — шире, чем у Cheerio.

Так как Puppeteer напрямую связан с браузером, он обеспечивает работу с любым web-содержимым: PDF, скриншоты и изображения, видео, XML, документы и пр. Поддерживается в том числе рендеринг JavaScript и любых web-приложений.

Установка:

```
npm install puppeteer
```

Если не нужна автоматическая установка headless-браузеров, то можно установить пакет puppeteer-core.

Подключение к своим скриптам:

```
import puppeteer from 'puppeteer';
```

или

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

Пример запуска сайта и поиска на нём отдельных элементов вёрстки:

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

(async () => {
  // Запускаем браузер
  const browser = await puppeteer.launch({
    headless: true
  });

  // Открываем новую вкладку
  const page = await browser.newPage();

  // Переходим на сайт
  await page.goto('https://quotes.toscrape.com/');

  // 1. Получаем <title>
  const title = await page.title();
  console.log('Title:', title);

  // 2. Ищем элемент по связке "тег + CSS-класс"
  const firstQuote = await page.$eval(
    'span.text',
    element => element.textContent.trim()
  );
  console.log('Первая цитата:', firstQuote);

  // 3. Получаем второй элемент
  const secondQuote = await page.$eval(
    'span.text:nth-of-type(2)',
    element => element.textContent.trim()
  );
  console.log('Вторая цитата:', secondQuote);

  // 4. Получаем список всех элементов
  const quotes = await page.$$eval(
    'span.text',
    elements => elements.map(element => element.textContent.trim())
  );
  console.log('Все цитаты:', quotes);

  // 5. Получаем элементы с определённым атрибутом
  const links = await page.$$eval(
    'a[href]',
    elements => elements.map(element => ({
      text: element.textContent.trim(),
      href: element.getAttribute('href')
    }))
  );
  console.log('Ссылки:', links);

  // Закрываем браузер
  await browser.close();
})();
```

Можно заметить, что код для работы с Puppeteer заметно сложнее. Это связано с тем, что вам нужно:

- Задать параметры настройки браузера.
- Запустить новый экземпляр браузера и открыть новую вкладку.
- Обратиться к конкретному сайту и дождаться его загрузки.
- Только после этого можно работать с HTML-кодом страницы.

Puppeteer поддерживает прямую работу с JavaScript и с HTML, а также позволяет выгружать результирующий код в другие потоки и библиотеки. Например, вы можете передать итоговый HTML-код на обработку в Cheerio.

## Ключевые различия Cheerio vs Puppeteer и сравнительная таблица

На всякий случай напомним: мы сравниваем Cheerio — парсер разметки — и Puppeteer — инструмент автоматизации браузера. Отсюда и вытекают все их основные отличия.

| **Критерий** | **Cheerio** | **Puppeteer** |
| --- | --- | --- |
| Тип инструмента | Профильный HTML/XML-парсер | Веб-драйвер для автоматизации headless-браузеров |
| Выполнение JavaScript + динамика (SPA, infinite scroll и т.п.) | Нет | Да |
| Взаимодействие со страницей (клики, заполнение форм, логин) | Нет | Да |
| Скорость | Очень высокая | Медленнее (из-за необходимости запуска браузера) |
| Ресурсы (CPU/RAM) | Низкие | Высокие |
| Доп. возможности | Прямые HTTP/HTTPS-запросы (без функций браузера) | Скриншоты, PDF, эмуляция устройств и поведения пользователя |
| Идеальный сценарий применения | Разбор готового HTML-кода, работа с XML, парсинг статичных сайтов (без систем защиты от ботов) | Работа со сложными динамическими сайтами и веб-приложениями, парсинг содержимого после авторизации в личных кабинетах и т.п. |

В общем, Cheerio будет интересен только для парсинга простых статичных сайтов или XML-документов (при работе по API). А Puppeteer — это «тяжёлая артиллерия» для работы со сложными динамическими сайтами, которые меняют или отдают своё содержимое в виде JavaScript, а также защищены сложными алгоритмами борьбы с ботами: [веб-файрволы](https://blog.froxy.com/ru/how-to-ethically-bypass-waf?hsLang=ru), [капча](https://blog.froxy.com/ru/how-to-bypass-captcha?hsLang=ru), CSRF-токены и т.п.

Несмотря на то что Puppeteer имеет аналог встроенного парсера HTML, синтаксис у него достаточно тяжёлый. Поэтому никто не запрещает вам пользоваться двумя инструментами одновременно: за получение результирующего HTML будет отвечать Puppeteer, а за его разбор — Cheerio.

## Производительность и простота

Так как Cheerio не запускает браузер, эта библиотека работает в разы быстрее, чем Puppeteer. Поэтому сравнивать их производительность просто бессмысленно — Cheerio всегда будет быстрее.

Однако, чтобы сравнение Cheerio vs Puppeteer было максимально предметным, мы провели реальное тестирование. Для исключения искажений из-за особенностей архитектуры, а также из-за разного класса сайтов, мы обращались к одному и тому же статичному ресурсу.

Итак, для интереса (понимания проблемы) мы отправляли запросы к сайту [https://quotes.toscrape.com/](https://quotes.toscrape.com/) (главная страница). Обработка заняла:

- Запрос к сайту и разбор ответа у Cheerio — 914–1158 мс.
- А у Puppeteer — 1963–2351 мс.

Замеры делали через performance.now().

Разница почти в 2 раза — Cheerio быстрее. Что и требовалось доказать.

Вы должны понимать, что на скорость отработки скрипта влияет множество факторов: интернет-канал, аппаратные возможности ПК, архитектура, доступность и скорость ответа целевого сайта и т.п.

Например, если бы мы обращались к динамическому сайту, то Cheerio мог бы вообще не получить валидного HTML-кода, а Puppeteer мог бы дожидаться полной прогрузки страницы от 20 до 60 секунд.

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

## Почему одной библиотеки мало в проде

Ни Cheerio, ни Puppeteer не создавались для скрейпинга. Поэтому в них нет механизмов ротации IP, обхода CAPTCHA, интерфейса для быстрого подключения прокси и т.п.

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

Базовые возможности библиотек слабые:

- Для Cheerio при работе через функцию fromURL можно задать свои параметры User-agent и некоторые другие HTTP-заголовки (примерно как у простейших [HTTP-клиентов для Python](https://blog.froxy.com/ru/python-http-clients-for-web-scraping?hsLang=ru)).
- Puppeteer поддерживает переменные окружения HTTP\_PROXY и HTTPS\_PROXY. Плюс на уровне конфигов можно переопределить User-agent и любые другие параметры цифровых отпечатков. Но гибкого механизма ротации прокси всё равно нет. Логику нужно описывать вручную или задействовать дополнительные решения для ротации.

## Как масштабировать парсинг без банов с помощью прокси?

Итак, прокси крайне необходимы. Как только парсер начинает отправлять много запросов с вашего IP-адреса, повышается риск блокировки. Работа через прокси и оперативная ротация выходных IP-адресов снижает риски бана, помогает сбалансировать или распределить нагрузку, а также скрыть ваш реальный адрес.

О типах прокси мы рассказывали ранее:

- [Резидентные прокси](https://blog.froxy.com/ru/how-do-residential-proxies-work?hsLang=ru) (их плюсы и минусы).
- [Мобильные прокси](https://blog.froxy.com/ru/how-mobile-proxies-work-and-how-to-use-them?hsLang=ru) (их плюсы и минусы).
- [Датацентровые прокси](https://blog.froxy.com/ru/datacenter-proxies?hsLang=ru) (их плюсы и минусы).

Для бизнес-задач лучше всего подходят ротируемые резидентные или мобильные прокси.

### Как организовать работу через прокси для Cheerio

Cheerio не предоставляет отдельного API для прокси, поэтому для проброса альтернативных IP нужно задействовать функциональность любого доступного HTTP-клиента внутри Node.js, например, undici. В этом случае параметры HTTP-запроса можно передать через requestOptions:

```
const cheerio = require('cheerio');
const { ProxyAgent } = require('undici');

(async () => {
  const proxyAgent = new ProxyAgent('http://127.0.0.1:8080');

  const $ = await cheerio.fromURL('https://example.com', {
    requestOptions: {
      dispatcher: proxyAgent
    }
  });

  console.log($('title').text());

  await proxyAgent.close();
})();
```

Прокси с авторизацией подключаются через ProxyAgent:

```
const proxyAgent = new ProxyAgent(
  'http://username:password@127.0.0.1:8080'
);
```

Вместо undici можно использовать другие HTTP-клиенты: Fetch, Axios и пр.

### Как подключить Puppeteer через прокси

В Puppeteer прокси задаётся при запуске экземпляра браузера Chromium через параметр --proxy-server. Если нужно определение прокси на уровне вкладки, то тогда уже нужно устанавливать дополнительные расширения (внутри браузера) или задействовать дополнительные библиотеки.

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

(async () => {
  const browser = await puppeteer.launch({
    headless: true,
    args: [
      '--proxy-server=http://127.0.0.1:8080'
    ]
  });

  const page = await browser.newPage();
  await page.goto('https://example.com');

  console.log(await page.title());

  await browser.close();
})();
```

Для прокси с авторизацией Puppeteer позволяет передать логин и пароль отдельно:

```
await page.authenticate({
  username: 'username',
  password: 'password'
});
```

### Что важно помнить при парсинге, чтобы не получать баны

1. Ротация IP — самое важное. Её можно привязывать к сессиям, ко времени или к каждому новому запросу. Стратегия ротации будет зависеть от сложности защиты целевого сайта.
2. Соблюдение правил, прописанных в пользовательском соглашении и в директивах robots.txt. [Про легальность парсинга](https://blog.froxy.com/ru/how-to-make-your-web-scraping-script-legal?hsLang=ru).
3. Правильное указание user-agent и HTTP-заголовков.
4. Качественные цифровые отпечатки — это ваши браузерные профили (наборы шрифтов, установленных расширений, куки ранее посещённых сайтов, разрешение экрана и пр.).
5. Обработка капчи и WAF.
6. Скрытие фактов использования популярных headless-браузеров или HTTP-клиентов.
7. Обработка токенов и ловушек.
8. Качественная имитация поведения пользователя — естественные задержки, скроллинг, перемещение указателя мыши и т.п.

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

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

Cheerio — это максимальная скорость и простота синтаксиса, но эта библиотека может работать только со статичным HTML-кодом.

Puppeteer — это инструмент для автоматизации браузера, поэтому библиотека обеспечивает работу с динамическими сайтами и может имитировать поведение пользователей.

Лучше всего себя показывает не одно конкретное решение, а их связка, где Puppeteer отвечает за получение результирующего кода (например, если страница требует обязательного рендеринга), а Cheerio — за извлечение данных из HTML.

## FAQ

### Можно ли использовать Cheerio и Puppeteer вместе?

Можно! А иногда даже нужно, особенно если у вас вызывает трудности встроенный синтаксис обращения к элементам DOM-структуры в DevTools Protocol (Puppeteer). Синтаксис Cheerio намного проще и логичнее. А ещё он многим будет знаком — тем, кто уже имел опыт работы с jQuery.

### Что быстрее — Cheerio или Puppeteer?

Однозначно Cheerio. Но скорость может быть не главной, ведь Cheerio не умеет работать с динамическими страницами. Только со статикой и без обхода механизмов защиты.

### Может ли Cheerio скрейпить JS-сайты?

Нет. Для рендеринга таких страниц вам потребуется Puppeteer или любые другие библиотеки, работающие с headless-браузерами.

### Обязательно ли нужны прокси для Cheerio / Puppeteer?

Для разовых точечных задач парсинга можно обойтись без прокси. Если у вас масштабный парсинг — без прокси никак не обойтись. Чем больше запросов вы будете отправлять к целевому сайту, тем чаще будут блокировать ваш IP.

### Puppeteer или Playwright?

Тут уже скорее вопрос привычки и личных предпочтений. Puppeteer изначально написан для среды Node.js, но и у Playwright есть вариант поставки для этой среды. Puppeteer когда-то поддерживал управление только браузером Google Chrome, но сейчас список поддержки расширился (благодаря протоколу BiDi). Поэтому для более продуманного выбора нужно углубляться в детали настроек и имеющихся функций.

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

### Заменяет ли Cheerio jQuery?

Очень хороший вопрос. Если вы получаете HTML-код и исполняете его в браузере, то вы можете принудительно подключать к страницам файлы jQuery, а затем применять нужный вам синтаксис для поиска элементов вёрстки. Cheerio позволяет парсить HTML без дополнительных «костылей» и без запуска браузера. Так что да, он заменяет jQuery.

[View full post](https://blog.froxy.com/ru/cheerio-vs-puppeteer)

```json
{
  "@context" : "http://schema.org",
  "@type" : "BlogPosting",
  "author" : {
    "@type" : "Person",
    "name" : "Команда Froxy"
  },
  "dateModified" : "2026-09-30T03:00:00.471Z",
  "datePublished" : "2026-09-30T03:00:00Z",
  "headline" : "Cheerio vs Puppeteer: скорость, возможности и когда их совмещать",
  "image" : {
    "@type" : "ImageObject",
    "height" : 1104,
    "url" : "https://25353777.fs1.hubspotusercontent-eu1.net/hubfs/25353777/blog/cheerio-vs-puppeteer/cheerio-vs-puppeteer.png",
    "width" : 2208
  },
  "mainEntityOfPage" : "https://blog.froxy.com/ru/cheerio-vs-puppeteer",
  "publisher" : {
    "@type" : "Organization",
    "logo" : {
      "@type" : "ImageObject",
      "height" : 60.0,
      "url" : "https://25353777.fs1.hubspotusercontent-eu1.net/hubfs/25353777/top-bar-logo.svg",
      "width" : 154.2857
    },
    "name" : "Блог Froxy | Новости, полезные статьи о использовании прокси "
  }
}
```