Python Requests на примерах: легкий способ отправлять HTTP-команды
Библиотека Python Requests — это, пожалуй, «золотой стандарт» для любого разработчика. Нужно прописать HTTP-действия, вроде GET или POST, в своих скриптах? Вам точно сюда. Это решение стало самым востребованным инструментом для подобных задач. В чем секрет? Невероятная простота плюс мощная поддержка комьюнити. Хотите понять механику работы этого инструмента и решить, стоит ли внедрять его в свой стек? Тогда этот гайд для вас.
Здесь мы разложим всё по полочкам. Обсудим функционал модуля, нюансы установки, разберем живые примеры кода на Python и популярные сценарии использования. Главное — читайте до финала.
Основные тезисы
- Этот инструмент превращает внедрение методов GET, PUT, POST и DELETE в элементарную задачу.
- Установка проходит мгновенно. Старт работы? Еще быстрее.
- Поддерживает массу рабочих процессов API: передачу JSON, обработку форм, файлов, кастомных хедеров и параметров URL.
- Внутри уже «зашиты» полезные фичи: тайм-ауты, отлов ошибок, сессии и куки. Надежность на высоте.
- Сессионный режим позволяет решать нетривиальные задачи: пагинация, авторизация, аплоад тяжелых файлов.
Что собой представляет библиотека?
Это максимально дружелюбный сторонний модуль для Python. Он дает кодерам возможность встраивать сетевое взаимодействие прямо в свои приложения. Забудьте о громоздких конструкциях для веб-вызовов. Этот инструмент предлагает чистые, понятные функции: get(), post(), put() и delete().
Использование этих команд делает общение с API абсолютно бесшовным. Нужно вытянуть информацию с сайта? Легко. Переслать пакет данных на конкретный хост в сети? Без проблем. Модуль с нами с начала 2010-х. И взлетел он именно благодаря отсутствию лишних сложностей.
Вся «грязная работа» скрыта под капотом. Управление заголовками, куки, сессиями, перехват исключений — всё это происходит автоматически. Вы же концентрируетесь исключительно на бизнес-логике. Сегодня это решение повсеместно применяется для автоматизации, парсинга, интеграций и кучи других IT-проектов.
Инсталляция и импорт

Инструмент прост в эксплуатации. Установка? Тоже дело пары секунд. Поскольку в стандартную сборку Python он не входит, его нужно добавить вручную. Ловите команду для терминала:
pip install requests
Как только процесс завершен, импортируйте модуль в свой проект. Используйте строку:
import requests
Импорт прошел успешно? Отлично. Теперь можно пробовать первые сетевые обращения. Как в этом образце:
response = requests.get("https://samplesite.com")
print(response.text)
Больше практических сниппетов мы разберем далее.
Базовые примеры работы
В этой части пройдемся по основам. Это поможет уловить суть взаимодействия инструмента с разными методами HTTP, включая GET, POST, PUT, PATCH и DELETE.
Реализация простого GET-вызова
Метод GET нужен, чтобы забрать данные с сервера. Это самый ходовой тип операций, который встречается в скриптах. В отличие от некоторых других действий, здесь сервер всегда присылает «ответку». Ниже пример реализации:
import requests
response = requests.get("https://api.samplesite.com/data")
print(response.status_code)
print(response.text)
В коде выше status_code сигнализирует об успехе операции. А следом выводится само тело ответа.
Отправка HTTP POST
Как понятно из названия, POST нужен для отправки (постинга) информации на удаленную машину. Код ниже демонстрирует, как это делается через наш модуль.
import requests
payload = {"name": "Tom", "age": 25}
response = requests.post("https://api.samplesite.com/users", json=payload)
print(response.status_code)
print(response.json())
Здесь payload — это отправляемый пакет. А конструкция response.json() позволяет сразу прочитать реакцию бэкенда в удобном формате JSON.
Методы PUT, PATCH и DELETE
Эта троица обычно нужна для апдейта или сноса информации на стороне хоста. Давайте глянем на каждый случай.
PUT-метод
Применяется для полной перезаписи объекта. Вот как это выглядит на практике:
import requests
updated_data = {"name": "Tom", "age": 26}
response = requests.put("https://api.samplesite.com/users/1", json=updated_data)
print(response.status_code)
Команда выше полностью заменит запись (и имя, и возраст) новыми вводными.
PATCH-метод
В отличие от предыдущего, PATCH обновляет запись точечно, частично. Пример:
import requests
partial_update = {"age": 27}
response = requests.patch("https://api.samplesite.com/users/1", json=partial_update)
print(response.status_code)
Этот код изменит только возраст Тома, не трогая остальное.
DELETE-метод
Служит для удаления. Все просто:
import requests
response = requests.delete("https://api.samplesite.com/users/1")
print(response.status_code)
Приведенный выше скрипт сотрет все данные указанного юзера с сервера.
Работа с заголовками и параметрами
При сетевом общении разработчики часто передают дополнительные метаданные. Например, параметры фильтрации или спецзаголовки. Хорошая новость: в библиотеке есть модули, делающие этот процесс элементарным. Сейчас посмотрим, как управлять параметрами и хедерами.
Передача URL-параметров
Параметры URL (или query strings) позволяют довешивать данные к вашим GET-вызовам. Вместо ручной склейки ссылки, можно передать их как обычный словарь. Смотрите, как это работает:
import requests
params = {"search": "python requests", "page": 2}
response = requests.get("https://api.samplesite.com/results", params=params)
print(response.url) # Shows the final URL with parameters
print(response.status_code)
В этом кейсе библиотека сама отформатирует словарь в правильную строку. Получится что-то вроде: https://api.samplesite.com/results?search=python+requests&page=2
Настройка кастомных хедеров
Иногда API требует особые заголовки. Токены доступа, тип контента или User-Agent. Инструмент позволяет добавлять такие детали бесшовно.
import requests
headers = {
"Authorization": "Bearer YOUR_TOKEN_HERE",
"User-Agent": "MyApp/1.0",
"Content-Type": "application/json"
}
response = requests.get("https://api.samplesite.com/user", headers=headers)
print(response.status_code)
print(response.text)
Использование своих хедеров открывает доступ к защищенным эндпоинтам. Вы сообщаете системе, что именно шлете. И кто вы вообще такой. Это дает гибкость и контроль.
Обработка JSON
Вам, как разработчику, постоянно придется возиться с JSON. Наш инструмент упрощает и отправку, и прием этого формата. Разберем чтение и передачу объектов.
Чтение из ответа
Если веб-сервер отдает данные в JSON, их можно мгновенно конвертировать в словарь Python. Вот так:
import requests
response = requests.get("https://api.samplesite.com/data")
data = response.json()
print(data)
Метод response.json() берет парсинг на себя. Руками вызывать json.loads() не нужно.
Отправка JSON
Обратная операция тоже проста. Передайте данные через аргумент json:
import requests
payload = {"name": "Tom", "role": "developer"}
response = requests.post("https://api.samplesite.com/users", json=payload)
print(response.status_code)
print(response.json())
Модуль сам превратит словарь в JSON. И даже выставит нужный Content-Type.
Передача форм и файлов
Не все API любят JSON. Некоторые ждут данные в кодировке форм или вообще файлы. Посмотрим, как справиться с этим.
Данные формы
Для отправки полей формы используйте аргумент data.
import requests
form_data = {"username": "tom", "password": "12345"}
response = requests.post("https://api.samplesite.com/login", data=form_data)
print(response.status_code)
print(response.text)
Этот код эмулирует отправку обычной HTML-формы.
Загрузка файлов
Для аплоада используем параметр files.
import requests
files = {"profile": open("photo.jpg", "rb")}
response = requests.post("https://api.samplesite.com/upload", files=files)
print(response.status_code)
print(response.text)
Всю рутину с заголовками и потоками библиотека берет на себя.
Тайм-ауты и ошибки
Тайм-ауты и обработка сбоев — киллер-фичи этого инструмента. Веб нестабилен. Серверы тормозят. Чтобы программа не зависла навечно, нужно уметь прерывать соединение и ловить ошибки.
Настройка тайм-аута
Этот параметр задает время ожидания. Сколько ждем ответа, прежде чем «убить» процесс? Это спасает от зависаний.
import requests
try:
response = requests.get("https://api.samplesite.com/data", timeout=5)
print(response.status_code)
except requests.Timeout:
print("The request timed out.")
Здесь скрипт сбросит соединение через 5 секунд. Пользователь увидит сообщение об ошибке.
Можно настроить раздельные таймеры на подключение и чтение.
response = requests.get("https://api.samplesite.com/data", timeout=(3, 10))
3 секунды на коннект. 10 секунд на получение данных.
Частые исключения
Для надежности кода используйте встроенные исключения. Они помогают программе не падать, а реагировать на проблемы изящно.
Timeout
Срабатывает, когда ожидание затянулось.
except requests.Timeout:
print("Request took too long!")
ConnectionError
Говорит о том, что достучаться до хоста не вышло. Сервер недоступен.
except requests.ConnectionError:
print("Failed to connect to the server.")
HTTPError
Возникает, если сервер вернул статус ошибки (4xx или 5xx). Реализация:
response.raise_for_status()
Это вызывает исключение, если что-то пошло не так на той стороне.
RequestException
Универсальный ловец. Поймает любую проблему, связанную с запросом.
except requests.RequestException as e:
print("Something went wrong:", e)
Сессии и куки
Объекты сессий (Session objects) — это способ переиспользовать одно соединение для серии запросов. Код работает быстрее. Плюс, сессии сохраняют куки. Это критично для API с авторизацией.
Использование сессии
import requests
session = requests.Session()
session.headers.update({"User-Agent": "MyApp/1.0"})
response1 = session.get("https://api.samplesite.com/login")
response2 = session.get("https://api.samplesite.com/profile")
print(response1.status_code, response2.status_code)
Что дает такой подход:
- Заголовки сохраняются для всех вызовов.
- Куки, полученные в первом ответе, авто-подставляются во второй.
- Соединение не разрывается (keep-alive), что ускоряет работу.
Ручное управление куками
Можно задать их принудительно:
session.cookies.set("theme", "dark")
print(session.cookies.get_dict())
Продвинутые кейсы
Посмотрим на более сложные задачи. С ними вы столкнетесь в реальных проектах.
Аутентификация по токену
Часто нужно передать токен доступа к защищенному API. Делается это так:
import requests
token = "YOUR_TOKEN"
headers = {"Authorization": f"Bearer {token}"}
response = requests.get("https://api.samplesite.com/secure", headers=headers)
print(response.json())
Пагинация
Если данных много, API отдает их страницами. Чтобы собрать всё, нужен цикл.
import requests
page = 1
results = []
while True:
response = requests.get("https://api.samplesite.com/items", params={"page": page})
data = response.json()
if not data["items"]:
break
results.extend(data["items"])
page += 1
print(len(results))
Multipart-загрузка
Для сложных POST-операций с файлами и данными одновременно:
files = {
"file": ("report.pdf", open("report.pdf", "rb"), "application/pdf")
}
response = requests.post("https://api.samplesite.com/upload", files=files)
Решение типичных проблем
Краткий чек-лист по устранению неполадок:
- Тайм-аут: Увеличьте лимит времени. Или проверьте интернет.
- SSL-ошибки: Убедитесь, что у API валидный сертификат.
- Сбой декодирования JSON: Проверьте, точно ли сервер шлет JSON, а не HTML с ошибкой.
- Ошибки 401/403: Проблема в ключах или токенах. Проверяйте права доступа.
- 429 Too Many Requests: Вы шлете слишком часто. Добавьте паузы (sleep) или логику повторов.
Лучшие практики
Советы для стабильной работы:
- Всегда ставьте тайм-ауты.
- Используйте сессии для серийных обращений.
- Проверяйте ответ сервера перед чтением данных.
- Секретные ключи храните надежно, не в коде.
- Логируйте ошибки. Это спасет нервы при отладке.
- Ловите исключения, чтобы софт не падал.
- Соблюдайте лимиты частоты запросов. Используйте прокси, если вас банят по IP.
Финал
Мы детально разобрали возможности библиотеки. Изучили, как интегрировать HTTP-методы в ваш софт. Этот инструмент скрывает сложность сетевых протоколов, позволяя вам писать код, а не бороться с сетью.
Для любых задач, связанных с API — будь то простые вызовы или сложные схемы с авторизацией и файлами — это решение остается лучшим выбором.


