Python для junior ИБ специалиста: парсю вакансии и считаю, что реально нужно знать

Полгода назад я написал скрипт на Python, который собрал больше сотни вакансий с hh.ru по запросам «junior ИБ», «специалист информационной безопасности python» и «SOC analyst». Прогнал тексты из разделов «Требования» через collections.Counter (стандартный класс Python для подсчёта частотности элементов) и получил таблицу: какие конструкции языка работодатели упоминают постоянно, какие — от случая к случаю, а какие дописывают «для красоты», потому что скопировали блок требований из соседней вакансии на middle+. Ниже — сам парсер, результаты анализа и минимальный набор синтаксиса, с которым можно откликаться на первую позицию.
Зачем парсить вакансии junior ИБ Python, а не спрашивать в чатах
Стандартный путь новичка: зайти в Telegram-чат по ИБ и написать «Какой Python нужно знать для старта?». Ответы будут от «выучи всё» до «Python не нужен, учи сети». Оба бесполезны — это мнение одного человека из одной компании.
Вакансии — другое дело. Это текст, за публикацию которого работодатель заплатил деньги. В него вложено конкретное ожидание: «мне нужен человек, который умеет делать X». Собрав достаточно таких текстов и подсчитав частотность, получаем не чьё-то мнение, а данные — реальный анализ рынка труда IT в сфере безопасности.
Вторая причина строить парсер — сам процесс. Пока пишешь скрипт, который стучится в API (программный интерфейс для обмена данными между приложениями), разбирает JSON и считает слова, ты используешь ровно те навыки Python для security analyst, которые работодатели и просят. Не учебный «калькулятор на tkinter» — рабочий инструмент с понятным результатом.
Парсинг открытых данных через API — нормальная практика в ИБ. В MITRE ATT&CK (открытая база тактик и техник атак; T-коды вроде T1059 — её идентификаторы) есть техника T1593.002 — Search Engines (тактика Reconnaissance): атакующие собирают информацию из открытых источников автоматизированно. Мы делаем то же самое, но с другой стороны и с другой целью. Python как инструмент фигурирует в ATT&CK отдельной техникой T1059.006 — Python (подтехника Command and Scripting Interpreter, тактика Execution) — злоумышленники используют его для выполнения вредоносного кода. Понимание языка с обеих сторон — для автоматизации защиты и для распознавания атак — то, что отличает ИБ-специалиста от обычного скриптописца.
Python в таких ролях — инструмент автоматизации рутины, не основной рабочий навык. Это снимает паранойю «надо выучить весь Python перед первым откликом».
Собираем парсер вакансий junior ИБ — проект на Python для портфолио
Чтобы повторить упражнение, понадобится: Python 3.10 или новее, библиотеки requests и beautifulsoup4 (ставятся командой pip install "requests>=2.32.0" beautifulsoup4) и доступ в интернет.
Получаем данные через API hh.ru
HeadHunter предоставляет публичный API по адресу api.hh.ru. Для базовых поисковых запросов авторизация не нужна — не придётся парсить HTML-страницы (web scraping вакансий в «лоб»), достаточно отправить GET-запрос и получить JSON (текстовый формат для обмена данными) с результатами.
import requests, time
params = {"text": "junior информационная безопасность python", "per_page": 100}
resp = requests.get("https://api.hh.ru/vacancies", params=params)
vacancies = resp.json()["items"]
descriptions = []
for v in vacancies:
resp_detail = requests.get(f"https://api.hh.ru/vacancies/{v['id']}")
if resp_detail.status_code != 200:
continue # пропускаем, если API вернул ошибку (429, 5xx и т.д.)
detail = resp_detail.json()
descriptions.append(detail.get("description", ""))
time.sleep(0.3) # пауза, чтобы API не заблокировал за частые запросы
Что здесь происходит: requests.get() отправляет HTTP-запрос к API hh.ru с параметрами поиска. Метод .json() превращает ответ в Python-словарь. Для каждой вакансии из списка делаем дополнительный запрос за полным описанием — в списке выдачи текст обрезан. Пауза time.sleep(0.3) нужна, чтобы не нарваться на rate limit (ограничение по количеству запросов в единицу времени).
Проверка: print(len(descriptions)) покажет число собранных вакансий, print(descriptions[0][:300]) — начало первого описания в виде HTML-текста.
Считаем частотность конструкций Python
Теперь разберёмся, какие навыки Python для junior ИБ специалиста упоминаются чаще всего. Составляем список ключевых слов и считаем, в скольких вакансиях каждое из них встречается.
from collections import Counter
from bs4 import BeautifulSoup
import re
skills = ["requests", "json", "api", "rest", "asyncio", "flask",
"django", "fastapi", "sql", "git", "linux", "bash",
"csv", "yaml", "pytest", "docker", "regex"]
# "os" исключён: слишком короткий токен, \b-поиск даёт ложные срабатывания на 'iOS', 'macOS' и т.д.
counter = Counter()
for html in descriptions:
text = BeautifulSoup(html, "html.parser").get_text().lower()
for skill in skills:
if re.search(rf"\b{skill}\b", text):
counter[skill] += 1
for skill, count in counter.most_common():
print(f"{skill}: {count} из {len(descriptions)} вакансий")
BeautifulSoup (библиотека для разбора HTML, часть пакета beautifulsoup4) убирает HTML-теги и оставляет чистый текст — requests BeautifulSoup парсинг в действии. Counter подсчитывает вхождения. re.search() с \b (граница слова) предотвращает ложные срабатывания: слово «flask» не найдётся внутри «flashback».
На выходе — отсортированный список вроде api: 47 из 100 вакансий, json: 42 из 100 вакансий и далее по убыванию.
Что показал анализ вакансий junior ИБ Python
Ниже — сводка по данным, собранным из вакансий на hh.ru (через API-парсер выше, ~100-120 вакансий за прогон). Дополнительно я вручную просмотрел объявления на hirify и hireseeker (у них нет публичного API, поэтому данные оттуда собирались без автоматизации и в меньшем объёме). Абсолютные цифры зависят от выборки и момента; пропорции были похожи в трёх прогонах с интервалом в два месяца, но это авторская выборка, а не строгое исследование.
Конструкции Python, которые встречаются в требованиях к junior ИБ
| Навык / конструкция | Частота | Пример из реальной вакансии |
|---|---|---|
| REST API, requests | Очень высокая | «разработка сетевых приложений по REST API с различными способами аутентификации» (Сбер, Центр Киберзащиты) |
| JSON, XML, YAML, CSV | Очень высокая | «способен самостоятельно разобраться в незнакомой структуре данных и разработать парсер» (Сбер) |
| Автоматизация (скрипты, модули os, subprocess) | Очень высокая | «автоматизация рутинных процессов: парсинг отчётов, создание тикетов, сбор контекстной информации» (финтех, аналитик уязвимостей) |
| Git | Высокая | Упоминается практически в каждой вакансии как обязательное |
| SQL (PostgreSQL, ClickHouse) | Высокая | «понимание устройства и функциональности СУБД» (Сбер) |
| Linux, Bash | Высокая | Указывается явно или подразумевается в каждой второй вакансии |
| try/except (обработка ошибок) | Средняя | Редко пишут отдельным пунктом, но подразумевается в любой задаче по автоматизации |
| Регулярные выражения (re) | Средняя | Подразумевается в задачах по парсингу логов и отчётов |
| asyncio (async/await) | Низкая | Встречается в вакансиях с уклоном в разработку, не в чистую ИБ |
| Web-фреймворки (Flask, Django, FastAPI) | Низкая | Только в вакансиях «Python-разработчик в ИБ-команде» |
| struct, bytes, socket | Редко в тексте | Проверяют на собеседовании, но в описание вакансии не выносят |
Последняя строка — самая интересная. Работа с бинарными данными (struct, bytes) — критичный навык для ИБ-разработчика: парсинг заголовков сетевых пакетов, разбор PCAP-дампов (файлы с захваченным сетевым трафиком), работа с криптографическими хешами. Но в текстах вакансий этот навык почти не фигурирует. Его проверяют на техническом интервью: дают 20 байт IP-заголовка и просят распаковать через struct.unpack(). Подробный разбор таких задач есть в отдельном материале про собеседование junior Python-разработчика в ИБ.
«Обязательно» vs «будет плюсом» — как отличить требования к junior специалисту по кибербезопасности
В вакансиях есть устойчивый паттерн: раздел «Требования» содержит и жёсткие условия, и wish-list. Проблема в том, что визуально они оформлены одинаково — единым маркированным списком.
Как отличить на практике:
Реально обязательное — первые 3-4 пункта списка. Без них не пригласят на собеседование:
- Python (сам язык, базовый синтаксис)
- Работа с сетью и API
- Парсинг данных (JSON, XML, CSV)
- Git
«Будет плюсом» — явно помечено этой формулировкой или стоит в конце списка:
- MITRE ATT&CK — в финтех-вакансии на позицию аналитика уязвимостей стояло именно «будет плюсом»
- Сертификации (OSCP, PNPT)
- Облачные платформы (AWS, Azure, GCP)
- DevSecOps
Раздутые требования — когда в вакансию junior копируют блок из middle+. Примеры из реальных объявлений:
- «Инструментальное владение AI для анализа, генерации и автоматизации» — из вакансии Сбера на junior-позицию в Центре Киберзащиты. Переводится на человеческий как «умеет использовать ChatGPT для дебага кода».
- «Опыт работы в крупной распределённой инфраструктуре (500+ хостов)» — из финтех-вакансии, в блоке «Будет плюсом». Но визуально выглядит так, будто без этого не берут.
- Одна вакансия junior security engineer требовала одновременно «Python, Bash, PowerShell, знание OWASP Top 10, SANS Top 25, опыт с Burp Suite, Nmap, Metasploit, sqlmap» — полный стек инструментов, которым реально владеет специалист с опытом от двух лет.
Зная эту структуру, при карьере в ИБ с нуля можно спокойно откликаться на вакансии, где вы закрываете первые 3-4 пункта «Требований». «Будет плюсом» — приглашение развиваться на позиции, а не входной барьер.
Минимальный набор синтаксиса Python для junior ИБ специалиста
На основе анализа вакансий junior разработчик и ИБ-специалист может выстроить приоритеты: что учить сразу, а что отложить.
Уровень 1: автоматизация рутины — первые 2-4 недели
То, что встречается в каждой вакансии и проверяется на первом техническом скрининге.
Переменные, циклы, условия, функции — каркас любого скрипта. Если можете написать функцию, которая принимает путь к директории и возвращает список файлов, изменённых за последние 24 часа — базовые конструкции вы понимаете.
Работа с файлами — open(), чтение построчно, запись результатов. В SOC (Security Operations Center — центр мониторинга безопасности) аналитик первого уровня ежедневно обрабатывает логи из текстовых файлов. Прочитать файл, отфильтровать строки по паттерну, записать результат — не учебное упражнение, а повседневная задача.
Обработка ошибок — конструкция try/except. Скрипт, который падает на первом нечитаемом символе в логе — бесполезный скрипт. В ИБ это особенно больно: логи приходят из десятков источников в разных кодировках, «грязные» данные — норма. try/except позволяет обработать ошибку (например, UnicodeDecodeError при чтении файла в неправильной кодировке) и продолжить работу вместо аварийной остановки.
Модуль os — работа с файловой системой: получить список файлов (os.listdir()), проверить существование (os.path.exists()), объединить пути (os.path.join()). Забавный момент: техника T1083 из MITRE ATT&CK (File and Directory Discovery, тактика Discovery) описывает, как атакующий исследует файловую систему жертвы. os.listdir() — буквально та же операция, только с другой стороны.
Уровень 2: работа с данными и сетью — следующие 4-6 недель
Эти junior python developer навыки отделяют «знаю синтаксис» от «могу решать рабочие задачи».
Библиотека requests — HTTP-запросы к API. По результатам парсера вакансий, работа с REST API — самое частое требование после базового знания Python. Обогащение алертов через VirusTotal API, проверка IP-адресов через AbuseIPDB (сервис проверки репутации IP-адресов; бесплатный тариф — до 1000 запросов в день, для SOC-скрипта хватает), автоматическое создание тикетов — всё это requests.get() и requests.post() с парой заголовков авторизации.
Парсинг JSON — встроенный модуль json. Ответы API приходят в JSON. Логи облачных сервисов — в JSON. Конфигурации систем — в JSON или YAML. Загрузить JSON в словарь через json.loads(), достать нужное поле по ключу, обработать — must have. Без этого не получится работать ни с одним внешним сервисом.
Регулярные выражения — модуль re. Извлечь IP-адрес из строки лога, найти все email-адреса в дампе, отфильтровать строки по паттерну. Не нужно заучивать все конструкции — достаточно re.search() и re.findall() плюс базовые паттерны: \d+ (последовательность цифр), \b (граница слова), .+ (любые символы). Сложные выражения всегда можно проверить на regex101.com.
Строковые методы — .split(), .strip(), .replace(), .startswith(). Парсинг логов в простых случаях делается без регулярок, одними строковыми методами. Строка лога "2025-06-15 10:30:00 WARN Connection dropped from 192.168.1.100" разбирается через .split(" ") на дату, время, уровень и сообщение.
Модуль csv — чтение и запись табличных данных. Отчёты сканеров уязвимостей (Nessus, Qualys, MaxPatrol) часто экспортируются в CSV (Comma-Separated Values — текстовый формат таблиц). Прочитать такой файл и отфильтровать уязвимости с CVSS (Common Vulnerability Scoring System — шкала оценки критичности уязвимостей от 0 до 10) выше 7.0 — типовая задача аналитика.
Что можно отложить
asyncio — асинхронное программирование. Встречается в вакансиях Python-разработчика внутри ИБ-команды (как в Сбере), но не в позициях SOC-аналитика или junior security engineer. Учить имеет смысл, когда уже работаете и столкнулись с задачей, где синхронный скрипт тормозит на тысячах запросов.
Web-фреймворки (Flask, Django, FastAPI) — если вы не идёте в разработку внутренних ИБ-продуктов, не приоритет. Для первой позиции в ИБ они не нужны.
Декораторы, метаклассы, дескрипторы — любимые темы учебников и собеседований в веб-разработку. В вакансиях junior ИБ они не упоминаются ни разу из всей моей выборки. Полезны для понимания чужого кода, но учить специально ради карьеры в ИБ с нуля — трата времени на старте.
Парсер вакансий как проект для резюме
Парсер вакансий python проект — удобный кейс для GitHub-портфолио, потому что он показывает именно те навыки, которые работодатели ищут:
- Работа с внешним API через requests
- Парсинг и обработка данных (json, BeautifulSoup, Counter)
- Автоматизация рутинной задачи с понятным результатом
- Бизнес-логика, которую можно объяснить на собеседовании за 30 секунд
Для оформления на GitHub достаточно: файл parser.py с кодом, README.md с описанием проекта и примером вывода, файл requirements.txt со списком зависимостей (requests и beautifulsoup4). Усилить можно файлом results.csv с результатами анализа и парой визуализаций через matplotlib.
Проект показывает работодателю: кандидат не просто «учил Python по курсу» — он решил конкретную задачу, получил конкретный результат и может объяснить каждую строку кода. По ряду зарубежных публикаций о найме в кибербезопасности, работодатели при найме entry-level специалистов всё чаще ценят tangible artifacts — репозитории, write-up’ы, задокументированные лабораторные работы — а не строчку «Python» в резюме без доказательной базы.
Отдельный бонус: если на собеседовании спросят «какие проекты на Python вы делали?», парсер вакансий — идеальный ответ. Во-первых, он показывает, что нужно знать junior pentester или аналитику. Во-вторых, результат парсера демонстрирует, что вы понимаете рынок и подходите к карьере аналитически, а не наугад. В-третьих, собеседующий наверняка сам гуглил «что нужно знать junior ИБ» — и оценит иронию.
Большая часть тревоги вокруг «какой Python нужен для ИБ» растёт из одного источника — раздутых вакансий. HR-отдел копирует требования из описания middle-разработчика, дописывает «junior» в заголовок и удивляется, почему нет откликов. Я встречал вакансию «junior SOC analyst», где в требованиях стояло «глубокий практический опыт работы с Qualys, Tenable.io/Nessus, Rapid7 InsightVM» и «опыт работы от 2 лет» — при этом в названии красовалось слово «junior».
На практике первые полгода в ИБ-команде выглядят иначе: скрипты на 30-50 строк, которые парсят логи, дёргают API и складывают результаты в CSV. Циклы, условия, requests, json, try/except — этого хватает, чтобы закрыть подавляющее большинство задач первого уровня.
Не нужно «выучить Python» — это бессмысленная цель, потому что язык огромный. Возьмите конкретную задачу (тот же парсер вакансий) и решите её. По дороге освоите ровно тот набор конструкций, который нужен для старта. Когда на работе столкнётесь с бинарными протоколами или необходимостью разобрать PCAP-дамп — тогда и дойдёте до struct и bytes. Не раньше. Если хочется пройти эту базу системно, а не ковыряться одному в документации — IB Basics на codeby.school закрывает именно этот этап: от «знаю, что Python существует» до первых рабочих задач в ИБ.
Эту тему и смежные навыки разбирают на практике в курсе «Основы программирования на Python» Codeby Academy.
