gendesign/tradein-mvp/scripts/probe-parser-region-filter.py
lekss361 d2a0257639
All checks were successful
Deploy Trade-In / changes (push) Successful in 6s
Deploy Trade-In / build-backend (push) Has been skipped
Deploy Trade-In / build-frontend (push) Has been skipped
Deploy Trade-In / deploy (push) Successful in 32s
feat(tradein-scripts): scrapers + probes + Phase C improvements (#551)
2026-05-24 19:58:38 +00:00

49 lines
2.1 KiB
Python

"""Прогнать current parser на HTML из Playwright debug-страницы (своб.планир p=10).
Проверяет что URL-filter работает: до фикса parser возвращал ~30 карточек других
городов, после — должен 0 или только ЕКБ.
"""
from __future__ import annotations
import asyncio
import sys
import types
from pathlib import Path
_BACKEND = Path(__file__).resolve().parent.parent / "backend"
if str(_BACKEND) not in sys.path:
sys.path.insert(0, str(_BACKEND))
for _m in ("weasyprint", "weasyprint.text", "weasyprint.text.ffi", "weasyprint.css", "weasyprint.css.targets"):
sys.modules[_m] = types.ModuleType(_m)
sys.modules["weasyprint"].HTML = type("HTML", (), {"__init__": lambda self, *a, **kw: None})
sys.modules["weasyprint"].CSS = type("CSS", (), {"__init__": lambda self, *a, **kw: None})
from app.services.scrapers.avito import AvitoScraper # noqa: E402
URL = "https://www.avito.ru/ekaterinburg/kvartiry/prodam/svobodnaya_planirovka-ASgBAgICAkSSA8YQygj8zzI?p=10&s=104"
async def main() -> None:
async with AvitoScraper() as s:
assert s._cffi is not None
# Use scraper's own session — может попасть в 403 (curl_cffi), это OK,
# тогда переключимся на reading from Playwright MCP page.
print(f"Fetching {URL[:80]}...")
try:
r = await s._cffi.get(URL)
print(f" HTTP {r.status_code}, html size: {len(r.text)}")
if r.status_code != 200:
print(" curl_cffi 403 — Avito не отдал. Пробни через MCP / browser save.")
return
except Exception as e: # noqa: BLE001
print(f" fetch fail: {type(e).__name__}: {e}")
return
lots = s._parse_html(r.text, source_url_base=URL)
print(f"\nParsed {len(lots)} EKB lots (после фильтра).")
for lot in lots[:5]:
print(f" {lot.source_id} {lot.source_url[:80]}")
print(f" {lot.address or '-'!r}")
if __name__ == "__main__":
asyncio.run(main())