domovoy_bot/scraper_gis/mcp_full_parser.py

87 lines
4.2 KiB
Python
Raw Permalink 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.

from playwright.sync_api import sync_playwright
import time
import os
EXPORT_DIR = "/app/exports"
if not os.path.exists(EXPORT_DIR):
os.makedirs(EXPORT_DIR)
print("🚀 Запускаем глубокий скрейпинг Личного кабинета ГИС ЖКХ...")
def handle_download(download):
print(f"📥 Обнаружено скачивание файла: {download.suggested_filename}")
filepath = os.path.join(EXPORT_DIR, download.suggested_filename)
download.save_as(filepath)
print(f"✅ Файл успешно сохранен: {filepath}")
with sync_playwright() as p:
browser = p.chromium.launch_persistent_context(
user_data_dir="/app/browser_context",
headless=True,
accept_downloads=True,
args=[
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--disable-gpu',
'--window-size=1920,1080'
]
)
page = browser.pages[0]
# Привязываем обработчик скачиваний
page.on("download", handle_download)
# 1. Переход на главную
print("🌐 Переходим на главную страницу ЛК (dom.gosuslugi.ru)...")
page.goto("https://dom.gosuslugi.ru/#!/main")
page.wait_for_timeout(7000) # Ждем прогрузки дашборда
# Скриншот главной
page.screenshot(path=os.path.join(EXPORT_DIR, "01_Main_Dashboard.png"), full_page=True)
print("📸 Скриншот: Главный дашборд сохранен.")
# 2. Ищем и кликаем по основным разделам
sections = [
{"name": "Обращения", "text": "Обращения"},
{"name": "ОплатаКУ", "text": "Оплата"},
{"name": "Договоры", "text": "Договор"},
{"name": "Голосования", "text": "Голосования"}
]
for i, sec in enumerate(sections, start=2):
print(f"🔍 Ищем раздел: {sec['name']}...")
try:
# Ищем ссылку или кнопку, содержащую нужный текст (игнорируем регистр)
# В SPA-приложениях вроде ГИС ЖКХ элементы часто подгружаются динамически
element = page.locator(f"text=/{sec['text']}/i").first
if element.is_visible():
print(f"✅ Найден раздел {sec['name']}, кликаем...")
element.click()
page.wait_for_timeout(5000) # Ждем прогрузки страницы
# Скриншот раздела
scr_name = f"{i:02d}_{sec['name']}.png"
page.screenshot(path=os.path.join(EXPORT_DIR, scr_name), full_page=True)
print(f"📸 Скриншот раздела сохранен: {scr_name}")
# Поиск кнопок "Скачать" или "Экспорт"
print("⏬ Проверяем наличие вложений для скачивания...")
download_btns = page.locator("text=/скачать|экспорт|download|pdf|docx|zip/i").all()
for btn in download_btns:
if btn.is_visible():
print("Кликаем по кнопке скачивания...")
btn.click()
page.wait_for_timeout(3000) # Даем время на инициализацию загрузки
# Возврат на главную для следующего цикла
page.goto("https://dom.gosuslugi.ru/#!/main")
page.wait_for_timeout(4000)
else:
print(f"⚠️ Раздел {sec['name']} не найден или скрыт.")
except Exception as e:
print(f"❌ Ошибка при переходе в {sec['name']}: {e}")
browser.close()
print("🏁 Скрейпинг завершен! Все файлы в папке /app/exports")