"""One-off: fetch Avito houses HTML и анализ markers для понимания новой структуры. После 2026-05-23 Avito поменяли rendering — старый `window.__preloadedState__` больше не работает (Stage 2c parser fails). Этот скрипт fetch'ит один houses catalog page локально через residential IP и сохраняет HTML + проверяет markers чтобы понять new format (__NEXT_DATA__? React SSR? иной). """ 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}) import asyncio # noqa: E402 from curl_cffi.requests import AsyncSession # noqa: E402 URLS = [ "https://www.avito.ru/catalog/houses/ekaterinburg/ul_yumasheva_6/115188", "https://www.avito.ru/catalog/houses/ekaterinburg/ul_akademika_postovskogo_17a/3171365", ] async def main() -> None: async with AsyncSession( impersonate="chrome120", timeout=25, headers={ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "ru-RU,ru;q=0.9", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "none", }, ) as s: for url in URLS: print(f"\n=== {url} ===") try: r = await s.get(url) except Exception as e: # noqa: BLE001 print(f" FAIL fetch: {type(e).__name__}: {e}") continue print(f" status={r.status_code} size={len(r.content)}") if r.status_code != 200: continue text = r.text # Save first one для inspection if "yumasheva" in url: with Path("/tmp/avito-house-sample.html").open("wb") as f: f.write(r.content) print(" saved → /tmp/avito-house-sample.html") markers = { "__preloadedState__": "__preloadedState__" in text, "__NEXT_DATA__": "__NEXT_DATA__" in text, "__INITIAL_STATE__": "__INITIAL_STATE__" in text, "datadome": "datadome" in text.lower(), "captcha": "captcha" in text.lower(), "data-marker": "data-marker" in text, "data-app-state": "data-app-state" in text, "developmentData": "developmentData" in text, "avitoId": "avitoId" in text, "window.__": "window.__" in text, "