IAAI scraper: Playwright + SQLAlchemy, парсинг авто с аукциона, Docker-ready
This commit is contained in:
96
README.md
Normal file
96
README.md
Normal 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
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user