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")