Files
LLM-UI/vwts_scraper/__main__.py
T
naeel c3211f0602 feat: многопоточный парсинг + forum survey
- Throttle: Thread-safe координация задержек
- BanDetector: автоопределение бана
- fetch: thread-local сессии вместо глобальной
- run: ThreadPoolExecutor + диапазоны страниц + мерж
- output/state: поддержка worker-папок и merge_states()
- __main__: --workers, --no-delay, --no-ban-test
- VWTS/forums-survey.md: обзор 20+ автофорумов
2026-06-04 10:48:57 +03:00

72 lines
2.6 KiB
Python

"""Точка входа.
Использование:
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)