Небольшой учебный проект для парсинга сайта books.toscrape.com в асинхронном режиме.
Скрипт собирает данные по книгам, сохраняет JSON/CSV и отдаёт метрики Prometheus.
- Загружает главную страницу сайта.
- Находит категории книг.
- Для каждой категории собирает ссылки на книги.
- Асинхронно загружает страницы книг и парсит данные:
title,categoryupc,product_typeprice_excl_tax,price_inc_tax,taxavailability,num_reviews
- Сохраняет результат в JSON/CSV.
- Отдаёт метрики Prometheus на
/metrics.
async_parser_my.py— основной асинхронный парсерprometheus.yml— конфиг Prometheusgrafana_dashboard.json— готовый дашборд Grafanaparser_my.py— синхронный парсер (если нужен)
python --version # требуется Python 3.9.x
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtpython async_parser_my.pyРезультаты:
labirint_YYYYMMDD_HHMMSS_async.jsonlabirint_YYYYMMDD_HHMMSS_async.csv
python simple_parser_my.pyРезультаты:
labirint_YYYYMMDD_HHMMSS.jsonlabirint_YYYYMMDD_HHMMSS.csv
Метрики доступны по адресу:
http://localhost:8000/metrics
По умолчанию метрики доступны 1 час после запуска. Можно изменить:
PROM_PORT=8000 METRICS_TTL_SECONDS=3600 python async_parser_my.py
Для простого парсера используется тот же порт и те же переменные окружения.
Логи сохраняются в папку Logs в корне проекта. При каждом запуске создается
отдельный файл с датой/временем и номером запуска.
Снимок метрик сохраняется в папку Metrics в корне проекта (формат Prometheus
.prom) после завершения парсинга.
Периодичность прогресс-логов можно настроить:
LOG_PROGRESS_EVERY=50 python async_parser_my.py
Логи по каждой книге можно отключить:
LOG_EACH_BOOK=0 python async_parser_my.py
Для асинхронного парсера можно настроить параллелизм:
MAX_CONCURRENCY=20 python async_parser_my.py
- Полный список закреплённых версий находится в
requirements.txt
docker run -d --name prometheus -p 9090:9090 \
-v "$(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml" \
prom/prometheus
docker run -d --name grafana -p 3000:3000 \
-e GF_DASHBOARDS_MIN_REFRESH_INTERVAL=1s \
grafana/grafanaПроверка:
- Prometheus targets:
http://localhost:9090/targets - Grafana:
http://localhost:3000(логинadmin/admin)
Остановка и удаление контейнеров:
docker stop prometheus grafana
docker rm prometheus grafanaСоздай файл prometheus.yml (он уже есть в проекте), затем запусти Prometheus:
docker run -p 9090:9090 \
-v "$(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml" \
prom/prometheusПроверка:
http://localhost:9090/targets
Примечание: Prometheus запущен в Docker и обращается к метрикам на хосте через
host.docker.internal:8000 (это уже прописано в prometheus.yml).
docker run -p 3000:3000 \
-e GF_DASHBOARDS_MIN_REFRESH_INTERVAL=1s \
grafana/grafanaЛогин: admin / admin.
Добавь источник данных Prometheus:
- Если Grafana в Docker:
http://host.docker.internal:9090 - Если Grafana локально:
http://localhost:9090
Импортируй дашборд:
grafana_dashboard.json
scrape_duration_seconds— общее времяcategories_count— количество категорийbooks_found_total— найдено книгbooks_parsed_total— успешно распарсеноbooks_errors_total— ошибкиhttp_requests_total— запросыhttp_request_duration_seconds— гистограмма времени запросовcategory_books_count{category="..."}— книги по категориям
- Асинхронность реализована через
aiohttpиasyncio. - Одновременно выполняется до 10 запросов к страницам книг (Semaphore).
- Проект учебный, без защиты от блокировок/лимитов.