И библиотека Cheerio, и библиотека Puppeteer предназначены для использования в среде Node.js (этот бэкенд написан на JavaScript и может запускаться практически в любых современных операционных системах, в том числе на серверах и внутри виртуальных контейнеров). Однако сравнение Cheerio и Puppeteer чем-то напоминает ситуацию поиска сходств и различий между тёплым и мягким.
Обе библиотеки предназначены для парсинга сайтов, но работают принципиально по-разному: Cheerio обрабатывает только HTML-содержимое и не умеет рендерить страницы динамических сайтов, а Puppeteer позволяет управлять безголовыми браузерами Google Chrome или Mozilla Firefox с помощью специальных протоколов (CDP или BiDi).
В связи с этим выбор конкретного решения должен опираться на исходные условия задачи парсинга: с какими типами сайтов вам нужно работать, какую производительность нужно получить, какие возможности по извлечению содержимого вам нужны, как организовать работу через прокси и т.п.
Ниже разберёмся в деталях и сравним Cheerio vs Puppeteer: что это за библиотеки и в каких ситуациях они показывают максимальную эффективность, как организовать работу с каждой, в чём их отличия и особенности.
Что такое Cheerio
Cheerio — это решение для обхода DOM-структуры результирующей страницы с HTML-разметкой. То есть на вход он принимает HTML-код, а на выходе позволяет обращаться к конкретным элементам и извлекать их содержимое.
Библиотека во многом работает так же, как синтаксический анализатор Beautiful Soup для Python. Только синтаксис Cheerio ближе к синтаксису jQuery. Тем, кто знаком с этим фреймворком, будет проще сориентироваться в алгоритмах поиска элементов.
При этом полноценный парсер на Cheerio не построить без дополнительных компонентов, так как Cheerio не умеет обращаться к сайтам напрямую и не может рендерить страницы.
Для обхода этого ограничения чаще всего используются связки:
- HTTP-клиент Fetch или Axios + Cheerio.
- Веб-драйвер Playwright или 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.
Резидентные прокси
Идеальные прокси для доступа к ценным данным со всего мира.
Что такое Puppeteer
Puppeteer — это библиотека, которая обеспечивает возможность управления безголовыми браузерами: для Chrome и Chromium — по протоколу Chrome DevTools Protocol (CDP), а для Firefox — по протоколу WebDriver BiDi. В наличии также поддержка WebMCP API.
Читайте полный обзор веб-парсинга с Puppeteer.
То есть основная задача применения 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, а также защищены сложными алгоритмами борьбы с ботами: веб-файрволы, капча, CSRF-токены и т.п.
Несмотря на то что Puppeteer имеет аналог встроенного парсера HTML, синтаксис у него достаточно тяжёлый. Поэтому никто не запрещает вам пользоваться двумя инструментами одновременно: за получение результирующего HTML будет отвечать Puppeteer, а за его разбор — Cheerio.
Производительность и простота
Так как Cheerio не запускает браузер, эта библиотека работает в разы быстрее, чем Puppeteer. Поэтому сравнивать их производительность просто бессмысленно — Cheerio всегда будет быстрее.
Однако, чтобы сравнение Cheerio vs Puppeteer было максимально предметным, мы провели реальное тестирование. Для исключения искажений из-за особенностей архитектуры, а также из-за разного класса сайтов, мы обращались к одному и тому же статичному ресурсу.
Итак, для интереса (понимания проблемы) мы отправляли запросы к сайту 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-агента и пр.
Базовые возможности библиотек слабые:
- Для Cheerio при работе через функцию fromURL можно задать свои параметры User-agent и некоторые другие HTTP-заголовки (примерно как у простейших HTTP-клиентов для Python).
- Puppeteer поддерживает переменные окружения HTTP_PROXY и HTTPS_PROXY. Плюс на уровне конфигов можно переопределить User-agent и любые другие параметры цифровых отпечатков. Но гибкого механизма ротации прокси всё равно нет. Логику нужно описывать вручную или задействовать дополнительные решения для ротации.
Как масштабировать парсинг без банов с помощью прокси?

Итак, прокси крайне необходимы. Как только парсер начинает отправлять много запросов с вашего IP-адреса, повышается риск блокировки. Работа через прокси и оперативная ротация выходных IP-адресов снижает риски бана, помогает сбалансировать или распределить нагрузку, а также скрыть ваш реальный адрес.
О типах прокси мы рассказывали ранее:
- Резидентные прокси (их плюсы и минусы).
- Мобильные прокси (их плюсы и минусы).
- Датацентровые прокси (их плюсы и минусы).
Для бизнес-задач лучше всего подходят ротируемые резидентные или мобильные прокси.
Как организовать работу через прокси для 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'
});
Что важно помнить при парсинге, чтобы не получать баны
- Ротация IP — самое важное. Её можно привязывать к сессиям, ко времени или к каждому новому запросу. Стратегия ротации будет зависеть от сложности защиты целевого сайта.
- Соблюдение правил, прописанных в пользовательском соглашении и в директивах robots.txt. Про легальность парсинга.
- Правильное указание user-agent и HTTP-заголовков.
- Качественные цифровые отпечатки — это ваши браузерные профили (наборы шрифтов, установленных расширений, куки ранее посещённых сайтов, разрешение экрана и пр.).
- Обработка капчи и WAF.
- Скрытие фактов использования популярных headless-браузеров или HTTP-клиентов.
- Обработка токенов и ловушек.
- Качественная имитация поведения пользователя — естественные задержки, скроллинг, перемещение указателя мыши и т.п.
Подробности: Гайд по успешному парсингу без блокировок.
Заключение
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.
Заменяет ли Cheerio jQuery?
Очень хороший вопрос. Если вы получаете HTML-код и исполняете его в браузере, то вы можете принудительно подключать к страницам файлы jQuery, а затем применять нужный вам синтаксис для поиска элементов вёрстки. Cheerio позволяет парсить HTML без дополнительных «костылей» и без запуска браузера. Так что да, он заменяет jQuery.

