Как парсить сайты с помощью Node.js и Puppeteer

Короткий ответ: установите 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. Для соседних задач пригодятся эти разборы:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x