Как написать парсер для сбора цен с сайтов в 2024 году

    Вы планируете создать парсер, который ежедневно обходит 20 сайтов, собирает таблицы с оборудованием и ценами, а затем отправляет отчёт в Telegram. Однако современные сайты часто возвращают HTML без таблиц, что требует пересмотра подхода. В этой статье разберём причины проблемы, сравним инструменты для работы с динамическим контентом и дадим готовое решение для Node.js.

    Почему fetch и axios не видят таблицы с ценами?

    В 2015 году большинство сайтов отдавали цены прямо в HTML-коде. Сегодня популярны SPA (Single Page Applications) на React, Vue или Angular. Они загружают пустую оболочку, а данные подтягиваются через JavaScript-запросы к API. Fetch и axios просто получают исходный HTML, в котором нет сгенерированных таблиц. Чтобы увидеть цены, нужно выполнить JavaScript, как это делает браузер.

    Зачем нужны Selenium, Playwright и Puppeteer?

    Эти инструменты - headless-браузеры. Они эмулируют работу настоящего браузера: загружают страницу, выполняют JS, ждут подгрузки данных. В отличие от fetch, они позволяют извлечь контент, который появляется после скриптов. Например, Puppeteer управляет Chromium, Playwright - несколькими браузерами, Selenium - старый стандарт для автоматизации.

    Сравнение: что выбрать для парсинга?

    • Puppeteer - лёгкий, только Chromium, идеален для Node.js. Отлично подходит для сбора данных с 20 сайтов.
    • Playwright - поддерживает Chrome, Firefox, Safari. Удобнее для кросс-браузерного тестирования, но для парсинга избыточен.
    • Selenium - громоздкий, требует WebDriver. Медленнее и сложнее в настройке, чем современные альтернативы.

    Рекомендуем Puppeteer: он прост в установке (npm i puppeteer), имеет понятный API и хорошо документирован для Node.js.

    Что такое CDP и зачем он нужен?

    CDP (Chrome DevTools Protocol) - это протокол, через который Puppeteer и Playwright общаются с браузером. Он позволяет управлять вкладками, перехватывать сетевые запросы, эмулировать мобильные устройства. В парсинге CDP полезен для перехвата API-запросов: вы можете поймать JSON с ценами, не дожидаясь отрисовки таблицы. Это ускоряет сбор данных в 5-10 раз.

    Как отправить отчёт в Telegram?

    Для отправки сообщений используйте Telegram Bot API. Создайте бота через BotFather, получите токен. В Node.js установите библиотеку node-telegram-bot-api или используйте простой fetch:

    const TOKEN = 'ваш_токен'; const CHAT_ID = 'ID_чата'; fetch(`https://api.telegram.org/bot${TOKEN}/sendMessage`, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({chat_id: CHAT_ID, text: 'Отчёт за день: ...'}) });

    Пошаговый план парсера на Node.js

    1. Установите Puppeteer: npm i puppeteer.
    2. Для каждого сайта откройте страницу, дождитесь селектора таблицы.
    3. Извлеките данные через page.evaluate().
    4. Сохраните в JSON или Excel.
    5. В конце дня отправьте через Telegram API.

    Пример запуска по расписанию - используйте cron-задачи (node-cron).

    Заключение

    Для парсинга современных сайтов с ценами используйте Puppeteer или Playwright. Они решают проблему пустого HTML и легко интегрируются с Node.js. CDP поможет ускорить сбор, а Telegram Bot API - автоматизировать отчёты. Начните с тестового запуска на одном сайте, затем масштабируйте на все 20.

    Часто задаваемые вопросы