Проектируем сводку: что собирать и как проверять

Представь, что ты попросил помощника переписать с витрины цену телевизора. Он вернулся и сказал: «8 415 рублей». Ты удивился: так дёшево? Оказалось, на ценнике мелко было «8 415 ₽/мес по акции». Помощник не врал специально, он взял первое похожее на цену число. Ровно это случилось в прогоне курса со сборщиком «Кодиума». В этом уроке проектируем сводку так, чтобы такие ошибки было видно сразу.

Чему научишься в этом уроке:
• решать, какие поля брать со страницы и чем они отличаются;
• писать «нет в HTML» вместо догадки;
• искать на странице структурированные данные;
• требовать от сборщика таблицу «значение → фрагмент» и проверять её.

Что берём со страницы

Для сводки по курсам «Кодиуму» нужно пять вещей. Каждую стоит описать заранее, иначе сборщик сам решит, что считать ценой.

  • Название курса, чтобы владелец понял, о чём речь.
  • Цена курса целиком: целое число рублей.
  • Платёж в месяц отдельным полем. Школы часто показывают крупно именно его, и путать его с ценой нельзя.
  • Скидка или акция отдельно: «−45%», «скидка».
  • Длительность обучения и ближайший старт потока.

Для каждого поля пиши, откуда его можно брать, а откуда нельзя. В прогоне агент принял фразу «Уже через 2 месяца сможете зарабатывать…» за длительность курса, а «Последнее обновление 16.05.2025» за дату старта. Значит, в описании полей нужны такие правила: длительность берём только из блока с подписью «длительность» или «срок обучения»; даты рядом со словами «обновление», «опубликовано», «изменено» стартом не считаются.

«Нет в HTML» лучше догадки

Страница сайта приходит к программе как текст с разметкой, его называют HTML. Браузер потом дорисовывает часть страницы скриптами. Сборщик видит только то, что пришло в HTML. В прогоне у Хекслета и Практикума цен и сроков в HTML не оказалось, скорее всего, их подгружает скрипт. Правильный ответ сборщика в таком случае «нет в HTML».

Кажется, что пустое поле хуже, чем хоть какое-то число. На деле наоборот: пустое поле владелец видит и понимает, а неверное число принимает за правду. Если очень нужна цена, которой нет в HTML, это разговор с заказчиком о другом источнике, а не повод сборщику угадывать.

Структурированные данные: ценник для роботов

Многие сайты кладут в страницу отдельный аккуратный ценник для поисковых систем. Человек его не видит, а программа читает легко. Таких ценников два вида:

  • JSON-LD: блок <script type="application/ld+json"> с полями name, price, priceCurrency, startDate. Это данные о курсе в виде «поле: значение».
  • meta-теги: строки вида og:title в заголовке страницы, по ним соцсети строят превью ссылки.

Правило сборщика «Кодиума»: сначала ищем структурированные данные, только если их нет, разбираем текст страницы. Проверить самому просто: открой страницу курса, нажми Ctrl+U (показать код страницы), затем Ctrl+F и найди ld+json. Есть совпадение, значит, ценник для роботов на странице есть.

Окно «исходный код страницы» курса Skillbox «Профессия Python-разработчик + ИИ» с поиском «ld+json» (2 из 4). Подсвечен блок script type="application/ld+json" с типом Course: в нём только name и provider, цены нет. Ниже красная плашка: платёж в месяц лежит в обычной вёрстке — «8 415 ₽/мес», рядом скидка «−45%». Настоящий фрагмент от 10.10.2026, длинные места сокращены.

Таблица «значение → фрагмент»

Главное правило паттерна. К каждому значению сборщик сохраняет, откуда его взял: JSON-LD, meta или текст, и точный кусок страницы до 80 символов. Тогда проверка занимает минуту: смотришь значение и рядом фрагмент.

школа     поле             значение   источник  фрагмент
Skillbox  платёж в месяц   8 415      текст     «8 415 ₽/мес −45%»
Skillbox  длительность     нет в HTML —         —
Stepik    старт            нет в HTML —         —

Эту таблицу видно сразу: в строке Skillbox фрагмент «/мес», значит, это платёж в месяц, не цена курса. Без фрагмента ты увидел бы только «8 415» и поверил бы. Позже модель, которая пишет вывод владельцу, будет брать цитату именно из этого фрагмента.

Прогон курса показал: агент несколько раз писал «все значения проверены, ложных данных нет», а при ручной сверке одной страницы находилась ошибка. Поэтому вторая половина правила: хотя бы одну страницу открываешь сам и сверяешь таблицу глазами.

Где храним и кто считает изменения

Каждый день сборщик сохраняет снимок: дата, школа, поля, источник, фрагмент. Хранить будем в SQLite, это база в одном файле, она встроена в Python и не требует отдельного сервера. Персональных данных в ней нет.

Что поменялось со вчера, считает код: сравнил два снимка, нашёл отличия. Языковая модель здесь не нужна и даже вредна, она может «увидеть» изменение, которого нет. Модель подключается только после, чтобы объяснить найденное человеческими словами. Так же устроен разбор отзывов в треке 3: считает код, модель формулирует, к каждому выводу цитата (урок 4.3 трека 3).

Схема: две таблицы «Снимок вчера» и «Снимок сегодня» с колонками школа, платёж в месяц, старт (Skillbox, Хекслет, Stepik). Между ними стрелка «сравнивает КОД». У Skillbox платёж в месяц выделен: 9 200 ₽ вчера, 8 415 ₽ сегодня. Ниже итог «Skillbox, платёж в месяц: 9 200 ₽ → 8 415 ₽» и блок «модель объясняет, что это значит для Кодиума, и ставит цитату из фрагмента страницы». 9 200 ₽ — тестовое изменение из прогона.

Контрольный вопрос. Сборщик вернул цену Skillbox 8 415 ₽ с фрагментом «8 415 ₽/мес −45%». Что делаешь?

АОставляю, раз число есть на странице
БУдаляю Skillbox из списка
ВСохраняю 8 415 как платёж в месяц, а скидку −45% отдельно
ГУмножаю на 12 и записываю как цену

Подсказка: Что означает «/мес» во фрагменте?

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Контрольный вопрос. На странице курса в HTML нет даты старта, есть только «Последнее обновление 16.05.2025». Что должен записать сборщик?

А16.05.2025
БДату завтрашнего дня
ВДату из прошлого снимка
Г«нет в HTML»

Подсказка: Это дата старта потока или дата правки страницы?

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Контрольный вопрос. Кто в сводке «Кодиума» решает, что изменилось со вчера?

АЯзыковая модель по двум снимкам
БКод, сравнивая снимки в базе
ВВладелец вручную
ГСайт конкурента

Подсказка: Кому ты больше доверишь сравнить два числа?

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Задание. МИССИЯ «Проект сводки». 1. Для своего заказчика возьми 3 источника из прошлой миссии. 2. Опиши поля, которые берёшь (как у «Кодиума»: что за поле, откуда можно брать, откуда нельзя). 3. Открой одну страницу, нажми Ctrl+U и поищи ld+json и og:title. Запиши, есть ли структурированные данные. 4. Заполни руками таблицу «значение → фрагмент» для этой страницы: поле, значение, источник, точный фрагмент до 80 символов. Где значения нет, напиши «нет в HTML». Принято, если: приложены описание полей, таблица «значение → фрагмент» на одну страницу и снимок экрана кода страницы с найденным ld+json (или с пустым поиском, если его нет).

Подсказка: Фрагмент должен содержать само значение, иначе это не доказательство.

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Что дальше

Проект готов. В следующем уроке Claude Code соберёт сборщик по этому проекту, и мы пройдём все ошибки прогона: как их заметить и какими словами вернуть агенту.

Итог:
• поля описаны заранее: цена, платёж в месяц, скидка, длительность, старт;
• «нет в HTML» честнее догадки;
• сначала структурированные данные, потом текст;
• к каждому значению фрагмент страницы, одну страницу сверяешь сам;
• изменения считает код, модель только объясняет.

← Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева