Clean runtime code

This commit is contained in:
qananasikq
2026-08-21 11:14:00 +03:00
parent 7cd10a6e61
commit 6b16496301
6 changed files with 160 additions and 61 deletions
+75 -24
View File
@@ -1,35 +1,86 @@
# mobile.de Scraper
Парсер [`mobile.de`](https://www.mobile.de/ru).
Сервис собирает объявления из mobile.de в PostgreSQL. Поиск и загрузка галерей разделены: основной worker сохраняет данные из Search, а отдельный worker получает только фотографии.
Сервис для сбора объявлений авто с mobile.de, сохранения в PostgreSQL и регулярного обновления.
## Как работает
## Как идет парсинг
- Парсинг запускается задачами Celery в очереди `mobilede_sync`.
- Стартуем с поисковой ссылки mobile.de (URL с фильтрами: марка, цена, год, пробег и т.д.).
- Выдача разбивается на сегменты (по цене, году, пробегу), чтобы обходить лимиты страниц.
- По каждому сегменту читаются страницы поиска, из них достаются ID и ссылки объявлений.
- По ID/ссылкам загружаются карточки авто, данные маппятся в единый формат и пишутся в БД через upsert.
1. `worker` получает исходную ссылку из `MOBILEDE_FILTERED_SEARCH_URL`.
2. Если ссылка содержит несколько марок, она разделяется по маркам.
3. Каждая выдача делится по цене, году и пробегу до сегментов, которые не превышают лимит mobile.de: 50 страниц по 20 объявлений.
4. Данные карточек из Search сохраняются в `MOBILEDE_cars`; новые объявления ставятся в очередь галерей.
5. `worker-images` читает `mobilede_images`, загружает галерею объявления и сохраняет изображения в `MOBILEDE_images`.
6. Между полными проходами действует интервал `MOBILEDE_CONTINUOUS_SYNC_DELAY_SECONDS`.
## Стек
- `FastAPI` — API и служебные ручки
- `Celery + Redis` — очередь задач парсинга
- `PostgreSQL` — хранение авто и изображений
- `Docker Compose` — запуск всех сервисов
План сегментов сохраняется в volume `tokens_data`. Неполный или плотный план не публикуется для обхода, чтобы не терять объявления за пределами 50-й страницы.
## Сервисы
| Сервис | Назначение |
| --- | --- |
| `postgres` | Автомобили, изображения, отметка `gallery_fetched_at` и история запусков |
| `redis` | Брокер Celery, временные Detail claims/retry, runtime-состояние и лимит запросов |
| `migrate` | Применяет Alembic-миграции перед запуском приложения |
| `worker` | Планирование сегментов и импорт Search-выдачи |
| `worker-images` | Загрузка галерей из очереди `mobilede_images` |
| `beat` | Периодические задачи Celery |
| `api` | FastAPI на порту `MOBILEDE_HOST_API_PORT` |
## Настройка
Конфигурация контейнеров находится в `.env`, правила фильтрации — в `runtime_config.json`.
Основные переменные:
- `MOBILEDE_FILTERED_SEARCH_URL` — исходная ссылка mobile.de с нужной областью поиска;
- `MOBILEDE_RESULTS_PER_PAGE=20` и `MOBILEDE_MAX_PAGE_NUMBER=50` — лимит одной выдачи;
- `MOBILEDE_SEGMENT_TARGET_RESULTS=950` — целевой размер сегмента;
- `MOBILEDE_DETAIL_WORKER_CONCURRENCY` — число процессов загрузки галерей;
- `MOBILEDE_DETAIL_REQUEST_DELAY_SECONDS` — общий интервал между запросами галерей;
- `MOBILEDE_CONTINUOUS_SYNC_DELAY_SECONDS` — пауза между полными проходами.
`worker-images` использует единый Redis-лимитер и circuit breaker: при `403` или `429` новые gallery-запросы временно откладываются, а не повторяются одновременно всеми процессами.
Detail-очередь не создаёт служебные строки в PostgreSQL. Redis хранит временный claim с TTL и счётчик ограниченных retry, а окончательным признаком успешно загруженной галереи служит `MOBILEDE_cars.gallery_fetched_at`. После потери Redis уже завершённые галереи не выбираются повторно.
## Запуск
Подготовьте локальный файл настроек:
```bash
copy .env.example .env
```
Укажите в `.env` `MOBILEDE_FILTERED_SEARCH_URL`, затем запустите стек:
## Быстрый запуск
```bash
docker compose up -d --build
```
## Прокси
- В воркере используется прокси-мост: локальный HTTP `127.0.0.1:8899` -> внешний SOCKS5.
- Это помогает стабилизировать доступ к mobile.de и снизить блокировки.
- Параметры прокси задаются через переменные окружения (см. `.env` / `docker-compose.yml`).
Проверить контейнеры и логи:
## Основные сервисы
- `api` — HTTP API
- `worker` — парсинг и апдейты
- `beat` — планировщик задач
- `postgres` — база данных
- `redis` — брокер очереди
```bash
docker compose ps
docker compose logs -f worker worker-images
```
Миграции применяются контейнером `migrate` автоматически. Для полностью чистого тестового запуска удалите volumes PostgreSQL, Redis и `tokens_data` перед `docker compose up`.
## API
После запуска доступны:
- `GET /health` — состояние сервиса;
- `GET /api/v1/cars` и `GET /api/v1/cars/{car_id}` — автомобили;
- `GET /api/v1/stats` — агрегированная статистика;
- `POST /api/v1/mobilede/tasks/sync-runtime-segments` — запуск прохода сегментов;
- `POST /api/v1/mobilede/tasks/enrich-images` — постановка галерей в обработку;
- `GET /api/v1/sync-runs` — история запусков.
Интерактивная спецификация FastAPI доступна по `/docs`.
## Проверка
```bash
pytest
```
Для просмотра текущего плана и прогресса используйте логи `worker`, Redis-ключи `mobilede:state:bootstrap_segments_total` и `mobilede:state:bootstrap_segments_done`, а также файл `/data/mobilede_runtime_segments.json` внутри volume `tokens_data`.