lada_scraper: парсер phpBB форума нива-лада.рф + доку
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
"""Точка входа для парсера Нива Лада Клуб (phpBB).
|
||||
|
||||
Использование:
|
||||
python -m lada_scraper 22 # раздел "Двигатель: механика и ЭСУД"
|
||||
python -m lada_scraper 150 # "Ремонт и ТО"
|
||||
python -m lada_scraper --list # список доступных разделов
|
||||
python -m lada_scraper 22 --workers 8
|
||||
python -m lada_scraper 22 --no-delay
|
||||
"""
|
||||
|
||||
import sys, logging
|
||||
from .config import OUTPUT_DIR, WORKERS, SECTIONS
|
||||
|
||||
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 "--list" in args:
|
||||
print("📋 Доступные разделы форума Нива Лада Клуб (phpBB):")
|
||||
print(f" {'ID':>4} {'Название':<45} {'Тем':>8}")
|
||||
print(f" {'─'*4} {'─'*45} {'─'*8}")
|
||||
# Пока что выводим из конфига
|
||||
for fid in sorted(SECTIONS):
|
||||
print(f" {fid:>4} {SECTIONS[fid]:<45}")
|
||||
print(f"\nПример: python -m lada_scraper 22")
|
||||
sys.exit(0)
|
||||
|
||||
if not args or args[0].startswith("-"):
|
||||
print("❌ Укажи ID раздела. Пример:")
|
||||
print(" python -m lada_scraper 22")
|
||||
print(" python -m lada_scraper --list")
|
||||
print("\n⚙️ Опции:")
|
||||
print(" --workers N количество потоков (по умолчанию 4)")
|
||||
print(" --no-delay без координации задержек")
|
||||
print(" --no-ban-test не проверять бан")
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
forum_id = int(args[0])
|
||||
except ValueError:
|
||||
print(f"❌ ID раздела должен быть числом: {args[0]}")
|
||||
sys.exit(1)
|
||||
|
||||
if forum_id not in SECTIONS:
|
||||
print(f"⚠️ Раздел f={forum_id} не найден в конфиге, но попробуем спарсить.")
|
||||
print(f" SECTIONS известные: {sorted(SECTIONS.keys())}")
|
||||
|
||||
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"🚀 Нива Лада Клуб — раздел f={forum_id}")
|
||||
section_name = SECTIONS.get(forum_id, f"Форум #{forum_id}")
|
||||
log.info(f"📋 {section_name}")
|
||||
log.info(f"📂 {OUTPUT_DIR}/f{forum_id}/part_*.jsonl")
|
||||
log.info("🛑 Ctrl+C = пауза | Повторить команду = продолжить")
|
||||
log.info("=" * 60)
|
||||
|
||||
try:
|
||||
run(forum_id, workers=workers, no_delay=no_delay, ban_test=ban_test)
|
||||
except KeyboardInterrupt:
|
||||
log.info("\n🛑 ПАУЗА. Продолжить: та же команда.")
|
||||
sys.exit(0)
|
||||
Reference in New Issue
Block a user