diff --git a/README.md b/README.md index 8aa6df5..2b66cee 100644 --- a/README.md +++ b/README.md @@ -1,58 +1,55 @@ # ANCHOR: Project_README # Семантика: Документация, описывающая проект, его структуру и способ использования. -# Парсер цен для ElixirPeptide +# Сервис мониторинга цен ElixirPeptide (v3.0) -Это структурированное Python-приложение для парсинга каталога товаров с сайта `elixirpeptide.ru`, сбора информации о вариантах товаров и их ценах. +Это распределенное Python-приложение для мониторинга каталога товаров с сайта `elixirpeptide.ru`. Сервис автоматически отслеживает изменения в ценах и наличии товаров, и отправляет отчеты в Telegram. -## 🚀 Новые возможности (v2.0) +## 🚀 Архитектура (v3.0) -### ✅ Исправленные критические проблемы: -- **Устранено дублирование кода** в `engine.py` и `database.py` -- **Дополнены зависимости** в `requirements.txt` (pydantic, lxml, python-dotenv) -- **Улучшена обработка ошибок** с детальной диагностикой и retry механизмом -- **Добавлена валидация данных** на всех уровнях приложения +Проект перешел от простого парсера к полноценному сервису мониторинга с асинхронной обработкой данных. -### 🎯 Новые функции: -- **Retry стратегия** для HTTP запросов с экспоненциальной задержкой -- **Детальная статистика** выполнения парсинга -- **Валидация конфигурации** при запуске -- **Поддержка переменных окружения** через `.env` файл -- **Graceful degradation** - продолжение работы при частичных сбоях -- **Улучшенное логирование** с категоризацией ошибок +- **Точка входа**: `monitoring_service.py` — главный скрипт, запускаемый по расписанию (cron). +- **Оркестратор**: `src/orchestrator.py` управляет процессом парсинга. +- **Анализатор**: `src/analyzer.py` сравнивает данные последнего и предпоследнего запусков, выявляя изменения. +- **Уведомления**: `src/utils/telegram_sender.py` отправляет HTML-отчеты об изменениях в Telegram. +- **Очередь сообщений**: Интеграция с **RabbitMQ** для асинхронного экспорта данных о товарах и логах. +- **База данных**: **SQLite** используется для хранения истории парсинга и данных для анализа. -### 🔧 Улучшения производительности: -- **Адаптивные таймауты** для HTTP запросов -- **Проверка на блокировку/капчу** в ответах сервера -- **Оптимизированная обработка данных** с пропуском некорректных записей +## ✨ Ключевые возможности + +- **Автоматический мониторинг**: Запуск по расписанию для непрерывного отслеживания. +- **Отчеты об изменениях**: Уведомления в Telegram о новых, удаленных товарах, а также изменениях цен и наличия. +- **Асинхронный экспорт**: Отправка данных в RabbitMQ для дальнейшей обработки другими системами. +- **Надежность**: Механизм retry-запросов, детальное логирование и отказоустойчивость. +- **Гибкая конфигурация**: Все параметры настраиваются через `.env` файл. ## Структура Проекта -Проект организован по принципу семантического разделения ответственности для удобства поддержки и дальнейшей разработки. - +- `monitoring_service.py`: **[NEW]** Главная точка входа для запуска по расписанию. - `src/`: Основная директория с исходным кодом. - - `config.py`: Все настройки (URL, селекторы, флаги сохранения). - - `main.py`: Точка входа в приложение, оркестратор процесса. - - `core/`: Пакет с ядром приложения. + - `orchestrator.py`: **[NEW]** Управляет всем процессом парсинга. + - `analyzer.py`: **[NEW]** Анализирует данные и формирует отчеты. + - `main.py`: Точка входа для ручного запуска парсинга. + - `core/`: Ядро приложения. + - `settings.py`: **[ENHANCED]** Pydantic-модели для конфигурации (включая Telegram, RabbitMQ). - `database.py`: Логика работы с базой данных SQLite. - - `logging_config.py`: Настройка системы логирования. - - **`models.py`: [NEW FILE] Pydantic модели данных (ProductVariant, LogRecordModel).** - - **`settings.py`: [ENHANCED] Конфигурация с валидацией и поддержкой .env** - - `scraper/`: Пакет с логикой парсинга. - - **`engine.py`: [ENHANCED] Класс Scraper с retry механизмом и улучшенной обработкой ошибок** - - `utils/`: Пакет со вспомогательными утилитами. - - **`exporters.py`: [ENHANCED] Функции для сохранения данных с валидацией** -- `requirements.txt`: Список зависимостей проекта. -- `price_data_final/`: Директория для хранения результатов (создается автоматически). -- **`.env.example`: [NEW] Пример файла с переменными окружения** + - `rabbitmq.py`: **[NEW]** Клиент для работы с RabbitMQ. + - `scraper/`: Логика парсинга. + - `engine.py`: Улучшенный движок парсера. + - `utils/`: Вспомогательные утилиты. + - `telegram_sender.py`: **[NEW]** Отправка уведомлений в Telegram. +- `requirements.txt`: **[UPDATED]** Обновленный список зависимостей. +- `.env.example`: Пример файла с переменными окружения. +- `RABBITMQ_SETUP.md`: **[NEW]** Руководство по настройке RabbitMQ. ## Установка и Запуск ### 1. Клонирование и настройка окружения ```bash -git clone -cd peptide_parser_project +git clone https://gitea.bebesh.ru/busya/peptide-parcer.git +cd peptide-parcer # Создание виртуального окружения python -m venv venv @@ -62,139 +59,68 @@ source venv/bin/activate # Для Windows: venv\Scripts\activate pip install -r requirements.txt ``` -### 2. Настройка конфигурации +### 2. Настройка RabbitMQ (Опционально) -#### Вариант A: Через переменные окружения +Для асинхронного экспорта данных требуется RabbitMQ. Рекомендуется запуск через Docker: ```bash -# Создайте файл .env на основе .env.example -cp .env.example .env +docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management +``` +Подробности см. в `RABBITMQ_SETUP.md`. -# Отредактируйте .env файл под ваши нужды -nano .env +### 3. Настройка конфигурации + +Скопируйте `.env.example` в `.env` и заполните необходимые параметры. + +```bash +cp .env.example .env +nano .env # Отредактируйте файл ``` -#### Вариант B: Прямое редактирование настроек -Отредактируйте `src/core/settings.py` для изменения настроек по умолчанию. +**Ключевые переменные окружения:** +- `TELEGRAM_BOT_TOKEN`: Токен вашего Telegram-бота. +- `TELEGRAM_CHAT_ID`: ID чата, куда будут приходить отчеты. +- `ENABLE_RABBITMQ_EXPORT`: `true` или `false` для включения/отключения экспорта в RabbitMQ. +- `RABBITMQ_HOST`, `RABBITMQ_PORT` и т.д.: Настройки подключения к RabbitMQ. -### 3. Запуск парсера +### 4. Запуск +#### Автоматический мониторинг (рекомендуется) +Настройте запуск `monitoring_service.py` через `cron` или планировщик задач. +```bash +# Пример для cron, запуск каждый час +# 0 * * * * /path/to/your/project/venv/bin/python /path/to/your/project/monitoring_service.py >> /path/to/your/project/logs/cron.log 2>&1 + +# Ручной запуск для проверки +python monitoring_service.py +``` + +#### Ручной запуск парсинга (без анализа и отчета) ```bash python src/main.py ``` -## Конфигурация - -### Переменные окружения (.env файл) - -| Переменная | Описание | По умолчанию | -|------------|----------|--------------| -| `PARSER_BASE_URL` | Базовый URL сайта | `https://elixirpeptide.ru` | -| `PARSER_CATALOG_URL` | URL каталога товаров | `https://elixirpeptide.ru/catalog/` | -| `PARSER_SAVE_TO_CSV` | Сохранять в CSV | `true` | -| `PARSER_SAVE_TO_DB` | Сохранять в базу данных | `true` | -| `PARSER_LOG_TO_DB` | Логировать в базу данных | `true` | -| `PARSER_TIMEOUT` | Таймаут HTTP запросов (сек) | `30` | -| `PARSER_DELAY` | Задержка между запросами (сек) | `1.0` | -| `PARSER_RETRIES` | Максимум попыток для запросов | `3` | - -### Настройки производительности - -- **Таймаут запросов**: 30 секунд (настраивается) -- **Задержка между запросами**: 1 секунда (настраивается) -- **Retry стратегия**: 3 попытки с экспоненциальной задержкой -- **Graceful degradation**: Продолжение работы при ошибках отдельных запросов - ## Результаты -### Файлы результатов +### Отчеты в Telegram +Сервис присылает в указанный чат отчет, если обнаруживает изменения: +- **💰 Изменились цены**: список товаров с новой и старой ценой. +- **📦 Изменилось наличие**: список товаров, которые появились или закончились. +- **✨ Новые товары**: список добавленных товаров. +- **🗑️ Удаленные товары**: список удаленных товаров. -- **CSV файл**: `price_data_final/prices_full_catalog_YYYY-MM-DD_HHMMSS.csv` -- **База данных**: `price_data_final/parser_data.db` (SQLite) - -### Структура данных - -```csv -name,volume,price -"Peptide X","30ml",1500 -"Peptide Y","50ml",2500 -``` - -### Логирование - -- **Консольные логи**: Детальная информация о процессе парсинга -- **Логи в БД**: Если `PARSER_LOG_TO_DB=true`, все логи сохраняются в таблицу `logs` - -## Обработка ошибок - -### Типы обрабатываемых ошибок - -1. **Сетевые ошибки**: Timeout, ConnectionError, HTTPError -2. **Ошибки парсинга**: Отсутствующие элементы, некорректные данные -3. **Ошибки файловой системы**: Права доступа, отсутствие директорий -4. **Ошибки базы данных**: SQLite ошибки, проблемы с подключением - -### Стратегия восстановления - -- **Retry механизм**: Автоматические повторные попытки для сетевых ошибок -- **Graceful degradation**: Пропуск проблемных записей с продолжением работы -- **Детальная диагностика**: Подробные логи для анализа проблем - -## Мониторинг и статистика - -### Статистика выполнения - -Приложение выводит детальную статистику: - -``` -[FINAL_STATS] Время выполнения: 45.23 секунд -[FINAL_STATS] Успешность: 95/100 (95.0%) -[STATS] Успешно: 95, Ошибок: 5 -``` - -### Метрики - -- Общее количество URL для парсинга -- Количество успешно обработанных записей -- Количество ошибок -- Время выполнения -- Процент успешности - -## Разработка - -### Архитектурные принципы - -1. **Разделение ответственности**: Каждый модуль отвечает за свою область -2. **Типизация**: Использование Pydantic для валидации данных -3. **Обработка ошибок**: Graceful handling с детальной диагностикой -4. **Конфигурируемость**: Гибкие настройки через переменные окружения -5. **Логирование**: Структурированное логирование на всех уровнях - -### Добавление новых функций - -1. **Новые форматы экспорта**: Добавьте функции в `src/utils/exporters.py` -2. **Новые селекторы**: Обновите `ScraperSelectors` в `src/core/settings.py` -3. **Новые поля данных**: Расширьте модель `ProductVariant` в `src/core/models.py` +### Данные +- **База данных**: `price_data_final/parser_data.db` — хранит всю историю парсинга. +- **CSV файл**: `price_data_final/prices_full_catalog_*.csv` — создается при ручном запуске. +- **RabbitMQ**: Сообщения с данными о товарах и логах отправляются в очереди `price_parser.products` и `price_parser.logs`. ## Устранение неполадок -### Частые проблемы - -1. **"Не удается подключиться к базовому URL"** - - Проверьте интернет-соединение - - Убедитесь, что сайт доступен - - Проверьте настройки прокси - -2. **"Не найдено ни одной ссылки на товар"** - - Проверьте CSS селекторы в настройках - - Убедитесь, что структура сайта не изменилась - -3. **"Ошибка при сохранении в БД"** - - Проверьте права доступа к директории - - Убедитесь, что SQLite поддерживается - -### Логи для диагностики - -Все ошибки логируются с детальной информацией. Проверьте: -- Консольные логи при запуске -- Логи в базе данных (если включено) -- Файлы результатов для проверки данных \ No newline at end of file +1. **Не приходят сообщения в Telegram**: + - Проверьте правильность `TELEGRAM_BOT_TOKEN` и `TELEGRAM_CHAT_ID`. + - Убедитесь, что бот добавлен в чат с нужными правами. +2. **Ошибка подключения к RabbitMQ**: + - Проверьте, что RabbitMQ запущен и доступен. + - Убедитесь в корректности настроек в `.env`. +3. **Ошибки парсинга**: + - Проверьте доступность сайта `elixirpeptide.ru`. + - Возможно, изменилась структура HTML-страниц. В этом случае нужно обновить CSS-селекторы в `src/core/settings.py`.