mirror of
https://github.com/wasrusgen/zov-tech.git
synced 2026-06-03 17:04:48 +00:00
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:
parent
ef500fa446
commit
c97b8dce3c
@ -62,7 +62,9 @@ def _parse_html(html: str, limit: int) -> list[dict[str, Any]]:
|
|||||||
continue
|
continue
|
||||||
seen_urls.add(product_id)
|
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, поэтому
|
# Поднимаемся к родительской карточке — у Citilink CSS-in-JS, поэтому
|
||||||
# ищем ближайший div, в котором есть и цена и название
|
# ищем ближайший div, в котором есть и цена и название
|
||||||
|
|||||||
@ -64,13 +64,17 @@ def _parse_html(html: str, limit: int) -> list[dict[str, Any]]:
|
|||||||
break
|
break
|
||||||
|
|
||||||
href = link.get("href") or ""
|
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]
|
url_clean = href.split("?")[0]
|
||||||
if url_clean in seen_urls:
|
if url_clean in seen_urls:
|
||||||
continue
|
continue
|
||||||
seen_urls.add(url_clean)
|
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-* классом
|
# Поднимаемся до карточки — у OZON это обычно ближайший div с tile-* классом
|
||||||
card = (
|
card = (
|
||||||
|
|||||||
@ -67,6 +67,9 @@ def _parse_html(html: str, limit: int) -> list[dict[str, Any]]:
|
|||||||
if len(results) >= limit:
|
if len(results) >= limit:
|
||||||
break
|
break
|
||||||
href = link.get("href") or ""
|
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)
|
m_id = re.search(r"/card/[^/]+/(\d+)", href)
|
||||||
if not m_id:
|
if not m_id:
|
||||||
continue
|
continue
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user