Сервис для автоматического парсинга хакатонов с сайта хакатоны.рус с сохранением в PostgreSQL и предоставлением REST API.
- 🕒 Автоматический парсинг каждые 30 минут
- 🐳 Полная контейнеризация с Docker Compose
- 🗄️ Сохранение данных в PostgreSQL
- 🚀 REST API на FastAPI
- 📊 Веб-интерфейс для просмотра результатов
- 🔍 Поиск и фильтрация хакатонов
- 📝 Подробное логирование
├── main.py # Основное приложение с планировщиком
├── api.py # FastAPI эндпоинты
├── parser_service.py # Логика парсинга
├── database.py # Модели и работа с БД
├── Dockerfile # Образ парсера
├── docker-compose.yml # Оркестрация сервисов
├── requirements.txt # Python зависимости
└── init.sql # Инициализация БД
# Клонируем репозиторий
git clone <repository-url>
cd hackParser
# Создаем директорию для логов
mkdir -p logs
# Запускаем сервисы
docker-compose up -d# Проверяем статус сервисов
docker-compose ps
# Проверяем логи
docker-compose logs -f parser
# Проверяем API
curl http://localhost:8000/healthGET /- Информация о сервисеGET /health- Проверка состоянияGET /docs- Swagger документацияPOST /parse/manual- Ручной запуск парсинга
GET /hackathons- Список хакатонов с пагинациейGET /hackathons/latest?limit=20- Последние хакатоныGET /hackathons/{id}- Конкретный хакатонGET /hackathons/search/{query}- Поиск по названиюGET /stats- Статистика
# Получить последние 10 хакатонов
curl "http://localhost:8000/hackathons/latest?limit=10"
# Поиск хакатонов
curl "http://localhost:8000/hackathons/search/AI"
# Статистика
curl "http://localhost:8000/stats"
# Ручной запуск парсинга
curl -X POST "http://localhost:8000/parse/manual"CREATE TABLE hackathons (
id SERIAL PRIMARY KEY,
name VARCHAR(500) NOT NULL,
image_url TEXT,
link_url TEXT,
tags TEXT[],
parsed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);# Подключение к PostgreSQL
docker exec -it hackathon_postgres psql -U hackathon_user -d hackathon_db
# Просмотр данных
SELECT * FROM hackathons ORDER BY parsed_at DESC LIMIT 10;# В docker-compose.yml
environment:
- DATABASE_URL=postgresql://hackathon_user:hackathon_password@postgres:5432/hackathon_db
- DISPLAY=:99По умолчанию парсинг запускается каждые 30 минут. Для изменения отредактируйте в main.py:
scheduler.add_job(
func=scheduled_parsing,
trigger=IntervalTrigger(minutes=30), # Измените на нужное значение
...
)# Логи парсера
docker-compose logs -f parser
# Логи PostgreSQL
docker-compose logs -f postgres
# Все логи
docker-compose logs -fЛоги сохраняются в директории ./logs/:
main.log- основное приложениеparser.log- парсинг
# Создание виртуального окружения
python -m venv venv
source venv/bin/activate # Linux/Mac
# или
venv\Scripts\activate # Windows
# Установка зависимостей
pip install -r requirements.txt
# Запуск только PostgreSQL
docker-compose up postgres -d
# Запуск приложения локально
export DATABASE_URL="postgresql://hackathon_user:hackathon_password@localhost:5432/hackathon_db"
python main.py# Запуск только парсера
python parser_service.py
# Ручной запуск через API
curl -X POST "http://localhost:8000/parse/manual"# Проверка Firefox в контейнере
docker exec -it hackathon_parser firefox --version
# Проверка geckodriver
docker exec -it hackathon_parser geckodriver --version# Перезапуск PostgreSQL
docker-compose restart postgres
# Очистка данных
docker-compose down -v
docker-compose up -d# Проверка логов парсера
docker-compose logs parser | grep ERROR
# Ручной запуск парсинга для отладки
docker exec -it hackathon_parser python parser_service.pyИзмените интервал в main.py:
trigger=IntervalTrigger(minutes=15) # Каждые 15 минут- Расширьте
parser_service.py - Добавьте новые поля в модель
Hackathon - Обновите API эндпоинты
Для высоких нагрузок можно:
- Использовать Redis для координации задач
- Добавить балансировщик нагрузки
- Разделить парсинг и API на разные сервисы
- Используйте сильные пароли для PostgreSQL
- Настройте firewall для продакшена
- Регулярно обновляйте зависимости
- Используйте HTTPS в продакшене
MIT License