init: Parser v1 — Lead Generation Engine
Парсер лидов МБ РФ: Яндекс.Карты + HH.ru + обогащение DaData/ЕГРЮЛ/Rusprofile + Streamlit CRM. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
"""
|
||||
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: какой селектор сработал (для прода)
|
||||
Reference in New Issue
Block a user