parsers: skip sponsored/ad URLs (cpc/sponsored=1) — they expire in 2-3 hours

User reported clicking matrix prices led to 'Произошла ошибка!' on OZON home page.
Cause: parsers captured /product/?sponsored=1&cpc=Jtiito95... links that died after few hours.

Fix:
- ozon.py: skip href with 'sponsored=1', '/promo/', 'cpc='. Strip query string from final URL.
- yamarket.py: skip 'sponsored=1', 'cpc=', 'advUuid' (Я.Маркет sponsored marker)
- citilink.py: strip query string from final URL (defensive)

Now matrix links go to canonical product pages that don't expire.
This commit is contained in:
wasrusgen 2026-05-11 17:20:59 +03:00
parent ef500fa446
commit c97b8dce3c
3 changed files with 12 additions and 3 deletions

View File

@ -62,7 +62,9 @@ def _parse_html(html: str, limit: int) -> list[dict[str, Any]]:
continue
seen_urls.add(product_id)
full_url = href if href.startswith("http") else f"{_BASE_URL}{href}"
# Финальный URL — БЕЗ query params (sponsored / cpc / tracking)
href_clean = href.split("?")[0]
full_url = href_clean if href_clean.startswith("http") else f"{_BASE_URL}{href_clean}"
# Поднимаемся к родительской карточке — у Citilink CSS-in-JS, поэтому
# ищем ближайший div, в котором есть и цена и название

View File

@ -64,13 +64,17 @@ def _parse_html(html: str, limit: int) -> list[dict[str, Any]]:
break
href = link.get("href") or ""
# Нормализация URL — убираем query params для дедупа
# Пропускаем спонсорные ссылки — они истекают через 2-3 часа
if "sponsored=1" in href or "/promo/" in href or "cpc=" in href:
continue
# Чистим URL — убираем все query-параметры
url_clean = href.split("?")[0]
if url_clean in seen_urls:
continue
seen_urls.add(url_clean)
full_url = href if href.startswith("http") else f"{_BASE_URL}{href}"
# Финальный URL — БЕЗ query params (sponsored ссылки иначе через 2-3ч 404)
full_url = url_clean if url_clean.startswith("http") else f"{_BASE_URL}{url_clean}"
# Поднимаемся до карточки — у OZON это обычно ближайший div с tile-* классом
card = (

View File

@ -67,6 +67,9 @@ def _parse_html(html: str, limit: int) -> list[dict[str, Any]]:
if len(results) >= limit:
break
href = link.get("href") or ""
# Пропускаем sponsored — их URL'ы с CPC-токенами истекают через несколько часов
if "sponsored=1" in href or "cpc=" in href or "advUuid" in href:
continue
m_id = re.search(r"/card/[^/]+/(\d+)", href)
if not m_id:
continue