Итак, на календаре условный вторник, паника улеглась, пора писать код. Комиссии на защите нужно показать, что наше приложение работает с реальными данными. Значит, шаг первый - научить наш дипломный проект самостоятельно заходить на сайты с вакансиями и собирать информацию. В ИТ это называется парсингом или скрейпингом.
Сегодня мы напишем каркас нашего приложения и сделаем скрипт, который выкачает требования к Python-разработчикам.
Шаг 1. Готовим рабочее место
Чтобы в системе не было каши из библиотек, всегда создавайте изолированную папку - виртуальное окружение. Создайте на компьютере папку diploma_project, откройте в ней терминал (консоль) и введите две команды:
# Создаем окружение
python -m venv venv
# Активируем его (для Windows)
venv\Scripts\activate
# Активируем его (для Mac/Linux)
source venv/bin/activate
Теперь ставим наш «набор выживания» - библиотеки для скачивания страниц (requests), их разбора (beautifulsoup4) и работы с таблицами (pandas):
pip install requests beautifulsoup4 pandas
Шаг 2. Пишем код парсера
Создайте файл parser.py. Мы не будем лезть под жесткие фильтры больших агрегаторов вроде hh.ru (там нужна сложная авторизация и капча, а у нас неделя до диплома). Мы возьмем сайт попроще, например, открытый хаб с вакансиями (или смоделируем его структуру).
Этот код заходит на страницу, находит блоки вакансий, вытаскивает оттуда название, навыки и сохраняет всё в аккуратную Excel-таблицу:
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
def parse_jobs(keyword, pages=3):
status_text = f"Начинаем сбор вакансий по запросу: {keyword}"
print(status_text)
scraped_data = []
# Листаем страницы сайта
for page in range(1, pages + 1):
# Заменяем URL на тестовый сайт-песочницу или реальный открытый ИТ-хаб
url = f"https://github.io"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
response = requests.get(url, headers=headers)
if response.status_code != 200:
print(f"Ошибка доступа к странице {page}")
continue
soup = BeautifulSoup(response.text, 'html.parser')
# Находим все карточки вакансий на странице
job_cards = soup.find_all('div', class_='card-content')
for card in job_cards:
title = card.find('h2', class_='title').text.strip()
company = card.find('h3', class_='company').text.strip()
location = card.find('p', class_='location').text.strip()
# В реальном дипломе здесь мы будем искать теги навыков (Docker, Git, Django)
# Для теста запишем базовую информацию
scraped_data.append({
"Позиция": title,
"Компания": company,
"Город": location,
"Требуемые навыки": "Python, SQL, Git" # Сюда позже прикрутим умный поиск скиллов
})
time.sleep(1) # Защита от бана: спим 1 секунду между страницами
# Превращаем массив данных в красивую таблицу Pandas
df = pd.DataFrame(scraped_data)
# Сохраняем в Excel. Это готовое приложение к вашему диплому!
df.to_csv("vacancies_base.csv", index=False, encoding="utf-8")
print(f"Готово! Собранно {len(df)} вакансий. Файл vacancies_base.csv сохранен.")
if __name__ == "__main__":
parse_jobs("Python", pages=1)
Что говорить на защите диплома про этот код?
Когда злой профессор спросит: «А в чем научная новизна и сложность вашего метода сбора?», вы уверенно отвечаете:
. «Использован модульный подход и имитация поведения реального пользователя» (это про строчку с headers и time.sleep, чтобы сайт не понял, что это робот).
. «Данные нормализуются на лету» (это про метод .strip(), который удаляет лишний мусор и пробелы из текста).
. «Была сформирована первичная неструктурированная база данных для последующего контент-анализа» (звучит по-научному круто, а на деле означает, что мы просто сохранили текст в CSV-файл).
Запустите скрипт командой python parser.py. В вашей папке появится файл vacancies_base.csv. Поздравляю, у вас есть первая практическая часть диплома и реальная база данных, собранная программным путем.
В следующей серии мы сделаем самое интересное: заставим Python проанализировать этот файл, вытащить оттуда самые востребованные технологии и построить красивейшие графики для презентации, от которых у комиссии потекут слезы умиления.