readme update
This commit is contained in:
236
README.md
236
README.md
@@ -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 поддерживается
|
|
||||||
|
|
||||||
### Логи для диагностики
|
|
||||||
|
|
||||||
Все ошибки логируются с детальной информацией. Проверьте:
|
|
||||||
- Консольные логи при запуске
|
|
||||||
- Логи в базе данных (если включено)
|
|
||||||
- Файлы результатов для проверки данных
|
|
||||||
|
|||||||
Reference in New Issue
Block a user