IAAI Scraper
Небольшой сервис для сбора автомобилей с iaai.com. Собирает ссылки из листинга, открывает карточки машин, достаёт данные из HTML и XHR, сохраняет всё в PostgreSQL.
Что важно по сайту
У IAAI стоит Imperva Incapsula — внешний anti-bot и WAF.
- headless Chromium без прокси часто режется
- часть данных грузится через XHR, часть есть сразу в HTML
- есть cookie banner
Поэтому в проекте используется Playwright, паузы между действиями и прокси.
Запуск
cp .env.example .env # подправить под себя
docker compose up -d
Поднимутся 5 контейнеров: postgres, redis, api, worker, beat. API на http://localhost:8000.
Swagger-документация: http://localhost:8000/docs
API
Здоровье и статистика:
GET /health— статус сервиса и подключения к БДGET /api/v1/stats— сколько машин/картинок в базе, топ брендов
Машины:
GET /api/v1/cars— список с пагинациейGET /api/v1/cars/{id}— карточка с картинкамиGET /api/v1/cars/by-origin/{origin_id}— поиск по IAAI stock number
Задачи:
POST /api/v1/tasks/sync-vehicle— скрапнуть одну машину по URLPOST /api/v1/tasks/sync-listing— запустить полный обход листингаGET /api/v1/tasks/{task_id}— статус задачиGET /api/v1/tasks— все задачиGET /api/v1/sync-runs— история запусков
Пример:
curl -X POST http://localhost:8000/api/v1/tasks/sync-vehicle
-H "Content-Type: application/json" \
-d '{"vehicle_url": "https://www.iaai.com/VehicleDetail/45089484~US"}'
CLI
Для локального запуска без API и Celery:
python main.py init-db
python main.py collect-listing --make Toyota
python main.py sync-vehicle "https://www.iaai.com/VehicleDetail/45089484~US"
python main.py sync-listing --limit 10
Структура
iaai_scraper/
scraper.py — основной код скрапера
cli.py — CLI-команды
proxy_bridge.py — HTTP→SOCKS5 мост
browser/
factory.py — запуск браузера и контекста
listing.py — сбор ссылок из листинга
network.py — перехват XHR/fetch
pace.py — паузы между действиями
parsing/
parser.py — разбор карточки машины
mapper.py — нормализация данных
storage/
models.py — SQLAlchemy модели
schemas.py — Pydantic схемы
enums.py — справочники значений
db.py — работа с БД
api/
app.py — FastAPI приложение
deps.py — зависимости
routes/
health.py — GET /health
cars.py — машины и статистика
tasks.py — задачи и история запусков
worker/
celery_app.py — конфиг Celery
tasks.py — фоновые задачи
core/
config.py — настройки
logs.py — логирование
retry.py — retry-логика
utils.py — утилиты
alembic/ — миграции БД
Конфигурация
Основные переменные лежат в .env.example:
БД: IAAI_DATABASE_URL, IAAI_DATABASE_POOL_SIZE
Redis: IAAI_REDIS_URL
Celery: CELERY_BROKER_URL, CELERY_BEAT_SYNC_INTERVAL_MINUTES
Скрапер: IAAI_HEADLESS, IAAI_SYNC_ONLY_NEW, IAAI_MAX_PAGES_PER_RUN
Прокси: IAAI_PROXY_SERVER, IAAI_PROXY_USERNAME, IAAI_PROXY_PASSWORD
Паузы: IAAI_BETWEEN_VEHICLES_MIN_S, IAAI_AFTER_PAGE_CHANGE_MAX_S и т.д.
Миграции
В Docker миграции запускаются автоматически при старте API-контейнера.
Вручную:
alembic upgrade head
alembic revision --autogenerate -m "add_column_x"
Тесты
pytest -q
Тесты идут на SQLite in-memory, без внешних сервисов.