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

97 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```