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:
Aks
2026-06-09 12:56:06 +03:00
commit f78f35fb3f
33 changed files with 9198 additions and 0 deletions
+107
View File
@@ -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: какой селектор сработал (для прода)