Загрузка данных
Ты работаешь в проекте:
/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 секунд.