Files
parser-v1/_archive/phase0/test_yandex.py
T
Aks f78f35fb3f init: Parser v1 — Lead Generation Engine
Парсер лидов МБ РФ: Яндекс.Карты + HH.ru + обогащение DaData/ЕГРЮЛ/Rusprofile + Streamlit CRM.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 12:56:06 +03:00

108 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
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: какой селектор сработал (для прода)