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


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

/Users/23865613/IdeaProjects/untitled/zadanie2/source_project

Контекст:
Проект уже умеет выгружать META в Markdown и создавать структурированную архитектуру в:

projects/SNL/meta

Также уже создан модуль:

scripts/structured_meta_writer.py

Но есть две проблемы:

1. META — это SPA-интерфейс. Часть данных на странице может быть свернута или не подгружена, пока пользователь не нажмет на раскрывающиеся блоки, вкладки, строки таблиц или не прокрутит страницу.
2. Markdown-файлы сейчас нужно сделать более читаемыми для наставника: меньше технического мусора, больше структурированных разделов, таблиц и понятных заголовков.

Задача:
Доработать проект так, чтобы перед сохранением HTML скрипт максимально раскрывал страницу META и сохранял более полный HTML, а итоговые Markdown-файлы были удобны для чтения.

Важно:
- Не переписывай проект с нуля.
- Не ломай текущую выгрузку output/*.md.
- Не ломай структурированную выгрузку projects/SNL/meta.
- Не используй API META.
- Не используй requests/httpx/aiohttp/urllib для обращения к META.
- Не добавляй token/cookie/login/password.
- Не сохраняй cookies/sessionStorage/localStorage.
- Авторизация только вручную через SberBrowser.
- Skill остается read-only.
- Не создавай, не редактируй и не удаляй объекты META.
- Не нажимай кнопку "Создать".
- Не выполняй write-операции в META.

---

# Часть 1. Добавить раскрытие страницы перед сохранением HTML

Нужно доработать scripts/scrape_meta.py.

Перед вызовом page.content() нужно выполнить функцию, которая максимально раскрывает страницу:

expand_meta_page(page)

Создай эту функцию в scripts/scrape_meta.py или отдельном файле scripts/meta_page_expander.py.

Функция должна быть безопасной и read-only.

Что должна делать функция:

1. Дождаться загрузки страницы:
   - page.wait_for_load_state("domcontentloaded")
   - небольшая пауза 2-3 секунды для SPA-рендера.

2. Прокрутить страницу вниз и вверх:
   - несколько раз window.scrollTo(0, document.body.scrollHeight)
   - затем window.scrollTo(0, 0)
   - между прокрутками делать короткую паузу.

3. Попробовать раскрыть свернутые блоки:
   Нужно искать и нажимать только безопасные элементы, которые НЕ создают и НЕ изменяют данные.

Безопасные тексты/селекторы для клика:
- "Показать еще"
- "Показать всё"
- "Раскрыть"
- "Развернуть"
- "Еще"
- "Все"
- стрелки раскрытия таблиц/аккордеонов
- элементы с aria-expanded="false"
- кнопки/элементы раскрытия внутри таблиц

Нельзя нажимать:
- "Создать"
- "Сохранить"
- "Удалить"
- "Редактировать"
- "Добавить"
- "Заполнить с AI"
- "Отправить"
- "Согласовать"
- "Опубликовать"
- любые кнопки write-операций.

Сделай deny-list текстов:

CREATE / SAVE / DELETE / EDIT / ADD / SUBMIT / AI / WRITE

и русские аналоги:

Создать
Сохранить
Удалить
Редактировать
Добавить
Заполнить
Заполнить с AI
Отправить
Согласовать
Опубликовать

Если текст кнопки содержит слово из deny-list — не нажимать.

4. Раскрыть таблицы:
   Если на странице есть таблица, попробовать:
   - прокрутить таблицу горизонтально вправо;
   - прокрутить таблицу вниз;
   - раскрыть строки, если у строк есть стрелка/chevron.

5. После раскрытия снова прокрутить страницу вниз и вверх.

6. Если на каком-то клике ошибка — не падать, а логировать warning и продолжать.

7. В логах явно выводить:
   - сколько элементов пытались раскрыть;
   - сколько успешно раскрыто;
   - сколько пропущено из-за deny-list;
   - сколько ошибок при раскрытии.

Пример логов:

EXPAND START
EXPAND scroll page
EXPAND clicked: ...
EXPAND skipped unsafe button: Создать
EXPAND DONE clicked=12 skipped=3 errors=1

---

# Часть 2. Добавить настройку в конфиг

В meta_exporter.yaml.example добавь:

page_expansion:
  enabled: true
  scroll_rounds: 5
  click_expandable: true
  max_clicks: 80
  wait_after_click_ms: 300

Если в meta_exporter.yaml такой секции нет, использовать дефолты.

---

# Часть 3. Улучшить читаемость Markdown

Нужно доработать scripts/html_to_markdown.py и/или scripts/markdown_writer.py так, чтобы Markdown был читаемым.

Общие правила:

1. Удалять навигационный мусор:
   - верхнее меню META;
   - повторяющиеся breadcrumb-строки;
   - пустые ссылки;
   - системные кнопки;
   - лишние повторяющиеся статусы;
   - слишком длинные неструктурированные строки без смысла.

2. Сохранять полезные данные:
   - название объекта;
   - тип объекта;
   - код объекта;
   - статус ЖЦ;
   - владелец;
   - родитель;
   - связанные объекты;
   - таблицы;
   - ссылки на связанные объекты;
   - атрибуты.

3. Для каждого итогового Markdown-файла должна быть понятная структура:

# Название объекта или раздела

## Источник

URL страницы META.

## Тип объекта

АС / ФП / Модуль / Подмодуль / Технический компонент / Точка взаимодействия / Интеграционное взаимодействие / Стенд.

## Основная информация

Таблица:

| Поле | Значение |
|---|---|

## Атрибуты

Таблица, если найдена.

## Связанные объекты

Список или таблица.

## Исходные данные

Краткий очищенный фрагмент данных, если структурный парсинг не смог всё распознать.

4. Для output/*.md:
   - HIERARCHY.md должен быть кратким и структурированным.
   - INTERACTION_POINTS.md должен содержать список/таблицу точек взаимодействия.
   - INTEGRATION_INTERACTIONS.md должен содержать таблицу/список интеграционных взаимодействий.
   - STANDS.md должен содержать таблицу стендов.
   - TECH_RESOURCES.md должен содержать список технических компонентов.
   - ATTRIBUTES.md должен содержать атрибуты в таблицах.
   - EXPORT_REPORT.md должен быть отчетом о запуске, а не сырой выгрузкой.

5. Для projects/SNL/meta/**/*.md:
   Каждый README.md должен быть читаемым:

# Название

## Тип объекта

## Родитель

## Источник META

## Основная информация

## Атрибуты

## Связанные объекты

## Ограничения выгрузки

Если данных нет, писать честно:
"Данные не найдены в текущей выгрузке."

Не выдумывать значения.

---

# Часть 4. Добавить отдельный отчет качества Markdown

Создай новый файл после запуска:

output/MARKDOWN_QUALITY_REPORT.md

В нем должно быть:

# Отчет качества Markdown

## Проверенные файлы

Таблица:

| Файл | Размер | Есть заголовок | Есть источник | Есть структурные разделы | Статус |
|---|---:|---|---|---|---|

Проверить основные файлы:

- output/HIERARCHY.md
- output/INTERACTION_POINTS.md
- output/INTEGRATION_INTERACTIONS.md
- output/STANDS.md
- output/TECH_RESOURCES.md
- output/INTERACTIONS.md
- output/ATTRIBUTES.md
- output/EXPORT_REPORT.md
- output/TASK_COVERAGE.md

Статусы:
- OK
- PARTIAL
- EMPTY
- NEEDS_REVIEW

Также проверить несколько файлов из projects/SNL/meta.

---

# Часть 5. Не ломать текущую структуру

После доработки должны по-прежнему создаваться:

output/*.md
temp_html/*.html
projects/SNL/meta/**/*.md

---

# Часть 6. Проверка

Выполни:

python -m py_compile run_exporter.py scripts/*.py

Потом тестовый запуск:

source .venv/bin/activate
python run_exporter.py

После запуска проверь:

find output -maxdepth 1 -type f | sort
find projects/SNL/meta -maxdepth 6 -type f | sort
ls -lh output/*.md

Также покажи первые 80 строк файлов:

head -80 output/HIERARCHY.md
head -80 output/INTERACTION_POINTS.md
head -80 output/INTEGRATION_INTERACTIONS.md
head -80 output/STANDS.md
head -80 output/TECH_RESOURCES.md
head -80 output/MARKDOWN_QUALITY_REPORT.md

---

# Финальный отчет

В конце покажи:

# Этап 3 — полное раскрытие страниц и читаемый Markdown

## 1. Что изменено

## 2. Как теперь раскрывается META-страница перед сохранением HTML

## 3. Какие unsafe-кнопки не нажимаются

## 4. Какие Markdown-файлы стали читаемее

## 5. Какие файлы добавлены

## 6. Какие файлы изменены

## 7. Где лежит структурированная архитектура

projects/SNL/meta

## 8. Результат py_compile

## 9. Результат тестового запуска

- всего URL;
- успешно;
- ошибок;
- сколько файлов output создано;
- сколько файлов projects/SNL/meta создано.

## 10. Ограничения

Честно указать:
- если данные скрыты внутри карточек, которые открываются только отдельным кликом по объекту, их нужно выгружать через отдельный URL карточки;
- если таблица виртуализированная, могут быть видны только строки, которые META отрендерила в DOM;
- write-операции не выполняются.

Главная цель:
Сделать так, чтобы skill выгружал максимально полный HTML из META, раскрывал свернутые read-only блоки и формировал читаемые Markdown-файлы для демонстрации наставнику.