Python Requests: Полный гайд (GET, POST, загрузка файлов)
Как отправлять HTTP-запросы, взаимодействовать с API и безопасно работать с файлами, используя самую популярную библиотеку Python.
Введение
Библиотека requests - это стандарт де-факто для выполнения HTTP-запросов в Python. Она скрывает сложности выполнения запросов за простым API, позволяя тебе сосредоточиться на взаимодействии с сервисами и обработке данных.
Нужно ли тебе получить веб-страницу, отправить JSON в API или загрузить файл - requests делает это интуитивно понятным.
Шаг 0: Настройка виртуального окружения
Прежде чем устанавливать какие-либо пакеты, настоятельно рекомендуется создать виртуальное окружение. Это изолирует зависимости твоего проекта от системного Python и предотвратит конфликты версий.
Посмотри наш быстрый гайд о том, как использовать виртуальные окружения Python (venv), чтобы всё настроить за считанные секунды.
Шаг 1: Установка
requests не входит в стандартную библиотеку Python, поэтому её нужно установить через pip.
Установи библиотеку:
(env) xinit@localhost:~$ pip install requests
Шаг 2: GET-запросы (и query-параметры)
Самый распространенный метод - это GET. Ты можешь передавать параметры запроса (часть URL после ?) в виде словаря Python, используя аргумент params. Библиотека автоматически закодирует их за тебя.
Получение данных с параметрами:
import requests
# Это отправит запрос на: https://example.com/get?key=value&page=2
params = {'key': 'value', 'page': 2}
r = requests.get(url='https://example.com/get', params=params)
print(r.status_code)
print(r.json())
Шаг 3: POST-запросы (отправка JSON)
При взаимодействии с современными API часто нужно отправлять данные. Использование параметра json автоматически добавляет правильный заголовок Content-Type: application/json и форматирует твой словарь.
Отправка данных в формате JSON:
import requests
data = {'username': 'new_user', 'active': True}
r = requests.post(url='https://example.com/post', json=data)
print(r.status_code)
print(r.json())
Шаг 4: Кастомные заголовки и аутентификация
API часто требуют токены аутентификации или специфические строки User-Agent. Ты можешь передать их в словаре через аргумент headers.
Отправка запроса с заголовком Authorization:
import requests
headers = {'Authorization': 'Bearer YOUR_SECRET_TOKEN'}
r = requests.get(url='https://example.com/auth', headers=headers)
print(r.status_code)
print(r.json())
Шаг 5: Загрузка файлов (multipart upload)
Чтобы загрузить файлы (например, отправить форму с полем для файла), используй аргумент files. Всегда открывай файлы в бинарном режиме ('rb').
Загрузка PDF-файла:
import requests
files = {'file': open('/home/user/Downloads/file.pdf', 'rb')}
r = requests.post(url='https://example.com/upload', files=files)
print(r.status_code)
print(r.json())
Шаг 6: Скачивание файлов
Если ответ представляет собой бинарный файл (например, изображение или PDF), тебе следует обращаться к r.content и записывать его в файл в бинарном режиме ('wb').
Скачивание и сохранение файла:
import requests
r = requests.get(url='https://example.com/file')
with open('downloaded_file.pdf', 'wb') as f:
f.write(r.content)
Шаг 7: Лучшие практики (таймауты и обработка ошибок)
В продакшн-коде всегда устанавливай таймаут. По умолчанию requests будет висеть бесконечно, если сервер не отвечает, что может заморозить твоё приложение. Кроме того, проверять status_code вручную утомительно. Используй метод .raise_for_status(), чтобы автоматически вызывать исключение, если запрос не удался (например, 404 Not Found или 500 Server Error).
Надежный шаблон запроса:
import requests
try:
# Ждем ответ 5 секунд, иначе вызываем ошибку
r = requests.get('https://example.com/api', timeout=5)
# Вызываем исключение для статус-кодов 4xx или 5xx
r.raise_for_status()
print(r.json())
except requests.exceptions.RequestException as e:
print(f'Произошла ошибка: {e}')
Заключение
Теперь у тебя есть прочная база для работы с HTTP в Python. Ты умеешь получать данные, отправлять JSON, работать с аутентификацией, а также надежно обрабатывать ошибки и таймауты. Эти паттерны покрывают подавляющее большинство задач по интеграции с API.