Как написать парсер для сбора цен с сайтов в 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
- Установите Puppeteer:
npm i puppeteer. - Для каждого сайта откройте страницу, дождитесь селектора таблицы.
- Извлеките данные через
page.evaluate(). - Сохраните в JSON или Excel.
- В конце дня отправьте через Telegram API.
Пример запуска по расписанию - используйте cron-задачи (node-cron).
Заключение
Для парсинга современных сайтов с ценами используйте Puppeteer или Playwright. Они решают проблему пустого HTML и легко интегрируются с Node.js. CDP поможет ускорить сбор, а Telegram Bot API - автоматизировать отчёты. Начните с тестового запуска на одном сайте, затем масштабируйте на все 20.