f78f35fb3f
Парсер лидов МБ РФ: Яндекс.Карты + HH.ru + обогащение DaData/ЕГРЮЛ/Rusprofile + Streamlit CRM. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
108 lines
4.5 KiB
Python
108 lines
4.5 KiB
Python
"""
|
||
Phase 0 — разведочный тест Botasaurus на Яндекс.Картах.
|
||
|
||
Цель: убедиться, что Botasaurus открывает Яндекс.Карты, видит список
|
||
организаций и не получает captcha при базовом сценарии.
|
||
|
||
═══════════════════════════════════════════════════════════════════════
|
||
УСТАНОВКА (один раз, в свежем venv):
|
||
|
||
python -m venv venv
|
||
venv\\Scripts\\activate # Windows
|
||
# source venv/bin/activate # Linux/Mac
|
||
|
||
pip install -r requirements.txt
|
||
playwright install chromium
|
||
|
||
ЗАПУСК:
|
||
|
||
python test_yandex.py
|
||
|
||
ОЖИДАЕМЫЙ РЕЗУЛЬТАТ:
|
||
- Откроется headless Chrome
|
||
- В консоли: "Найдено карточек: N" (где N >= 5)
|
||
- Никакой captcha
|
||
═══════════════════════════════════════════════════════════════════════
|
||
"""
|
||
|
||
from botasaurus.browser import browser, Driver
|
||
|
||
|
||
# Селекторы Яндекс.Карт меняются — пробуем несколько вариантов подряд.
|
||
# Первый рабочий — фиксируем для прода.
|
||
SELECTORS_TO_TRY = [
|
||
".search-snippet-view",
|
||
'[class*="search-snippet-view"]',
|
||
'li[class*="search-snippet"]',
|
||
'[data-id="serp"]',
|
||
]
|
||
|
||
|
||
@browser(
|
||
headless=False, # Phase 0: видим что происходит. На VPS поставим True
|
||
block_images=True, # быстрее без картинок
|
||
reuse_driver=True, # один браузер на все вызовы (не пересоздаём окно)
|
||
)
|
||
def test_yandex_maps(driver: Driver, data: dict):
|
||
"""Открывает Яндекс.Карты с поисковым запросом и считает карточки."""
|
||
query = data.get("query", "кафе")
|
||
city_id = data.get("city_id", 213) # 213 = Москва в Яндекс.Картах
|
||
|
||
url = f"https://yandex.ru/maps/{city_id}/moscow/search/{query}/"
|
||
print(f"\n→ Открываю: {url}")
|
||
driver.get(url)
|
||
|
||
# Даём JS отрендерить карту и список
|
||
driver.sleep(5)
|
||
|
||
# Проверка на CAPTCHA — у Botasaurus есть встроенный детектор
|
||
detected_by = driver.get_bot_detected_by()
|
||
if detected_by:
|
||
print(f"⚠️ Детектор бота сработал: {detected_by}")
|
||
return {"status": "bot_detected", "detected_by": detected_by, "cards": 0}
|
||
|
||
# Дополнительная проверка по URL и DOM
|
||
if "showcaptcha" in driver.current_url or driver.select(".CheckboxCaptcha"):
|
||
print("⚠️ Получили CAPTCHA. IP/UA засветился.")
|
||
return {"status": "captcha", "cards": 0}
|
||
|
||
# Перебираем селекторы — ищем тот, который сработал
|
||
found_selector = None
|
||
cards_count = 0
|
||
for sel in SELECTORS_TO_TRY:
|
||
count = driver.count(sel)
|
||
if count > 0:
|
||
found_selector = sel
|
||
cards_count = count
|
||
break
|
||
|
||
if not found_selector:
|
||
print("⚠️ Список организаций не найден. Возможно, селекторы изменились.")
|
||
print(f" URL после загрузки: {driver.current_url}")
|
||
return {"status": "no_results", "cards": 0}
|
||
|
||
print(f"✓ Сработал селектор: {found_selector}")
|
||
print(f"✓ Найдено карточек: {cards_count}")
|
||
|
||
# Тест считается успешным, если карточек 5+
|
||
status = "ok" if cards_count >= 5 else "partial"
|
||
return {
|
||
"status": status,
|
||
"cards": cards_count,
|
||
"selector_used": found_selector,
|
||
}
|
||
|
||
|
||
if __name__ == "__main__":
|
||
# Тестируем 1 категорию. После успеха — добавим больше.
|
||
result = test_yandex_maps({"query": "кафе", "city_id": 213})
|
||
|
||
print("\n" + "=" * 60)
|
||
print(f"РЕЗУЛЬТАТ: {result}")
|
||
print("=" * 60)
|
||
|
||
# Что записать в sessions/2026-05-01_phase0_research.md:
|
||
# - status: ok / partial / captcha / bot_detected / no_results
|
||
# - cards: сколько найдено
|
||
# - selector_used: какой селектор сработал (для прода)
|