97 lines
3.6 KiB
Markdown
97 lines
3.6 KiB
Markdown
# 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
|
||
```
|
||
|
||
|