Каждый выпускник школы сталкивается с проблемой выбора профессии и, следовательно, ВУЗа. Этот этап жизни является наиболее сложным для школьника психологически: нужно подготовиться и сдать экзамены, от которых зависит, наберут ли они проходной балл в выбранное учебное заведение. Сам процесс поступления тоже является источником стресса: новая система подачи документов не гарантирует 100% зачисление даже с необходимыми баллами. До самого последнего момента абитуриент не знает, пройдёт он или нет на бюджет в выбранных ВУЗах и решение о подаче оригиналов документов приходится принимать на основании ограниченной информации и своих собственных предположениях о дальнейшем развитии ситуации. Получается, все выпускники последние 2 месяца лета не наслаждаются заслуженным отдыхом, а всей страной играют в покер со ставками на свое дальнейшее образование! Что можно сделать, чтобы снизить градус напряжённости для себя и/или своего ребёнка? В данной статье мы рассмотрим инструменты облегчающие и даже автоматизирующие процесс мониторинга конкурсных списков - ведь вовремя полученная информация поможет принять правильное решение в условиях всеобщей неопределенности. Начнем с формального перечисления основных правил поступления в вузы РФ в 2023 году: Прием документов проводится в рамках одной волны, с 20 июня по 25 июля Подать заявления можно в максимум 5 вузов, в каждый из них не более чем на 5 различных направлений. При этом: В 2022 году чтобы оказаться в приказе зачисленных в вуз, требовалось подать согласие на зачисление и оригинал аттестата. В 2023 году достаточно не отозвать оригинал аттестата в день издания приказа. Использование возможности поступить без вступительных испытаний (далее БВИ) доступно только один раз и в один вуз. Новый подход, как водится, не без проблем. На данный момент не существует единой системы с актуальной базой заявлений поступающих. Что собственно приводит к тому, что абитуриенты не знают, кто в текущих конкурсных списках реально претендует на те же места, а кто уже поступил или заинтересован в другом вузе или направлении. В итоге, абитуриенты должны вручную проверять разрозненную информацию о других поступающих, что в условиях постоянно изменяющихся списков и устаревших, тормозящих и нелогичных сайтов ВУЗов по сложности стремится к уровню «практически невозможно остаться в своём уме». Немаловажная деталь: если абитуриент отдал свой оригинал аттестата в один из вузов, то на данный момент он может рассматриваться на поступление только на направления этого вуза. Из конкурсных списков остальных вузов его можно исключить, пока он не перенесет свой аттестат в другое учебное заведение. Собственно желание помочь абитуриентам и сподвигло меня на написание данной статьи. Далее мы подробно рассмотрим реализацию системы мониторинга заявлений абитуриентов (написана мной  в волну поступлений 2022 года), а также обсудим варианты для ее совершенствования. Исходный код можно найти по следующей ссылке. Основная идея для моего решения состоит в использовании какого-то общего идентификатора абитуриентов, чтобы иметь возможность соотносить заявления из разных вузов. В каждом ВУЗе школьникам присваиваются свои уникальные идентификаторы, различные для каждого учреждения.Но учитывая тот факт, что более 95% поступающих - граждане РФ, и они также предоставляют ВУЗам информацию о номерах СНИЛС (единого для всех формата), мы можем использовать их в качестве идентификатора абитуриентов в нашей системе. В итоге мы получим решение, охватывающее наибольшее количество абитуриентов, что позволит нам с наибольшей точностью определять реальные позиции людей в конкурсных списках. Так как процесс переноса оригинала аттестата - не минутное дело, мы можем не включать абитуриентов в текущие конкурсные списки, если на данный момент их оригинал лежит в другом вузе. Поэтому обновлять данные достаточно раз в день (за исключением последнего дня публикации приказов, когда перенос документов еще возможен). Также можно сразу исключить и абитуриентов, которые уже поступили по БВИ в какой-либо вуз, тем самым имея возможность сократить кол-во людей в вершине списка с высокими баллами (в большинстве случаев это так). По итогу актуальные конкурсные списки должны содержать только тех абитуриентов, кто имеет возможность на момент запроса информации поступить на конкретное направление в вузе либо предоставив оригинал аттестата, либо онлайн поменяв приоритеты своих направлений (при уже предоставленном документе). Основной функционал системы должен позволять нам получать следующие данные: Полные конкурсные списки с отображением баллов,фактом предоставления оригинала  аттестата, и какое направление является приоритетным для каждого абитуриентаDataVisualizer::show_all_students_and_agreement_where_score_ge Актуальные конкурсные списки с учетом заявлений в другие вузы и отображением приоритетного направления  в текущем вузе (для которого генерируется ответ).DataVisualizer::show_all_students_and_chosen_profile_where_score_ge_and_admission_possible Актуальная информация по всем заявлением на поступление конкретного абитуриента с указанием информации о балле и текущей позиции в конкурсе, а также количеством бюджетных мест и текущем проходном балле на направлении.DataVisualizer::show_current_applications_details_for Также мы можем получить не менее важную информацию: Распределение оригиналов аттестатов по вузам: всех оригиналов и только тех, кто еще находится в процессе поступления (не поступил ранее).DataVisualizer::show_agreements_distribution DataVisualizer::show_pending_agreements_distribution Статистика по вузам или направлениям: количество поданных оригиналов и бюджетных мест, текущие минимальный, средний и медианный баллы, а также перцентили 80, 90 и 95.DataVisualizer::get_universities_statisticsDataVisualizer::get_profiles_statistics Для функционирования системы осталось заполнить ее данными. На данный момент реализован только оффлайн режим загрузки файлов: csv таблицы или html страницы. Так как у каждого вуза существует своя система трекинга заявлений, и каждая из них имеет свою структуру, было решено сконцентрироваться на универсальном решении, которое можно потом легко расширить. Есть базовый Parser и несколько его реализаций для CSV и HTML. Чтобы добавить новый вуз в систему и возможность загрузить его данные, достаточно реализовать один из базовых парсеров и описать структуру данных (для каждого вуза она разная):: for_university - для какого вуза данная реализация. _headers_mapping - какие поля нам надо считывать (названия колонок). _parse_student_id, _parse_agreement_submission и _parse_dormitory_requirement - как выглядят данные об идентификаторе, согласии на зачисление / наличие оригинала и просьбы на предоставление жилья. Для csv файлов также может потребоваться указать _delimiter - разделитель колонок в файле (по умолчанию ";"). Для подготовки данных в виде csv файлов достаточно просто скопировать таблицы с сайтов вузов с конкурсными списками и сохранить их в excel файл. Для html страницы же потребуется немного посмотреть в структуру страницы и далее определить поиск нужной таблицы в _find_applications_table_data для дальнейшего считывания данных, а также как именно каждую строку таблицы преобразовать в одну модель абитуриента - _parse_student_from_html_row. Примером может послужить имплементация для МАИ. Сами парсеры html требуют чуть больше работы с кодом, но зато на выходе достаточно просто сохранить веб страницу с данными и предоставить ее системе. Реализовав парсер один раз вы будете экономить больше времени в будущем. Вероятно часть уже реализованных парсеров придется обновить в связи с обновлением сайтов и структур данных каждого вуза, но данная разработка может послужить хорошим базисом для доработки новой версии, актуальной для нового 2023 года поступления. Я хотел сделать эту систему полностью автоматической, но столкнулся со следующими проблемами: Не у всех вузов есть веб сайты с конкурсными списками, некоторые публикуют только csv файлы (например ВШЭ), некоторые — pdf файлы (МГТУ им. Баумана). Иногда вузы предоставляют доступ только авторизованным пользователям, притом вы также должны участвовать в конкурсе на поступление. Часто сайты устроены так, что нам надо точно знать, где (в селекторе, чекбоксе и др.) и что надо нажать на сайте для получения нужного списка данных. Так как url страниц для разных направлений в большинстве случаев совпадает, это значительно усложняет полную автоматизацию. Потому представленная система не претендует на полную замену ручного труда и вам все равно придется раз в какое-то время подготавливать данные для системы, чтобы иметь актуальную информацию по конкурсным спискам. Но согласитесь, это значительно упрощает анализ реальной ситуации. Гадалка больше не нужна! На данный момент существует три способа использования текущих наработок: Запустить python скрипт (на выходе получаем pdf файл); Собрать docker image и далее его запустить; или Вы можете воспользоваться уже готовым Jupyter Notebook. Как уже описал выше, в системе также предусмотрена возможность генерации PDF файла DataVisualizer::get_report_for со статистикой для конкретного абитуриента: brief с деталями по вузам и каждому из заявлений абитуриента и full с добавлением полных конкурсных списков, в которых абитуриент участвует. Для запуска системы также потребуется вначале собрать данные, на основе которых вы хотите построить текущую модель и получать актуальные сведения. Для этого потребуется для каждого вуза и каждого из направлений создать отдельный файл с названием, заданным по следующему паттерну: "{university}{profile}", в некоторых случаях профиль направления может быть составным: его можно задать как "{profileId}{subField}". Примеры: "MIPT_01.03.02" или "SPBSU_01.03.02_5156-1". Собрав все файлы в одной директории вам остается только указать полный путь к ней при запуске скриптов. Отдельно вы можете вручную собрать статистику по уже поступившим по БВИ в файл с названием "ALREADY_LISTED.csv"(имеет определенную структуру), который позволит исключить этих абитуриентов из других конкурсных групп. Достаточно запустить в терминале следующую команду python generate_report.py и передать туда следующие параметры: --student_id - идентификатор абитуриента (обязательный параметр) --data_dir - путь к папке с данными --type - тип отчета (brief или full) --student_id - идентификатор абитуриента (обязательный параметр) Полная команда может выглядеть следующим образом: Для сборки docker образа надо запустить следующую команду: Для запуска: Где: app/data/applications - загрузочные файлы с данными о поступающих. app/data/reports - сгенерированные отчеты будут размещаться по этому пути. Мы все знаем, что поступление в ВУЗ - сложный этап в жизни каждого школьника и его родителей, отнимающий оставшиеся после ЕГЭ нервные клетки. В этой статье я привёл решение которое  полу-автоматизирует мониторинг конкурсной ситуации в университетах и значительно упрощает жизнь абитуриенту.  Решение релевантнои для ВУЗов : им тоже важно понимать ситуацию с поступлением, чтобы не упустить талантливых абитуриентов и закрыть конкурс без дополнительных волн. Систему можно и нужно улучшать: начиная с добавления парсеров для еще неучтенных ВУЗов или других форматов данных и заканчивая полной автоматизацией с загрузкой данных в режиме реального времени. И, конечно, это может послужить отправной точкой в развитии общей российской платформы поступления в вузы!