11 января 2026 г.

22 391

Как любительское приложение на Python изменило информационную политику госинститута

Цифра в заголовке — 22 391 — это количество строк кода в моей программе, написанной на Python, с амбициозным названием Intelligence. В течение последних 5 лет она собирает и обрабатывает новости 55 торговых представительств России за рубежом, и стала причиной изменения информационной политики этого государственного института.

Затраты бюджета: 0 рублей. Мои личные затраты: около 36 тысяч рублей в год, на оплату домена, аренду облачного сервера, взаимодействие с языковыми моделями. С точки зрения финансов это убыточный для меня проект, но хобби редко приносят доход. Моя прибыль в удовольствии от хобби, получаемых навыках и знаниях.

girls_storm

Рождение Шторма

7 октября 2020 года я запустил на сервере программу, которая состояла из нескольких страниц кода. Последовательно она обходила сайты торгпредств, выгружала html-страницы и извлекала из них данные по новостям (в ИТ это называют "парсинг"). Код был сравнительно прост, далёк от идеала, как по архитектуре, так и по стилю, но он уже выполнял свою задачу.

Сколько нужно времени человеку, чтобы проанализировать 55 сайтов? Что если делать это минимум один раз каждый будний день? Шторм это делал менее чем за 60 секунд каждые 10 минут (в первое время он работал без async и многопоточности. Впоследствии, при внедрении этого инструментария, скорость сократилась в 10 раз: с 50 секунд до 5).

В это время я обучался на курсах Яндекс Практикума по бэкенд разработке на Python, то есть был "на волне", но нейросетей ещё не было, и поиск решений для любой идеи или задачи требовал значительных усилий и времени.

Зачастую приходилось двигаться маленькими шагами. Допустим, нужно сделать публикацию результатов парсинга в Telegram. Изучаем документацию, примеры, форумы, StackOverflow (один из самых популярных QA-сервисов по разработке в мире). Рисуем схемы на бумаге, пытаясь найти наиболее гармоничную архитектуру. Затем этапами двигаемся к реализации.

Раз. Ты смог инициализировать инфраструктуру для взаимодействия с Telegram API. Работает! Пробуем опубликовать тестовое сообщение: неудача. Нашёл ошибку, исправил, но опять не получилось. Снова время, поиск, нашёл! Первое сообщение отправлено! Только это сделано почти вручную, в сыром виде, а надо же оформить, автоматизировать.

storm_telegram

Когда ты работаешь в команде, всегда есть возможность с кем-то посоветоваться, попросить подсказку или обсудить направление идеи. Если ты любитель-самоучка, то к тебе меньше требований по качеству кода (кто предъявит?), но нет и всей той поддержки, которая присутствует в профессиональной среде. При том, что даже для небольшого серверного приложения, тебе нужно разбираться с комплексом вопросов, совершенно порой не связанных с программированием.

Вот, например:

  1. Собственно, знание языка программирования. В моём случае тогда был Python. И это уже не владение базовыми навыками и ключевыми словами. Кроме самого языка и его стандартного пакета есть множество зависимостей, которые можно и нужно использовать в своих приложениях, но их надо знать, уметь ими пользоваться.
  2. Взаимодействие с базами данных. Например, SQL. Мой первый проект работал с ними с минимальными абстракциями (это так называют дополнительные "обёртки" из кода, которые заменяют прямые сырые запросы к базе, делая их более читаемыми и удобными для использования).
  3. Проект работает на сервере, а значит нужно хотя бы немного понимать эту инфраструктуру, и плюс минимальные базовые знания Linux. Что такое sudo и чем отличается от systemctl. Как работает ufw и почему нежелательно использовать root для production-версии, даже для небольшого проекта.
  4. Система контроля версий (git) с её порой необъяснимой магией, от которой бросает в холодный пот. Конечно же, в компании с github.com.

Словно учишься играть на скрипке по видео, а через месяц уже нужно дать концерт в филармонии. Без учителя, без настройщика, без нотной грамоты. Примерно так чувствуешь себя, когда пытаешься разобраться, почему nginx отдаёт 502 ошибку на мои настройки Django (как выясняется, потому что они "кривые").

В общем, понятно. Для человека, который двигается профессионально в ИТ набор выше собирается в начале карьеры, а далее постоянно расширяется.

Когда ты любитель, и нырнул заново в эти воды после 35, твой заплыв идёт тяжелее. Ведь хобби это лишь малое время, что выделяется из досуга, а освоить, понять, сделать нужно много.

Переход в Intelligence

Стоило мне скомплектовать промежуточную работающую систему, я решил переписать всё с использованием новой технологии.

В разработке нет финальной точки. Есть только промежуточные версии, которые уже работают.

Простенький фреймворк Flask решено заменить на мощный веб-фреймворк Django, а это другой разряд для любителя. Плюс: заложенные в этом решении возможности позволяют делать масштабируемое приложение с большой вариативностью развития.

Так самостоятельное небольшое приложение Storm стало составной частью более крупного решения Intelligence, с большим набором функций и возможностей.

В этот момент у проекта появился сайт, а до этого он незаметно работал без фронт-части на сервере, собирая данные в небольшую базу и отправляя отчёты в telegram-канал. Только это не просто сайт, а развивающаяся админ-панель для сбора данных, управления ими, анализа и плюс работающий параллельно парсер сайтов.

Восстановленный образ главной страницы Intelligence 2020 года

Фронт-часть проекта проста как топор, потому что версталась для внутреннего использования, но и это нужно было научиться делать. К тому же, я практически ничего не знал про технологии фронтенда, поверхностно погружаясь в более интересную для себя тему бэкенда, где мне хватало задач и работы.

В Django проект запустился в декабре 2020 года, а затем редактировался в течение нескольких лет календарно, а фактически развивался рывками, с перерывами в несколько месяцев/полгода и даже год. Всё это по вечерам, на выходные и в праздники, когда удавалось найти время, свободное от работы и личных семейных дел.

В итоге получилось довольно стабильное приложение, которое месяцами работает без участия разработчика:

  • сбор новостей с сайтов торгпредств, формирование статистики их публикации, соблюдения сроков размещения;
  • обработка новостей с применением нейросетей, отбор наиболее релевантных для широкой аудитории и централизованная републикация в иные каналы (Telegram, MAX, Дзен и другие);
  • сбор данных о приоритетных выставочных мероприятиях и тендерах в странах пребывания, которые отбираются торгпредствами;
  • панель управления для модератора, с доступом к статистике публикаций, новостей, выставок и тендеров;
  • система модерации новостей при поддержке нейросетей.

22 391 строчка кода, каждая вручную, а некоторые блоки полностью переписаны, а то и несколько раз. По мере развития компетенции, знаний. Все IO-операции, сетевые запросы, переведены в асинхронный режим. Появился более развитый фронтенд с JavaScript, NPM и Webpack. Созданы некоторые отделившиеся решения, которые стали применяться в других pet-проектах. Скажем, обёртка для обработки ошибок с логированием. Собственный модуль Semantic для работы с файлами конфигураций (родился для возможности изменения "на лету" конфигурации работы с языковыми моделями).

Админ-панель Intelligence образца 2024-2025 годов
Intelligence для меня стал рабочим проектом и одновременно песочницей, где было испытано множество идей и решений. Свобода творчества: когда ты вправе решать, какую из идей ты внедришь в код своего приложения.

Кстати, количество строк кода посчитано тоже моей программой, но уже на Rust, которую создал недавно, погрузившись в изучение этого восхитительного языка. Лежит на github: pyline (есть также статья в блоге о ней).

Статистика кодовой базы Intelligence, подсчитанная pyline

Какие же результаты?

В первую очередь удовольствие от процесса познания и созидания. Программирование — это тоже творчество, и аналитика, и развитие.

Одновременно и практическая сторона для работы. Основные эффекты внедрения Intelligence и Storm:

  • среднее число публикаций от одного торгового представительства превысило 300 в год (ранее — не более 4 в год);
  • обеспечена регулярная еженедельная и ежедневная публикация новостей, информации о выставках и тендерах, в соответствии с нормативными требованиями;
  • создан сводный Telegram-канал "Торгпред" с автоматической републикацией лучших отобранных новостей (более 5000 подписчиков), недавно запущен канал в MAX и есть канал-дублёр в "Дзен";
  • изменён фокус публикаций: вместо отчётов о встречах — прикладные новости для экспортёров о состоянии зарубежных рынков.

Конечно же, в первую очередь, это работа коллег в торговых представительствах. Они выполняют свою работу и действуют в интересах российских экспортёров, но с ними, незаметно, без сна и отдыха, работает и 22 тысячи строчки кода, которые помогают им обрабатывать информацию и доводить её до целевой аудитории.

Потому что моё хобби — программирование.

Фрагмент лог-файла Storm
← Назад ко всем записям