# IAAI Scraper Скрапер публичного листинга автомобилей с сайта IAAI. Собирает данные карточек через Playwright, парсит HTML и перехваченные JSON ответы, нормализует и сохраняет в SQLite (или другую БД через SQLAlchemy). Работает последовательно одна машина за раз, с паузами между запросами. ## Что делает 1. Открывает страницу листинга `Vehiclelisting/Cars`, собирает ссылки на карточки. 2. Переходит на каждую карточку, перехватывает XHR/fetch JSON-ответы. 3. Парсит DOM-текст, ``, встроенные `<script>` с JSON, сетевые payload'ы. 4. Маппит всё в единую структуру `CarRecord` (pydantic) с нормализацией полей. 5. Делает upsert в БД по `origin_id`, сравнивая `content_hash` чтобы не перезаписывать одинаковые данные. ## Структура проекта ``` iaai_scraper/ ├── browser/ │ ├── factory.py # запуск Chrome/Chromium с desktop-фингерпринтом │ ├── network.py # перехват XHR/fetch, фильтрация и категоризация JSON │ └── pace.py # паузы между действиями ├── core/ │ ├── config.py # настройки из .env │ ├── logs.py # setup logging │ ├── retry.py # retry-декоратор │ └── utils.py # regex, deep_find_key, save_to_json ├── parsing/ │ ├── parser.py # DOM + JSON парсинг │ └── mapper.py # нормализация в CarRecord ├── storage/ │ ├── models.py # ORM: cars, images, sync_runs │ ├── schemas.py # pydantic-схемы │ ├── db.py # upsert с content_hash │ ├── listing.py # сбор ссылок из листинга │ └── enums.py # enum-значения для БД ├── scraper.py # главный модуль └── cli.py # CLI (argparse) ``` ## Установка ```bash pip install -r requirements.txt python -m playwright install chromium ``` ## Настройка Создайте `.env` на основе `.env.example`: ```env IAAI_HEADLESS=true IAAI_DATABASE_URL=sqlite:///iaai_scraper.db ``` Все настройки (pacing, лимиты, gentle mode) задаются через переменные окружения `.env.example`. ## Команды ```bash # создать таблицы python main.py init-db # собрать ссылки из листинга python main.py collect-listing --make Toyota --model Camry --output listing.json # scrape одной карточки python main.py scrape-vehicle "https://www.iaai.com/VehicleDetail/41180634~US" --output result.json # scrape + запись в БД python main.py sync-vehicle "https://www.iaai.com/VehicleDetail/41180634~US" --lane iaai # массовая синхронизация листинга python main.py sync-listing --make Toyota --model Camry --lane iaai_cars # daemon-режим (цикл каждые N минут) python main.py run-daemon --interval 60 ``` ## Тесты ```bash pytest tests -q ``` ## Docker ```bash docker compose build docker compose run --rm iaai-scraper python main.py --help ```