# DOM.RIA Parser

Парсер оголошень нерухомості з [dom.ria.com/uk](https://dom.ria.com/uk/) для локального сервісу `data_collector`.

## Швидкий старт

```bash
# Встановлення залежностей
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

# Dry-run (без відправки в data_collector)
python -m src.main --city kiev --category 1 --operation sale --max-pages 1 --dry-run

# Реальний запуск (1 сторінка)
python -m src.main --city kiev --category 1 --operation sale --max-pages 1

# Всі міста, всі категорії, всі операції (довгий!
python -m src.main
```

## Аргументи CLI

| Параметр | Опис |
|----------|------|
| `--city` | Slug міста (можна декілька). За замовчуванням — всі. |
| `--category` | ID категорії: `1`=квартири, `2`=будинки, `3`=земля, `4`=комерція, `5`=гаражі. |
| `--operation` | `sale`, `rent`, `rent_daily`. За замовчуванням — всі. |
| `--max-pages` | Обмеження кількості сторінок каталогу на один target. |
| `--dry-run` | Парсити, але не відправляти в `data_collector` і не писати в SQLite. |
| `--db` | Шлях до SQLite БД для resume (`domria_resume.db`). |
| `--collector-url` | URL `data_collector` (`http://localhost:8020`). |

## Архітектура

```
src/
├── config.py       # URL-патерни, міста, категорії, ліміти швидкості
├── session.py      # curl_cffi Session з impersonate + cookies
├── parser.py         # Витягування __INITIAL_STATE__ з HTML
├── normalizer.py   # Нормалізація raw DOM.RIA → payload data_collector
├── collector.py    # HTTP-клієнт для POST /api/v1/ingest
├── storage.py      # SQLite resume / deduplication
├── crawler.py      # Основний цикл: каталог → деталі → ingest
└── main.py         # CLI entry point
```

## Особливості реалізації

- **curl_cffi** із `impersonate="chrome124"` — єдиний робочий спосіб обходу анти-боту DOM.RIA.
- **Session cookies** — обов’язковий warmup через головну сторінку перед запитом каталогу.
- **Формат URL:** `/{operation}-{type}/{city}/?page=N` (напр. `/prodazha-kvartir/kiev/?page=1`).
- **Rate limits:** 10с між сторінками, 10с між детальними сторінками, пауза 2 хв кожні 50 сторінок.
- **Resume:** SQLite база запобігає повторній обробці вже зібраних оголошень.

## Docker

```bash
docker build -t domria-parser .
docker run --rm --network host domria-parser --city kiev --category 1 --max-pages 1 --dry-run
```

## Ліцензія

Внутрішній проєкт VMK.
