Парсинг HTML в Node.js: ТОП библиотек и примеры кода

Онлайн-тренажер Python для начинающих

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

Начать курс

Парсинг HTML в JavaScript (Node.js): Полное руководство

Парсинг HTML — одна из ключевых задач при разработке парсеров (web scraper'ов) и автоматизации сбора данных. В экосистеме Node.js существует несколько мощных библиотек, позволяющих извлекать информацию из HTML-документов. В этой статье мы разберем три основных инструмента: Cheerio, JSDOM и Puppeteer, сравним их возможности и приведем практические примеры кода.

1. Cheerio — легковесный jQuery для сервера

Cheerio — самая популярная библиотека для парсинга HTML в Node.js. Она реализует синтаксис jQuery, но работает без браузерного окружения, что делает её быстрой и экономичной по памяти. Cheerio отлично подходит для статических HTML-страниц, где не требуется выполнение JavaScript.

Установка

npm install cheerio

Пример использования

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

async function parsePage(url) {
    const response = await axios.get(url);
    const $ = cheerio.load(response.data);

    // Извлекаем заголовок страницы
    const title = $('h1').text().trim();

    // Собираем все ссылки
    const links = [];
    $('a').each((i, el) => {
        const href = $(el).attr('href');
        if (href) links.push(href);
    });

    return { title, links };
}

// Использование
parsePage('https://example.com').then(data => console.log(data));

Когда выбирать Cheerio:

  • Статические страницы без динамического контента
  • Высокие требования к производительности
  • Простой синтаксис jQuery
  • Нет необходимости в рендеринге JavaScript

2. JSDOM — полноценная DOM-реализация

JSDOM эмулирует браузерное окружение, создавая полноценную DOM-модель. В отличие от Cheerio, JSDOM поддерживает выполнение JavaScript, что позволяет парсить страницы, контент которых генерируется скриптами. Однако это плата за функциональность — библиотека потребляет больше ресурсов.

Установка

npm install jsdom

Пример использования

const { JSDOM } = require('jsdom');

async function parseDynamicPage(html) {
    const dom = new JSDOM(html, {
        runScripts: 'dangerously',
        resources: 'usable'
    });

    const document = dom.window.document;

    // Ждем выполнения скриптов
    await new Promise(resolve => setTimeout(resolve, 2000));

    const items = [];
    document.querySelectorAll('.product-item').forEach(el => {
        items.push({
            name: el.querySelector('.product-name')?.textContent,
            price: el.querySelector('.price')?.textContent
        });
    });

    return items;
}

// Пример с передачей HTML
const html = `<html><body><div class="product-item">...</div></body></html>`;
parseDynamicPage(html).then(data => console.log(data));

Когда выбирать JSDOM:

  • Страницы с динамическим контентом (AJAX, React, Vue)
  • Необходимость работы с DOM-событиями
  • Тестирование веб-приложений
  • Извлечение данных из SPA (Single Page Application)

3. Puppeteer — браузер под управлением кода

Puppeteer — это полноценный headless-браузер (Chrome/Chromium) с программным управлением. Он выполняет JavaScript, загружает ресурсы, обрабатывает куки и сессии. Puppeteer — самый мощный инструмент, но и самый тяжелый по ресурсам.

Установка

npm install puppeteer

Пример использования

const puppeteer = require('puppeteer');

async function parseWithBrowser(url) {
    const browser = await puppeteer.launch({ headless: true });
    const page = await browser.newPage();

    await page.goto(url, { waitUntil: 'networkidle0' });

    // Извлекаем данные через evaluate
    const data = await page.evaluate(() => {
        const articles = [];
        document.querySelectorAll('article').forEach(article => {
            articles.push({
                title: article.querySelector('h2')?.innerText,
                link: article.querySelector('a')?.href,
                text: article.querySelector('p')?.innerText
            });
        });
        return articles;
    });

    await browser.close();
    return data;
}

// Использование с ожиданием элементов
async function parseWithWait(url) {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto(url);

    // Ждем появления контента
    await page.waitForSelector('.content-loaded', { timeout: 5000 });

    const result = await page.evaluate(() => ({
        title: document.title,
        description: document                    

Рекомендаций