Представь, что ты попросил помощника переписать с витрины цену телевизора. Он вернулся и сказал: «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. Есть совпадение, значит, ценник для роботов на странице есть.

Таблица «значение → фрагмент»
Главное правило паттерна. К каждому значению сборщик сохраняет, откуда его взял: JSON-LD, meta или текст, и точный кусок страницы до 80 символов. Тогда проверка занимает минуту: смотришь значение и рядом фрагмент.
школа поле значение источник фрагмент
Skillbox платёж в месяц 8 415 текст «8 415 ₽/мес −45%»
Skillbox длительность нет в HTML — —
Stepik старт нет в HTML — —
Эту таблицу видно сразу: в строке Skillbox фрагмент «/мес», значит, это платёж в месяц, не цена курса. Без фрагмента ты увидел бы только «8 415» и поверил бы. Позже модель, которая пишет вывод владельцу, будет брать цитату именно из этого фрагмента.
Прогон курса показал: агент несколько раз писал «все значения проверены, ложных данных нет», а при ручной сверке одной страницы находилась ошибка. Поэтому вторая половина правила: хотя бы одну страницу открываешь сам и сверяешь таблицу глазами.
Где храним и кто считает изменения
Каждый день сборщик сохраняет снимок: дата, школа, поля, источник, фрагмент. Хранить будем в SQLite, это база в одном файле, она встроена в Python и не требует отдельного сервера. Персональных данных в ней нет.
Что поменялось со вчера, считает код: сравнил два снимка, нашёл отличия. Языковая модель здесь не нужна и даже вредна, она может «увидеть» изменение, которого нет. Модель подключается только после, чтобы объяснить найденное человеческими словами. Так же устроен разбор отзывов в треке 3: считает код, модель формулирует, к каждому выводу цитата (урок 4.3 трека 3).

Контрольный вопрос. Сборщик вернул цену Skillbox 8 415 ₽ с фрагментом «8 415 ₽/мес −45%». Что делаешь?
Подсказка: Что означает «/мес» во фрагменте?
На курсе задания проверяются автоматически. Решить первое задание бесплатно → · Подобрать курс
Контрольный вопрос. На странице курса в HTML нет даты старта, есть только «Последнее обновление 16.05.2025». Что должен записать сборщик?
Подсказка: Это дата старта потока или дата правки страницы?
На курсе задания проверяются автоматически. Решить первое задание бесплатно → · Подобрать курс
Контрольный вопрос. Кто в сводке «Кодиума» решает, что изменилось со вчера?
Подсказка: Кому ты больше доверишь сравнить два числа?
На курсе задания проверяются автоматически. Решить первое задание бесплатно → · Подобрать курс
Задание. МИССИЯ «Проект сводки». 1. Для своего заказчика возьми 3 источника из прошлой миссии. 2. Опиши поля, которые берёшь (как у «Кодиума»: что за поле, откуда можно брать, откуда нельзя). 3. Открой одну страницу, нажми Ctrl+U и поищи ld+json и og:title. Запиши, есть ли структурированные данные. 4. Заполни руками таблицу «значение → фрагмент» для этой страницы: поле, значение, источник, точный фрагмент до 80 символов. Где значения нет, напиши «нет в HTML». Принято, если: приложены описание полей, таблица «значение → фрагмент» на одну страницу и снимок экрана кода страницы с найденным ld+json (или с пустым поиском, если его нет).
Подсказка: Фрагмент должен содержать само значение, иначе это не доказательство.
✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.
На курсе задания проверяются автоматически. Решить первое задание бесплатно → · Подобрать курс
Что дальше
Проект готов. В следующем уроке Claude Code соберёт сборщик по этому проекту, и мы пройдём все ошибки прогона: как их заметить и какими словами вернуть агенту.
Итог:
• поля описаны заранее: цена, платёж в месяц, скидка, длительность, старт;
• «нет в HTML» честнее догадки;
• сначала структурированные данные, потом текст;
• к каждому значению фрагмент страницы, одну страницу сверяешь сам;
• изменения считает код, модель только объясняет.
