# VESTI — фаза 1: сбор кандидатов с источников в очередь (posts). # Запускает telegram_crawler и rss_crawler по включённым источникам; # классификация НЕ выполняется — новые посты уходят в очередь (classified=0), # которую разбирает crawler.worker (фаза 3, параллельно). # # Запуск: python -m crawler.crawl_sources --all # python -m crawler.crawl_sources --crawler rss # только RSS import argparse import subprocess import sys from pathlib import Path BASE = Path(__file__).resolve().parent.parent PY = str(BASE / ".venv" / "bin" / "python") def run_crawler(mod: str, extra: list[str] | None = None) -> int: """Запускает модуль-краулер в подпроцессе. Возвращает exit code.""" cmd = [PY, "-m", mod] + (extra or []) print(f"--- {mod} {' '.join(extra or [])} ---", flush=True) return subprocess.run(cmd, cwd=str(BASE)).returncode def main(): ap = argparse.ArgumentParser(description="VESTI фаза 1: сбор кандидатов с источников в очередь") ap.add_argument("--all", action="store_true", help="сбор со всех включённых краулеров") ap.add_argument("--crawler", choices=["telegram", "rss"], help="только один тип краулера") args = ap.parse_args() if not args.all and not args.crawler: ap.print_help() sys.exit(2) rc = 0 if args.all or args.crawler == "telegram": rc |= run_crawler("crawler.telegram_crawler", ["--all"]) if args.all or args.crawler == "rss": rc |= run_crawler("crawler.rss_crawler", ["--all"]) sys.exit(rc) if __name__ == "__main__": main()