Files
Openlane/README.md
2026-04-07 23:51:41 +03:00

3.6 KiB
Raw Blame History

IAAI Scraper

Скрапер публичного листинга автомобилей с сайта IAAI. Собирает данные карточек через Playwright, парсит HTML и перехваченные JSON ответы, нормализует и сохраняет в SQLite (или другую БД через SQLAlchemy).

Работает последовательно одна машина за раз, с паузами между запросами.

Что делает

  1. Открывает страницу листинга Vehiclelisting/Cars, собирает ссылки на карточки.
  2. Переходит на каждую карточку, перехватывает XHR/fetch JSON-ответы.
  3. Парсит DOM-текст, <title>, встроенные <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)

Установка

pip install -r requirements.txt
python -m playwright install chromium

Настройка

Создайте .env на основе .env.example:

IAAI_HEADLESS=true
IAAI_DATABASE_URL=sqlite:///iaai_scraper.db

Все настройки (pacing, лимиты, gentle mode) задаются через переменные окружения .env.example.

Команды

# создать таблицы
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

Тесты

pytest tests -q

Docker

docker compose build
docker compose run --rm iaai-scraper python main.py --help