readme update

This commit is contained in:
2025-07-21 10:37:12 +03:00
parent 69e90bd4f2
commit ae6d81f6f2

236
README.md
View File

@@ -1,58 +1,55 @@
# ANCHOR: Project_README # 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 механизмом
- **Добавлена валидация данных** на всех уровнях приложения
### 🎯 Новые функции: - **Точка входа**: `monitoring_service.py` — главный скрипт, запускаемый по расписанию (cron).
- **Retry стратегия** для HTTP запросов с экспоненциальной задержкой - **Оркестратор**: `src/orchestrator.py` управляет процессом парсинга.
- **Детальная статистика** выполнения парсинга - **Анализатор**: `src/analyzer.py` сравнивает данные последнего и предпоследнего запусков, выявляя изменения.
- **Валидация конфигурации** при запуске - **Уведомления**: `src/utils/telegram_sender.py` отправляет HTML-отчеты об изменениях в Telegram.
- **Поддержка переменных окружения** через `.env` файл - **Очередь сообщений**: Интеграция с **RabbitMQ** для асинхронного экспорта данных о товарах и логах.
- **Graceful degradation** - продолжение работы при частичных сбоях - **База данных**: **SQLite** используется для хранения истории парсинга и данных для анализа.
- **Улучшенное логирование** с категоризацией ошибок
### 🔧 Улучшения производительности: ## ✨ Ключевые возможности
- **Адаптивные таймауты** для HTTP запросов
- **Проверка на блокировку/капчу** в ответах сервера - **Автоматический мониторинг**: Запуск по расписанию для непрерывного отслеживания.
- **Оптимизированная обработка данных** с пропуском некорректных записей - **Отчеты об изменениях**: Уведомления в Telegram о новых, удаленных товарах, а также изменениях цен и наличия.
- **Асинхронный экспорт**: Отправка данных в RabbitMQ для дальнейшей обработки другими системами.
- **Надежность**: Механизм retry-запросов, детальное логирование и отказоустойчивость.
- **Гибкая конфигурация**: Все параметры настраиваются через `.env` файл.
## Структура Проекта ## Структура Проекта
Проект организован по принципу семантического разделения ответственности для удобства поддержки и дальнейшей разработки. - `monitoring_service.py`: **[NEW]** Главная точка входа для запуска по расписанию.
- `src/`: Основная директория с исходным кодом. - `src/`: Основная директория с исходным кодом.
- `config.py`: Все настройки (URL, селекторы, флаги сохранения). - `orchestrator.py`: **[NEW]** Управляет всем процессом парсинга.
- `main.py`: Точка входа в приложение, оркестратор процесса. - `analyzer.py`: **[NEW]** Анализирует данные и формирует отчеты.
- `core/`: Пакет с ядром приложения. - `main.py`: Точка входа для ручного запуска парсинга.
- `core/`: Ядро приложения.
- `settings.py`: **[ENHANCED]** Pydantic-модели для конфигурации (включая Telegram, RabbitMQ).
- `database.py`: Логика работы с базой данных SQLite. - `database.py`: Логика работы с базой данных SQLite.
- `logging_config.py`: Настройка системы логирования. - `rabbitmq.py`: **[NEW]** Клиент для работы с RabbitMQ.
- **`models.py`: [NEW FILE] Pydantic модели данных (ProductVariant, LogRecordModel).** - `scraper/`: Логика парсинга.
- **`settings.py`: [ENHANCED] Конфигурация с валидацией и поддержкой .env** - `engine.py`: Улучшенный движок парсера.
- `scraper/`: Пакет с логикой парсинга. - `utils/`: Вспомогательные утилиты.
- **`engine.py`: [ENHANCED] Класс Scraper с retry механизмом и улучшенной обработкой ошибок** - `telegram_sender.py`: **[NEW]** Отправка уведомлений в Telegram.
- `utils/`: Пакет со вспомогательными утилитами. - `requirements.txt`: **[UPDATED]** Обновленный список зависимостей.
- **`exporters.py`: [ENHANCED] Функции для сохранения данных с валидацией** - `.env.example`: Пример файла с переменными окружения.
- `requirements.txt`: Список зависимостей проекта. - `RABBITMQ_SETUP.md`: **[NEW]** Руководство по настройке RabbitMQ.
- `price_data_final/`: Директория для хранения результатов (создается автоматически).
- **`.env.example`: [NEW] Пример файла с переменными окружения**
## Установка и Запуск ## Установка и Запуск
### 1. Клонирование и настройка окружения ### 1. Клонирование и настройка окружения
```bash ```bash
git clone <your-repo-url> git clone https://gitea.bebesh.ru/busya/peptide-parcer.git
cd peptide_parser_project cd peptide-parcer
# Создание виртуального окружения # Создание виртуального окружения
python -m venv venv python -m venv venv
@@ -62,139 +59,68 @@ source venv/bin/activate # Для Windows: venv\Scripts\activate
pip install -r requirements.txt pip install -r requirements.txt
``` ```
### 2. Настройка конфигурации ### 2. Настройка RabbitMQ (Опционально)
#### Вариант A: Через переменные окружения Для асинхронного экспорта данных требуется RabbitMQ. Рекомендуется запуск через Docker:
```bash ```bash
# Создайте файл .env на основе .env.example docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
cp .env.example .env ```
Подробности см. в `RABBITMQ_SETUP.md`.
# Отредактируйте .env файл под ваши нужды ### 3. Настройка конфигурации
nano .env
Скопируйте `.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 ```bash
python src/main.py 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) - **База данных**: `price_data_final/parser_data.db` — хранит всю историю парсинга.
- **CSV файл**: `price_data_final/prices_full_catalog_*.csv` — создается при ручном запуске.
### Структура данных - **RabbitMQ**: Сообщения с данными о товарах и логах отправляются в очереди `price_parser.products` и `price_parser.logs`.
```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`
## Устранение неполадок ## Устранение неполадок
### Частые проблемы 1. **Не приходят сообщения в Telegram**:
- Проверьте правильность `TELEGRAM_BOT_TOKEN` и `TELEGRAM_CHAT_ID`.
1. **"Не удается подключиться к базовому URL"** - Убедитесь, что бот добавлен в чат с нужными правами.
- Проверьте интернет-соединение 2. **Ошибка подключения к RabbitMQ**:
- Убедитесь, что сайт доступен - Проверьте, что RabbitMQ запущен и доступен.
- Проверьте настройки прокси - Убедитесь в корректности настроек в `.env`.
3. **Ошибки парсинга**:
2. **"Не найдено ни одной ссылки на товар"** - Проверьте доступность сайта `elixirpeptide.ru`.
- Проверьте CSS селекторы в настройках - Возможно, изменилась структура HTML-страниц. В этом случае нужно обновить CSS-селекторы в `src/core/settings.py`.
- Убедитесь, что структура сайта не изменилась
3. **"Ошибка при сохранении в БД"**
- Проверьте права доступа к директории
- Убедитесь, что SQLite поддерживается
### Логи для диагностики
Все ошибки логируются с детальной информацией. Проверьте:
- Консольные логи при запуске
- Логи в базе данных (если включено)
- Файлы результатов для проверки данных