Перейти к содержимому

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

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

Полгода назад я написал скрипт на 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.