Парсинг 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 Также в библиотеке
Конфигурация приложений PHP: библиотеки и инструменты для гибкой настройки
unbuild для TypeScript: полное руководство с примерами
migrate для Go: полное руководство с примерами
Apache HttpClient для Java: полное руководство с примерами
JWT токены в Java: Полное руководство по работе с JSON Web Tokens