Клиент заметил, что многие продавцы размещают свои объявления только на одной из двух крупнейших площадок — Avito. При этом на Циан, который считается более профессиональной платформой для недвижимости, эти же объекты могут не попадать. Это создает «слепую зону» и позволяет упускать потенциально выгодные лоты с менее высокой конкуренцией.
Клиент поставил задачу разработать инструмент, который автоматически находил бы объявления о продаже квартир на Avito, которые отсутствуют на Циан.
Модуль Avito (Puppeteer + Динамические Прокси):
Для эмуляции реального поведения пользователя и обхода анти-бот систем Avito использовался Puppeteer. Он позволяет управлять полноценным браузером Chrome, загружая JavaScript и рендеря страницу так же, как это делает обычный пользователь.
Для исключения блокировок по IP-адресу была интегрирована система динамических прокси. Перед каждым циклом парсинга система запрашивает свежий IP-адрес из пула прокси, что делает трафик неотличимым от трафика разных реальных пользователей.
Алгоритм включал навигацию по списку объявлений, извлечение данных и "переход" по страницам.
Модуль Циан (Fetch + Динамические Прокси):
Для Циан оказалось достаточно использования функции fetch для выполнения HTTP-запросов, так как необходимая информация доступна без полного рендеринга JS на стороне клиента.
Однако, для защиты от блокировок, также была применена система динамических прокси. Каждый запрос к Циан выполнялся с нового IP-адреса.
Система формировала поисковый URL на основе параметров объявления с Avito и анализировала ответ на наличие совпадений.
Разработка Ядра Логики Сравнения:
Каждое новое объявление, полученное с Avito, сохранялось в БД.
Для него запускался процесс "верификации" на Циан. Система искала объявления с похожей ценой (в диапазоне ±10%), площадью и расположением в том же районе/улице.
Успешный парсинг сложных платформ: Комбинация Puppeteer для Avito и fetch для Циан показала наилучшее соотношение эффективности и скорости.
Стабильность работы: Использование динамических прокси свело к минимуму количество блокировок, обеспечив непрерывный сбор данных.
Производительность: Асинхронная природа Node.js позволила параллельно обрабатывать десятки объявлений, значительно ускорив общий цикл "поиск-верификация-уведомление".
Надежное хранение: PostgreSQL надежно хранит историю данных, что позволяет проводить анализ и избегать повторных уведомлений об одних и тех же объявлениях.