import pandas as pd import os from pathlib import Path from playwright.sync_api import sync_playwright import time from playwright.sync_api import TimeoutError MAX_RETRIES = 3 def try_click_export_elements(page): for attempt in range(1, MAX_RETRIES + 1): try: print(f"🔁 Спроба {attempt} відкрити меню експорту...") page.wait_for_selector(".css-1s2u09g-control", timeout=5000) page.click(".css-1s2u09g-control") print("🖱 Спроба натиснути Export...") page.get_by_text("Export", exact=True).click() return True # успішно except TimeoutError as e: print(f"⚠️ Не вдалося натиснути. Спроба {attempt} з {MAX_RETRIES}") if attempt == MAX_RETRIES: raise Exception("❌ Неможливо натиснути меню або Export після кількох спроб.") page.wait_for_timeout(2000) # почекати перед новою спробою # === Константи === csv_path = "Decibel_media_plans_UK_jul8.csv" base_download_dir = Path.home() / "Downloads" / "media_plans_jul8" state_path = "state.json" # === Завантаження CSV df = pd.read_csv(csv_path) with sync_playwright() as p: browser = p.chromium.launch(headless=False) # Авторизація через state.json if os.path.exists(state_path): context = browser.new_context(storage_state=state_path, accept_downloads=True) else: context = browser.new_context(accept_downloads=True) page = context.new_page() page.goto("https://decibel.stream") input("🔐 Залогінься вручну в браузері, потім натисни Enter...") context.storage_state(path=state_path) page.close() page = context.new_page() for idx, row in df.iterrows(): if pd.notnull(row.get('file_name')) and str(row['file_name']).strip() != "": continue # Пропустити вже оброблене try: url = row['url'] label = str(row['label_name']).strip() project_name = str(row['project_name']).strip() plan_id = str(row['media_plan_id']).strip() plan_name = str(row['media_plan_name']).strip().replace('/', '-').replace('\\', '-') filename = f"{project_name} - {plan_name} – {plan_id}.xlsx" target_dir = base_download_dir / label target_dir.mkdir(parents=True, exist_ok=True) save_path = target_dir / filename print(f"\n🌐 Відкриваю: {url}") page.goto(url) page.wait_for_load_state("networkidle") page.wait_for_selector(".css-1s2u09g-control", timeout=15000) with page.expect_download(timeout=30000) as download_info: try_click_export_elements(page) download = download_info.value download.save_as(str(save_path)) print(f"✅ Збережено: {save_path}") # ✅ Оновити CSV df.at[idx, 'file_name'] = filename df.to_csv(csv_path, index=False) print("📄 CSV оновлено.") except Exception as e: print(f"⚠️ Помилка на {url}: {e}") continue context.close() browser.close()