Короткий ответ: установите Puppeteer, запустите браузер из Node.js, откройте страницу через page.goto(), дождитесь нужного селектора и извлеките данные через page.evaluate(). Puppeteer особенно полезен там, где страница собирается JavaScript-ом и простой HTTP-запрос не видит готовый контент
Запрос «как парсить сайты с помощью node js и puppeteer» обычно задают, когда обычный fetch или axios возвращает пустую страницу, а в браузере данные видны. Причина часто в том, что сайт дорисовывает контент на клиенте, и нужен настоящий браузерный контекст
Установите Puppeteer
Создайте проект
mkdir puppeteer-parser-demo
cd puppeteer-parser-demo
npm init -y
npm install puppeteer
Puppeteer может скачать браузер при установке, поэтому пакет весит больше обычной библиотеки. Это нормально
Минимальный пример
Создайте parser.js
const puppeteer = require("puppeteer");
async function main() {
const browser = await puppeteer.launch({
headless: true
});
const page = await browser.newPage();
await page.goto("https://example.com", {
waitUntil: "domcontentloaded"
});
const title = await page.$eval("h1", (element) => element.textContent.trim());
console.log(title);
await browser.close();
}
main().catch((error) => {
console.error("Ошибка парсинга");
console.error(error);
});
Запустите
node parser.js
Ожидаемый вывод
Example Domain
Как получить список ссылок
const links = await page.$$eval("a", (items) => {
return items.map((item) => ({
text: item.textContent.trim(),
href: item.href
}));
});
console.log(links);
$$eval берет все элементы по селектору и выполняет функцию внутри страницы. Это важно: код внутри page.evaluate и $eval работает в браузерном окружении, а не в обычном Node.js
Как дождаться элемента
Если сайт грузит данные не сразу, дождитесь селектора
await page.waitForSelector(".product-card");
После этого можно собирать карточки
const products = await page.$$eval(".product-card", (cards) => {
return cards.map((card) => ({
title: card.querySelector(".title")?.textContent.trim(),
price: card.querySelector(".price")?.textContent.trim()
}));
});
Знаки ?. помогают не уронить весь парсер, если внутри карточки нет ожидаемого элемента
Когда Puppeteer не нужен
Если данные есть в HTML сразу, проще использовать обычный HTTP-запрос и HTML-парсер. Puppeteer тяжелее: он запускает браузер, потребляет больше памяти и работает медленнее. Его имеет смысл брать, когда нужна авторизация, клики, ожидание JavaScript, скриншоты или сложная страница
Этика и ограничения
Перед парсингом проверьте правила сайта, нагрузку и ограничения доступа. Не запускайте агрессивный парсер с сотнями параллельных страниц. Для учебной практики используйте безопасные тестовые страницы или собственные проекты
Пауза между запросами и понятный user-agent часто важнее, чем попытка “выжать максимум скорости”
Мини-практика
Откройте https://example.com, заберите h1 и ссылку. Затем замените адрес на свою тестовую страницу или локальный Express-сайт и соберите все заголовки h1, h2, a
Так вы потренируете базовую схему: открыть страницу, дождаться DOM, выбрать элементы, вывести результат
Частые ошибки
Timeout при ожидании селектора Селектор неправильный или элемент появляется позже. Проверьте страницу в браузере и увеличьте ожидание только после проверки селектора
В page.evaluate не видны переменные Node.js Функция внутри page.evaluate выполняется в браузере. Передавайте данные параметрами, если они нужны внутри
Puppeteer не запускается на сервере На Linux-серверах могут не хватать системных зависимостей браузера. Проверяйте требования окружения
Парсер работает локально, но сайт блокирует запросы Сайт может ограничивать автоматизированный доступ. Уважайте правила ресурса и не обходите запреты
Что почитать дальше по Node.js
Если нужен общий маршрут по теме, откройте рубрику Node.js. Для соседних задач пригодятся эти разборы:
- Node.js + MongoDB: первая коллекция из приложения
- Node.js + MySQL: REST API для первых данных
- Node.js LTS: какую версию ставить новичку
- Node.js выводит странные имена файлов: как исправить кодировку и пути



