mirror of
https://github.com/wasrusgen/zov-tech.git
synced 2026-06-03 17:24:49 +00:00
AI PROMPT (ai.py):
- Документирует новую форму checklist (per_cat.answers, brand_strategy, single_brand, brands, budget_preset, pick_strategies)
- Просит вернуть 3-5 моделей по КАЖДОЙ категории (не одну)
- Новый формат ответа: by_category[cat].models[] с brand/model/price_min/price_max/search_query/pros/cons/tier
- Подробные правила для бренд-стратегий (single → вся техника одной марки; different → preferred/acceptable/avoid)
- Бюджет-пресеты с авто-распределением по категориям (fridge ~25%, hob ~12% и т.д.)
DNS PARSER (parsers/dns.py):
- search_dns(query, limit) — HTTP + BeautifulSoup
- Реалистичный User-Agent, фолбэк на JSON-LD если HTML-селекторы не сработали
- enrich_models(models) — обогащает список моделей от AI, добавляя dns: {title, price, image, url, rating, reviews}
- Вежливая задержка 0.4с между запросами
MAIN.PY:
- /api/parse_dns?q=... — тестовый эндпоинт для проверки парсера
- _handle_podbor теперь после AI вызывает _enrich_ai_with_dns для каждой модели
- _format_podbor_for_telegram переписан под новый формат by_category — выводит 3-5 моделей в каждой категории с pros/cons
- Fallback на старый формат items[] для совместимости
REQUIREMENTS:
- + beautifulsoup4 >= 4.12
- + lxml >= 5.2
DEPLOY: после пуша на VPS нужно пересобрать backend контейнер (docker compose up --build -d backend)
28 lines
1.6 KiB
Python
28 lines
1.6 KiB
Python
"""Парсеры маркетплейсов для обогащения карточек моделей.
|
||
|
||
Подход MVP: парсим публичные HTML-страницы напрямую с VPS (без прокси).
|
||
При обнаружении anti-bot блокировок — переходим на резидентные прокси (Proxy6).
|
||
|
||
Источники:
|
||
- dns.py — DNS Shop (dns-shop.ru) — самый простой anti-bot, основной источник характеристик
|
||
- yamarket.py — Я.Маркет (market.yandex.ru) — для сравнения цен между магазинами
|
||
- wildberries.py — Wildberries (wildberries.ru) — для отзывов и рейтингов
|
||
|
||
Унифицированный формат результата:
|
||
{
|
||
"title": str, # Название как на странице
|
||
"url": str, # Ссылка на товар
|
||
"image_url": str | None, # URL основного фото
|
||
"price_min_rub": int | None, # Минимальная найденная цена
|
||
"price_max_rub": int | None, # Максимальная (если есть данные по нескольким магазинам)
|
||
"rating": float | None, # 0.0 - 5.0
|
||
"reviews_count": int | None, # Кол-во отзывов
|
||
"stores_count": int | None, # На скольких сайтах найдено (Я.Маркет)
|
||
"specs": dict[str, str], # Ключевые характеристики
|
||
"source": str, # "dns" / "yamarket" / "wildberries"
|
||
}
|
||
"""
|
||
from .dns import search_dns
|
||
|
||
__all__ = ["search_dns"]
|