IAAI scraper: Playwright + SQLAlchemy, парсинг авто с аукциона, Docker-ready

This commit is contained in:
qananasikq
2026-04-07 23:45:50 +03:00
commit eddcec8141
37 changed files with 2524 additions and 0 deletions

96
README.md Normal file
View File

@@ -0,0 +1,96 @@
# 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)
```
## Установка
```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
```