49 lines
2.1 KiB
Python
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())
|