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+ автофорумов
This commit is contained in:
@@ -2,13 +2,15 @@
|
||||
|
||||
Использование:
|
||||
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
|
||||
from .config import OUTPUT_DIR, WORKERS
|
||||
|
||||
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
@@ -23,14 +25,37 @@ logging.basicConfig(
|
||||
)
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) < 2 or "vwts.ru" not in sys.argv[1]:
|
||||
# ── Парсинг аргументов ──────────────────────────────────────────
|
||||
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
|
||||
section_url = sys.argv[1].rstrip("/") + "/"
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
log.info("=" * 60)
|
||||
@@ -40,7 +65,7 @@ if __name__ == "__main__":
|
||||
log.info("=" * 60)
|
||||
|
||||
try:
|
||||
run(section_url)
|
||||
run(section_url, 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