В этом проекте вам предстоит написать интеграцию с...
Tạo vào: 30 tháng 11, 2025
Trả lời bằng GPT-5.1 Thinking bởi Chat01
Tạo vào: 30 tháng 11, 2025
Trả lời bằng GPT-5.1 Thinking bởi Chat01
В этом проекте вам предстоит написать интеграцию с внешним сервисом.
Интеграция — объединение данных, находящихся в различных источниках, и предоставление данных пользователям в унифицированном виде.
Интеграция с внешним сервисом — это довольно распространенная задача для 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-файлах. Вы можете изменять этот код под свои задачи, чтобы реализовать задание целиком.
Ссылки на файлы:
texthh.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-файл. Отфильтрованные и отсортированные вакансии, выводимые пользователю через консоль.
Пример использования
Данный пример можно использовать как подсказку к началу реализации. Итоговая реализация может иметь любое количество классов, функций и их названий, другой принцип организации.
hh_api = HeadHunterAPI()
hh_vacancies = hh_api.get_vacancies("Python")
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
textfiltered_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 в абстрактном классе.