Тестовое задание для вакансии от Tenderplane
Приложение для парсинга страниц поиска тендеров сайта государственных закупок (ЕИС)
- Язык: Python 3.10+
- Асинхронные запросы: httpx, asyncio
- Парсинг данных: lxml + XPath
- Очередь задач: Celery + Redis
- Контейнеризация: Docker, Docker Compose
- Тестирование: Pytest
- Возможность скачивать указанное количество страниц (настраивается через переменные окружения)
- Полностью асинхронная обработка всех веб-запросов
- Параллельное выполнение парсинга результатов через Celery
В приложении реализована микросервисная архитектура, с помощью Docker и Docker-compose. Приложение содержит следующие микросервисы:
- parser — сервис, отвечающий за парсинг страниц и передачу данных в очередь Celery
- redis — брокер сообщений для взаимодействия между сервисами
- worker — сервис обработки данных, полученных из очереди
Основная логика всех микросервисов покрыта юнит и интеграционными тестами:
- parser - основная логика (утилиты для реализации парсинга и отправки данных в очередь) покрыта тестами на 90%
- worker - основная логика (утилиты и таски для Celery) покрыта тестами на 100%
Внутри директории с каждым микросервисом (parser, worker) Вы найдёте пример файлов конфигурации переменных окружения (.env.example). Перед запуском необходимо будет указать некоторые обязательные параметры для запуска приложения.
Запуск приложения возможен только если на Вашем компьютере установлены Docker и Docker-compose.
- Для запуска приложения в рабочем режиме:
docker-compose -f docker-compose.prod.yml upПриложение создаст контейнеры, установит зависимости, после чего спарсит указанное количество страниц и выдаст результат в консоль.
- Для запуска автоматических тестов:
docker-compose -f docker-compose.test.yml upПриложение создаст контейнеры, установит зависимости, после чего запустит автоматические тесты, результат которых выведет в консоль. Тесты запускаются последовательно, для каждого микросервиса, поэтому, пожалуйста, дождитесь вывода результатов для каждого микросервиса.
Если у Вас есть вопросы по заданию, напишите: 📧 filatov.s.a.work@gmail.com