diff --git a/README.md b/README.md index fec8638..1d418ad 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ По умолчанию работает последовательно одна машина за раз, с паузами между запросами. +JSON-результаты CLI по умолчанию сохраняются в `artifacts/json/`, чтобы не засорять корень проекта. + ## Что делает 1. Открывает страницу листинга `Vehiclelisting/Cars`, собирает ссылки на карточки. @@ -77,6 +79,7 @@ SQLite подходит для локальной отладки, но не дл - запуск раз в **1 час** - лимит **30 машин за цикл** +- обрабатываются только **новые авто** (по умолчанию `IAAI_SYNC_ONLY_NEW=true`) Это уже отражено в актуальных env-настройках. @@ -91,6 +94,16 @@ IAAI использует anti-bot / fraud protection. - Chromium **не поддерживает SOCKS5 с аутентификацией напрямую** - поэтому для production желательно покупать прокси, который отдаёт именно HTTP/HTTPS доступ +Если используется встроенный bridge `iaai_scraper/proxy_bridge.py` (HTTP/HTTPS → SOCKS5), +в нём добавлены базовые меры стабильности: + +- корректное чтение request body через `rfile` +- поддержка `Transfer-Encoding: chunked` для request body +- базовое логирование запросов и ошибок +- таймауты relay-соединений +- ограничение числа рабочих потоков (`PROXY_BRIDGE_MAX_WORKERS`) +- безопасный ответ `502 Bad Gateway` без утечки внутренних исключений + Пример: ```env @@ -117,10 +130,10 @@ IAAI_PROXY_PASSWORD=password python main.py init-db # собрать ссылки из листинга -python main.py collect-listing --make Toyota --model Camry --output listing.json +python main.py collect-listing --make Toyota --model Camry --output artifacts/json/listing.json # scrape одной карточки -python main.py scrape-vehicle "https://www.iaai.com/VehicleDetail/41180634~US" --output result.json +python main.py scrape-vehicle "https://www.iaai.com/VehicleDetail/41180634~US" --output artifacts/json/result.json # scrape + запись в БД python main.py sync-vehicle "https://www.iaai.com/VehicleDetail/41180634~US" --lane iaai @@ -128,6 +141,9 @@ python main.py sync-vehicle "https://www.iaai.com/VehicleDetail/41180634~US" --l # массовая синхронизация листинга python main.py sync-listing --make Toyota --model Camry --lane iaai_cars --limit 30 +# при необходимости можно принудительно отключить фильтр only-new +python main.py sync-listing --limit 30 --only-new false + # daemon-режим (цикл каждые N минут) python main.py run-daemon --interval 60 ``` diff --git a/iaai_scraper/core/utils.py b/iaai_scraper/core/utils.py index b02e385..30450a0 100644 --- a/iaai_scraper/core/utils.py +++ b/iaai_scraper/core/utils.py @@ -7,7 +7,9 @@ from typing import Any, Iterable def save_to_json(data: Any, filename: str | Path) -> None: - Path(filename).write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8") + path = Path(filename) + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8") def short_sleep(a: float = 0.10, b: float = 0.35) -> None: