87 lines
4.2 KiB
Python
87 lines
4.2 KiB
Python
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")
|