Парсер OLX по инструкции Gemini 2.5

Эволюция Telegram-ботов для OLX.pl: От бесплатных вещей до вакансий и жилья. Делаем парсер с помощью Gemini.

Парсер OLX по инструкции Gemini 2.5

В этом обзоре мы рассмотрим техническую сторону создания и развития серии Telegram-ботов, предназначенных для мониторинга польского сайта объявлений OLX.pl. Начав с простого бота для поиска бесплатных вещей, проект эволюционировал до специализированных инструментов для поиска вакансий для экспатов и аренды жилья. Мы пройдемся по использованному стеку технологий, возникшим проблемам и найденным решениям.

Общий технологический стек

Несмотря на разные цели, боты построены на общем фундаменте:

* **Язык программирования:** Python 3 (в процессе разработки использовались версии ~3.9-3.12). * **Взаимодействие с Telegram:** Библиотека `python-telegram-bot` (асинхронная версия 21+), активно использующая `asyncio`. Ключевые компоненты: `Application`, `CommandHandler`, `CallbackQueryHandler`, `InlineKeyboardMarkup`. * **База данных:** SQLite для хранения пользовательских данных, найденных объявлений/вакансий/объектов жилья и состояния просмотра. Использовался стандартный модуль `sqlite3`. * **Парсинг HTML:** Библиотека `BeautifulSoup4` для разбора HTML-структуры страниц OLX. * **HTTP-запросы / Автоматизация браузера:** `pyppeteer` (Python-порт Puppeteer) для управления headless-браузером Chromium. Выбран как основной инструмент после того, как простые HTTP-запросы (`httpx`) оказались ненадежными из-за блокировок OLX. * **Конфигурация:** `python-dotenv` для загрузки токена бота и других настроек из файла `.env`. * **Локализация:** Кастомная система на основе `.json` файлов в папке `locales` (`pl.json`, `ru.json`, `uk.json`, `by.json`), с функцией `load_locale` для загрузки нужного языка. * **Развертывание:** Облачный VPS (Linux), `venv` для изоляции зависимостей, `systemd` для управления процессом бота, `cron` для запуска фоновых задач парсинга и очистки базы данных.

Бот 1: Монитор бесплатных вещей t.me/olx_zadarmo_bot

* **Цель:** Отслеживать раздел "Oddam za Darmo" (Отдам даром) на OLX.pl. * **Ключевые особенности парсера:** * Использование `pyppeteer` для имитации прокрутки страницы и загрузки изображений (lazy loading). * Извлечение заголовка, локации, ссылки и URL фотографий. * **Эволюция:** Переход от `APScheduler` внутри бота к отдельному парсер-скрипту в `cron`. Миграция интерфейса с `ReplyKeyboard` на `InlineKeyboard`.

Бот 2: Монитор вакансий для экспатов t.me/olx_praca_bot

* **Цель:** Искать вакансии в разделе "Praca" с фильтрами "Примем граждан других стран и "Можно без знания польского" (`without_polish`). * **Основан на Бот 1:** Использовал существующую структуру, но с адаптациями. * **Ключевые особенности парсера:** * Минимальная версия `pyppeteer` (без сложной прокрутки и парсинга фото). * Адаптированные селекторы для извлечения данных вакансии (Название, Компания, Зарплата, Локация, Дата). * Использование URL с жестко заданными фильтрами. * **База данных:** Схема таблицы `ads` адаптирована под поля вакансий. **Важно:** Применена логика **НЕ** удаления таблицы `ads` при `init_db()` для сохранения данных между запусками парсера и бота. * **Интерфейс бота:** Показывает текстовые данные вакансии с заглушкой `no_photo.png`. Добавлена поддержка белорусского языка. Исправлена логика сброса состояния при обновлении.

Бот 3: Монитор аренды жилья (`@olx_noclegi_bot`)

* **Цель:** Отслеживать объявления об аренде жилья (квартиры, дома, комнаты) на короткий срок на OLX.pl, в разделе "Noclegi" (Недвижимость) -> "Mieszkania", "Domy", "Stancje i Pokoje". * **реализация (на основе архитектуры Бот 1 и 2):** * **Архитектура:** также использует разделение на парсер (`cron`) и бот-интерфейс (`systemd`). * **Парсер:** Использует `pyppeteer` для обхода защиты OLX. Логика нацелена на извлечение данных, специфичных для аренды: цена (за месяц/сутки), тип жилья, площадь, количество комнат, локация и ссылка на фото. Парсинг фотографий (как в Бот 1) * **База данных:** Схема адаптирована для хранения характеристик жилья. * **Интерфейс бота:** Отображает карточку объекта с ключевыми параметрами , первыми фото. Использует `InlineKeyboard` для навигации и обновления. Локализация адаптирована под терминологию аренды.

Архитектура и развертывание (Общее для всех)

Финальная рабочая архитектура для всех ботов включает:

1. **Бот-интерфейс (`bot.py`):** Работает как сервис `systemd`. Отвечает за взаимодействие с пользователем в Telegram, чтение данных из SQLite и отображение информации. Не занимается парсингом или планированием. 2. **Парсер (`parser.py` + `parser_script.py`):** Запускается по расписанию через `cron`. Использует `pyppeteer` для доступа к OLX, парсит нужные разделы/фильтры, сохраняет найденные данные в SQLite. 3. **Скрипт очистки (`cleanup_db.py`):** Запускается по расписанию через `cron` (реже, чем парсер) для удаления старых записей из SQLite. 4. **Общая база данных (`users.db`):**

Ключевые выводы и уроки

* **OLX требует `pyppeteer`:** Для надежного скрапинга OLX, особенно с учетом возможных блокировок и JS, необходим инструмент автоматизации браузера. * **Разделение задач:** Архитектура с отдельным парсером (`cron`) и ботом (`systemd`) доказала свою стабильность и удобство управления. Установка `pyppeteer` и настройка `cron` на сервере требуют внимания к деталям (зависимости, переменные среды). * **Итеративность:** Разработка проходила через множество этапов отладки и рефакторинга (APScheduler -> cron, ReplyKeyboard -> InlineKeyboard, httpx -> pyppeteer). * **Адаптивность:** Созданная база легко адаптируется под парсинг разных разделов OLX, изменяя лишь логику парсера и схему данных.

В результате была создана масштабируемая система из трех Telegram-ботов (`@olx_zadarmo_bot`, `@olx_praca_bot`, `@olx_noclegi_bot`), каждый из которых решает свою задачу по мониторингу польского OLX, используя общую технологическую базу и подходы к развертыванию.

Начать дискуссию