"""Точка входа. Использование: python -m vwts_scraper https://vwts.ru/forum/vag/benzinovye-dvigateli/ python -m vwts_scraper URL --workers 8 --no-delay python -m vwts_scraper URL --workers 1 # однопоточно (как раньше) Пауза: Ctrl+C → состояние сохраняется. Продолжить: та же команда. """ import sys, logging from .config import OUTPUT_DIR, WORKERS OUTPUT_DIR.mkdir(parents=True, exist_ok=True) logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s", datefmt="%H:%M:%S", handlers=[ logging.StreamHandler(sys.stdout), logging.FileHandler(OUTPUT_DIR / "scraper.log", encoding="utf-8"), ], ) if __name__ == "__main__": # ── Парсинг аргументов ────────────────────────────────────────── args = sys.argv[1:] if len(args) < 1 or "vwts.ru" not in args[0]: print("❌ Укажи URL раздела vwts.ru. Пример:") print(" python -m vwts_scraper " "https://vwts.ru/forum/vag/benzinovye-dvigateli/") print("\n⚙️ Опции:") print(" --workers N количество потоков (по умолчанию 4)") print(" --no-delay без координации задержек") print(" --no-ban-test не проверять бан") sys.exit(1) section_url = args[0].rstrip("/") + "/" workers = WORKERS no_delay = False ban_test = True for a in args[1:]: if a == "--no-delay": no_delay = True elif a == "--no-ban-test": ban_test = False elif a == "--workers" or a == "-w": idx = args.index(a) if idx + 1 < len(args): try: workers = int(args[idx + 1]) except ValueError: pass from .run import run log = logging.getLogger(__name__) log.info("=" * 60) log.info(f"🚀 vwts.ru — раздел: {section_url.split('/')[-2]}") log.info(f"📂 {OUTPUT_DIR}/{section_url.split('/')[-2]}/part_*.jsonl") log.info("🛑 Ctrl+C = пауза | Повторить команду = продолжить") log.info("=" * 60) try: run(section_url, workers=workers, no_delay=no_delay, ban_test=ban_test) except KeyboardInterrupt: log.info("\n🛑 ПАУЗА. Продолжить: та же команда.") sys.exit(0)