Ответ
При парсинге HTML в Node.js с помощью библиотек вроде cheerio или jsdom можно столкнуться с блокировками, которые не дают получить нужный контент. Основные причины:
-
Контент, генерируемый JavaScript (SPA/SSR). Статические парсеры не выполняют JS. Решение — использовать headless-браузер, например, Puppeteer.
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://example.com'); // Ждем загрузки динамического контента await page.waitForSelector('.dynamic-list'); const html = await page.content(); await browser.close(); // Теперь можно парсить html через cheerio })(); -
Анти-бот системы (Cloudflare, Distil, капчи). Они анализируют поведение запросов. Обход может включать:
- Установка реалистичных
User-Agentи заголовков. - Использование прокси-серверов и ротация IP-адресов.
- Добавление задержек (
setTimeout) между запросами. - Эмуляция действий мыши/клавиатуры в Puppeteer.
- Установка реалистичных
-
Серверные ограничения:
- Rate Limiting: Сервер ограничивает количество запросов с одного IP. Нужно добавлять паузы и соблюдать
robots.txt. - Требование авторизации: Для доступа к контенту нужны куки или токены, полученные после логина.
- Rate Limiting: Сервер ограничивает количество запросов с одного IP. Нужно добавлять паузы и соблюдать
-
Изменяемая структура DOM. Если разработчики часто меняют классы или ID, селекторы ломаются. Стратегии:
- Использовать более стабильные селекторы (например, по атрибуту
data-testid). - Применять XPath, который может быть более устойчивым к изменениям в структуре.
- Парсить по семантической структуре (например, «третий div внутри основного контейнера»).
- Использовать более стабильные селекторы (например, по атрибуту