""" 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: какой селектор сработал (для прода)