В этом проекте вам предстоит написать интеграцию с...

Erstellt am: 30. November 2025

Beantwortet mit GPT-5.1 Thinking von Chat01

Frage

В этом проекте вам предстоит написать интеграцию с внешним сервисом.

Интеграция — объединение данных, находящихся в различных источниках, и предоставление данных пользователям в унифицированном виде.

Интеграция с внешним сервисом — это довольно распространенная задача для Python-разработчиков, которую можно встретить на платформах с фриланс-проектами.

В курсовой мы будем работать с API.

API — это механизм, который позволяет различным программам взаимодействовать друг с другом, используя набор определенных правил.

Подробнее про API вы можете прочитать в статье «Что такое API»: https://timeweb.com/ru/.

Чтобы интегрировать внешние сервисы через API, вам понадобится библиотека, которая помогает в этом. Одним из самых простых вариантов является библиотека

requests

.

Пример кода работы с requests

Ниже представлено, как будет выглядеть в общем виде код для запросов.

Работа с GET-запросами:

import requests

url_get = "https://httpbin.org/get" # используемый адрес для отправки запроса

response = requests.get(url_get) # отправка GET-запроса

print(response) # вывод объекта класса Response

Вывод:

<Response [200]>

print(response.status_code) # вывод статуса запроса, 200 означает, что всё хорошо, остальные коды нас пока не интересуют и их можно считать показателем ошибки

Вывод:

200

print(response.text) # печать ответа в виде текста того, что вернул нам внешний сервис

Вывод:

{
"args": {},
"headers": {
"Accept": "/",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.31.0",
"X-Amzn-Trace-Id": "Root=1-65892ff5-5f3e46891d0c56775f3dc659"
},
"origin": "185.252.41.5",
"url": "https://httpbin.org/get"
}

print(response.json()) # печать ответа в виде json-объекта того, что нам вернул внешний сервис

Вывод:

{'args': {}, 'headers': {'Accept': '/', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.31.0', 'X-Amzn-Trace-Id': 'Root=1-65892ff5-5f3e46891d0c56775f3dc659'}, 'origin': '185.252.41.5', 'url': 'https://httpbin.org/get'}

Работа с POST-запросами:

import requests

url_post = "https://httpbin.org/post" # используемый адрес для отправки запроса

response = requests.post(url_post) # отправка POST-запроса

print(response) # вывод объекта класса Response

Вывод:

<Response [200]>

print(response.status_code) # вывод статуса запроса, 200 означает, что всё хорошо

Вывод:

200

print(response.text) # печать ответа в виде текста того, что вернул нам внешний сервис

Вывод:

{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "/",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "0",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.31.0",
"X-Amzn-Trace-Id": "Root=1-65893054-044490af734f11d751ff9f85"
},
"json": null,
"origin": "185.252.41.5",
"url": "https://httpbin.org/post"
}

print(response.json()) # печать ответа в виде json объекта того, что нам вернул внешний сервис

Вывод:

{'args': {}, 'data': '', 'files': {}, 'form': {}, 'headers': {'Accept': '/', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '0', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.31.0', 'X-Amzn-Trace-Id': 'Root=1-65893054-044490af734f11d751ff9f85'}, 'json': None, 'origin': '185.252.41.5', 'url': 'https://httpbin.org/post'}

text
Важно запомнить, что отправка запроса с помощью requests возвращает объект класса Response , который позволяет получить содержимое ответа, а также убедиться, что запрос отработал без ошибок, с помощью кода статуса ответа.

Вспомогательные материалы

Чтобы посмотреть, как работают основные функции, вы можете скачать файлы, в которых приведен пример работы с API сайта hh.ru.

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

Ссылки на файлы:

text
hh.py vacancies.json

Задание

Напишите программу, которая будет получать информацию о вакансиях с платформы hh.ru в России, сохранять ее в файл и позволять удобно работать с ней: добавлять, фильтровать, удалять.
Требования к реализации

text
Создать абстрактный класс для работы с API сервиса с вакансиями. Реализовать класс, наследующийся от абстрактного класса, для работы с платформой hh.ru. Класс должен уметь подключаться к API и получать вакансии. Создать класс для работы с вакансиями. В этом классе самостоятельно определить атрибуты, такие как название вакансии, ссылка на вакансию, зарплата, краткое описание или требования и т. п. (всего не менее четырех атрибутов). Класс должен поддерживать методы сравнения вакансий между собой по зарплате и валидировать данные, которыми инициализируются его атрибуты. Способами валидации данных может быть проверка, указана или нет зарплата. В этом случае выставлять значение зарплаты 0 или «Зарплата не указана» в зависимости от структуры класса. Определить абстрактный класс, который обязывает реализовать методы для добавления вакансий в файл, получения данных из файла по указанным критериям и удаления информации о вакансиях. Создать класс для сохранения информации о вакансиях в JSON-файл. Дополнительно, по желанию, можно реализовать классы для работы с другими форматами, например с CSV- или Excel-файлом, с TXT-файлом. Данный класс выступит в роли основы для коннектора, заменяя который (класс-коннектор), можно использовать в качестве хранилища одну из баз данных или удаленное хранилище со своей специфической системой обращений. В случае если какие-то из методов выглядят не используемыми для работы с файлами, то не стоит их удалять. Они пригодятся для интеграции к БД. Сделайте заглушку в коде. Создать функцию для взаимодействия с пользователем. Функция должна взаимодействовать с пользователем через консоль. Возможности этой функции должны быть следующими: ввести поисковый запрос для запроса вакансий из hh.ru; получить топ N вакансий по зарплате (N запрашивать у пользователя); получить вакансии с ключевым словом в описании. Помимо этого функционала, можно придумать дополнительные возможности, которые покажутся удобными. Объединить все классы и функции в единую программу. Покрыть описанный функционал тестами.

Требования к реализации в парадигме ООП

text
Абстрактный класс и классы для работы с API платформ с вакансиями должны быть реализованы в соответствии с принципом наследования. Класс для работы с вакансиями должен быть реализован в соответствии с принципом инкапсуляции и поддерживать методы сравнения вакансий между собой по зарплате. Классы и другие сущности в проекте должны удовлетворять минимум первым двум требованиям принципов SOLID.

Документация для сбора вакансий с hh.ru

Ссылка на API: https://github.com/hhru/api/.
Выходные данные

text
Информация о вакансиях, полученная с разных платформ, сохраненная в JSON-файл. Отфильтрованные и отсортированные вакансии, выводимые пользователю через консоль.

Пример использования

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

Создание экземпляра класса для работы с API сайтов с вакансиями

hh_api = HeadHunterAPI()

Получение вакансий с hh.ru в формате JSON

hh_vacancies = hh_api.get_vacancies("Python")

Преобразование набора данных из JSON в список объектов

vacancies_list = Vacancy.cast_to_object_list(hh_vacancies)

Пример работы контструктора класса с одной вакансией

vacancy = Vacancy("Python Developer", "https://hh.ru/vacancy/123456", "100 000-150 000 руб.", "Требования: опыт работы от 3 лет...")

Сохранение информации о вакансиях в файл

json_saver = JSONSaver()
json_saver.add_vacancy(vacancy)
json_saver.delete_vacancy(vacancy)

Функция для взаимодействия с пользователем

def user_interaction():
platforms = ["HeadHunter"]
search_query = input("Введите поисковый запрос: ")
top_n = int(input("Введите количество вакансий для вывода в топ N: "))
filter_words = input("Введите ключевые слова для фильтрации вакансий: ").split()
salary_range = input("Введите диапазон зарплат: ") # Пример: 100000 - 150000

text
filtered_vacancies = filter_vacancies(vacancies_list, filter_words) ranged_vacancies = get_vacancies_by_salary(filtered_vacancies, salary_range) sorted_vacancies = sort_vacancies(ranged_vacancies) top_vacancies = get_top_vacancies(sorted_vacancies, top_n) print_vacancies(top_vacancies)

if name == "main":
user_interaction()

Структура проекта

Критерии оценки

text
Наставник примет вашу работу, если в ней соблюдаются следующие условия. Проверьте работу по критериям перед тем, как отправить ее. Общие критерии для проекта Функциональный код разбит на модули: модуль для взаимодействия с API, модуль для взаимодействия с файлами, модуль для взаимодействия с вакансиями. Решение выложено на GitHub. В проекте есть .gitignore . В коммиты не добавлены игнорируемые файлы. В проекте есть файл с зависимостями. Нет грубых нарушений PEP 8 в оформлении кода. В проекте есть «точка входа» — модуль, запустив который можно получить результат всех реализованных в проекте функциональностей. Классы соответствуют минимум первым двум принципам SOLID. Все классы задокументированы. Все методы классов задокументированы. Все методы классов типизированы. Взаимодействие с API Создан абстрактный класс для работы с API. Реализован метод подключения к API в абстрактном классе.

Diesen Q&A teilen