Загрузка данных


Ты работаешь в проекте:

/home/sigma.sbrf.ru@23865613/home/work/skil-scrap/adt-markdownify-meta

Контекст:
У нас уже есть режим cdp_existing. Он нужен для подключения к уже открытому SberBrowser через remote-debugging-port=9222.

Проблема:
Скрипт не должен каждый раз запускать новый SberBrowser и не должен закрывать уже открытый SberBrowser.
Пользователь сам запускает SberBrowser вручную командой:

/opt/Sberbrowser/sberbrowser/sberbrowser \
  --remote-debugging-port=9222 \
  --user-data-dir=/tmp/sberbrowser-meta-profile \
  --no-sandbox \
  --disable-setuid-sandbox \
  --disable-dev-shm-usage

После этого пользователь сам открывает нужную вкладку META.
Скрипт должен только подключиться к уже открытому браузеру, найти вкладку и выгрузить HTML.

Задача:
Доработать режим cdp_existing так, чтобы он:
1. Не запускал SberBrowser.
2. Не закрывал SberBrowser.
3. Подключался к уже открытому SberBrowser через connect_over_cdp.
4. Искал уже открытую вкладку META.
5. Ждал появления вкладки максимум 60 секунд, а не 120 секунд.
6. После выгрузки отключался от CDP, но не закрывал браузер.

Важно:
- Не удаляй browser mode.
- Не удаляй cdp_existing mode.
- Не добавляй API.
- Не добавляй endpoint-ы.
- Не добавляй requests/httpx/aiohttp/urllib.
- Не добавляй token, cookie, login, password.
- Не сохраняй cookies.
- Не сохраняй session storage/local storage.
- Не запускай полный проект автоматически.
- Сейчас только правки кода и конфига.

Нужно изменить только:

1. meta_exporter.yaml.example
2. scripts/scrape_meta.py
3. README.md, если там есть инструкция по cdp_existing

Файл meta_exporter.yaml.example

В блок cdp добавь timeout:

cdp:
  endpoint_url: "http://127.0.0.1:9222"
  target_url_contains: "sberbank.ru"
  fallback_title: "META page"
  wait_timeout_seconds: 60
  poll_interval_seconds: 2

Важно:
target_url_contains лучше поставить "sberbank.ru", а не только "meta.sberbank.ru", потому что адрес может отличаться.

Файл scripts/scrape_meta.py

Нужно доработать функцию export_meta_from_existing_browser(config: dict).

Логика должна быть такая:

1. Прочитать настройки:

endpoint_url = config["cdp"]["endpoint_url"]
target_url_contains = config["cdp"]["target_url_contains"]
fallback_title = config["cdp"].get("fallback_title", "META page")
wait_timeout_seconds = config["cdp"].get("wait_timeout_seconds", 60)
poll_interval_seconds = config["cdp"].get("poll_interval_seconds", 2)

2. Подключиться к открытому браузеру:

browser = pw.chromium.connect_over_cdp(endpoint_url)

3. Не создавать новую страницу через new_page().
4. Не вызывать page.goto().
5. Не вызывать browser.close().
6. Искать вкладку среди уже открытых страниц:

for context in browser.contexts:
    for page in context.pages:
        if target_url_contains in page.url:
            target_page = page

7. Если вкладка сразу не найдена:
   - ждать до wait_timeout_seconds;
   - каждые poll_interval_seconds повторно просматривать browser.contexts и context.pages;
   - выводить понятное сообщение:
     "Ожидаю открытую вкладку META до 60 секунд..."

8. Если вкладка не найдена за 60 секунд:
   - вызвать browser.disconnect(), если метод доступен;
   - вывести понятную ошибку:
     "Не найдена открытая вкладка META. Откройте META в SberBrowser, который запущен с --remote-debugging-port=9222"
   - завершить без закрытия SberBrowser.

9. Если вкладка найдена:
   - вывести URL найденной вкладки;
   - получить url = target_page.url;
   - получить title = target_page.title().strip(), если возможно;
   - если title пустой, использовать fallback_title;
   - получить html = target_page.content();
   - сохранить HTML через save_html(temp_html_dir, title, html);
   - конвертировать HTML через build_meta_markdown(html, url);
   - сохранить Markdown через write_markdown(output_dir, title, url, markdown);
   - создать README.md через write_index(output_dir, exported_files);
   - вывести путь к созданному Markdown.

10. После завершения:
   - НЕ вызывать browser.close().
   - Вызвать browser.disconnect(), если такой метод есть.
   - Если disconnect недоступен, просто выйти из функции.
   - SberBrowser должен остаться открытым.

Добавь вспомогательную функцию, если так проще:

def find_existing_page(browser, target_url_contains: str):
    for context in browser.contexts:
        for page in context.pages:
            if target_url_contains in page.url:
                return page
    return None

Важно:
Если в браузере несколько вкладок с sberbank.ru, лучше вывести список найденных вкладок с их URL, а выбрать первую, где URL содержит target_url_contains.

README.md

Обновить инструкцию для cdp_existing:

1. Сначала вручную запустить SberBrowser с портом 9222.
2. Не закрывать терминал, где запущен SberBrowser.
3. В этом SberBrowser открыть нужную страницу META.
4. В другом терминале запустить:
   source .venv/bin/activate
   export PLAYWRIGHT_NODEJS_PATH=/usr/bin/node
   python run_exporter.py
5. Скрипт не закрывает SberBrowser.
6. Скрипт ждёт вкладку 60 секунд.

Проверка после правок:

Выполни только проверку синтаксиса:

python -m py_compile run_exporter.py scripts/config_loader.py scripts/scrape_meta.py scripts/html_to_markdown.py scripts/markdown_writer.py

Не запускай python run_exporter.py автоматически.

В конце покажи:
1. обновлённый блок cdp из meta_exporter.yaml.example;
2. полный код функции export_meta_from_existing_browser;
3. полный код вспомогательной функции find_existing_page, если добавил;
4. кратко напиши, что SberBrowser теперь не закрывается и ожидание вкладки равно 60 секунд.