HTTP-запросы Python: GET, POST, PUT, DELETE с requests
Основы библиотеки requests и методы GET, POST, PUT, DELETE
Библиотека requests позволяет выполнять HTTP-запросы в Python простым и интуитивным способом. Для работы с методами GET, POST, PUT, DELETE используются соответствующие функции модуля:
import requests
response_get = requests.get('https://api.example.com/resource')
response_post = requests.post('https://api.example.com/resource', data={'key': 'value'})
response_put = requests.put('https://api.example.com/resource/1', data={'key': 'new_value'})
response_delete = requests.delete('https://api.example.com/resource/1')Python requests get (get-запрос через requests в python)
Каждый вызов возвращает объект Response, который содержит статус-код, заголовки, тело ответа и другую информацию. Статус-код проверяется через response.status_code, а текст ответа через response.text или response.json() для JSON.
Как выполнить GET-запрос с параметрами строки запроса?
Параметры передаются через аргумент params в виде словаря:
params = {'page': 2, 'limit': 10}
response = requests.get('https://api.example.com/items', params=params)
print(response.url) # https://api.example.com/items?page=2&limit=10Get html python (получение html-содержимого через http в python)
Как отправить POST-запрос с JSON?
Для JSON используйте аргумент json (библиотека автоматически сериализует словарь):
data = {'name': 'Alice', 'age': 30}
response = requests.post('https://api.example.com/users', json=data)
Url запрос python (работа с url в python)
Заголовок Content-Type устанавливается в application/json автоматически.
Как передать заголовки в запросе?
Словарь заголовков передаётся через аргумент headers:
headers = {'Authorization': 'Bearer token123', 'Accept': 'application/json'}
response = requests.get('https://api.example.com/protected', headers=headers)Python urllib request (отправка запросов с помощью urllib.request в python)
Как использовать базовую аутентификацию?
Используйте аргумент auth с кортежем (логин, пароль):
response = requests.get('https://api.example.com/login', auth=('user', 'pass'))Files upload python (загрузка файлов на сервер с помощью python (requests, flask))
Библиотека автоматически формирует заголовок Authorization с Basic-кодированием.
Как сохранять сессию и куки между запросами?
Объект Session поддерживает общие настройки и сохраняет куки:
session = requests.Session()
session.headers.update({'User-Agent': 'MyApp'})
session.get('https://httpbin.org/cookies/set?name=value')
response = session.get('https://httpbin.org/cookies')
print(response.json()) # {'cookies': {'name': 'value'}}Python requests method (методы http-запросов в python (get, post, put, delete) с requests)
Как обрабатывать ошибки неуспешных запросов?
Метод raise_for_status() выбрасывает исключение при статусе 4xx или 5xx:
try:
response = requests.get('https://httpbin.org/status/404')
response.raise_for_status()
except requests.exceptions.HTTPError as err:
print(f'Ошибка: {err}')Python request data (извлечение данных из http-запроса (request) в python)
Как установить таймаут запроса?
Аргумент timeout задаёт максимальное время ожидания (в секундах):
try:
response = requests.get('https://httpbin.org/delay/5', timeout=3)
except requests.exceptions.Timeout:
print('Запрос превысил таймаут')
Типичные проблемы и их решения
- Кодировка ответа: если текст содержит не-ASCII символы, requests определяет кодировку из заголовка или тела. Принудительная установка: response.encoding = 'utf-8'.
- SSL-сертификаты: для игнорирования ошибок сертификата (не рекомендуется в production) используйте verify=False. Для указания своего CA-пакета передайте путь в verify.
- Redirects: по умолчанию requests следуют редиректам. Отключить можно через allow_redirects=False.
- Ошибка соединения: проверьте доступность хоста, наличие интернета. Исключение requests.exceptions.ConnectionError.
- Большие ответы: для потоковой загрузки используйте stream=True и итерируйте по response.iter_content().
Расширенные примеры работы с HTTP-запросами
1. Потоковая загрузка файла
Использование stream=True для обработки больших ответов по частям:
import requests
url = 'https://example.com/largefile.zip'
response = requests.get(url, stream=True)
response.raise_for_status()
with open('file.zip', 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
Файл постепенно сохраняется на диск, не занимая много оперативной памяти.
2. Загрузка файла на сервер (multipart/form-data)
Отправка файла с помощью аргумента files:
import requests
files = {'file': ('report.txt', open('report.txt', 'rb'), 'text/plain')}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json()['files'])
{
"file": "data:text/plain;base64,<содержимое файла>"
}
3. Повторные попытки при сбоях (Retry)
Использование requests.adapters.HTTPAdapter с политикой повторных попыток:
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
session = requests.Session()
retries = Retry(total=3, backoff_factor=0.1, status_forcelist=[500, 502, 503, 504])
adapter = HTTPAdapter(max_retries=retries)
session.mount('http://', adapter)
session.mount('https://', adapter)
try:
response = session.get('https://httpbin.org/status/500')
response.raise_for_status()
except requests.exceptions.RetryError:
print('Все попытки неудачны')
После трех неудачных попыток (с задержками) возникает исключение RetryError.
4. Использование сессии для размещения входа (login)
Сохраняем куки после аутентификации и используем их в последующих запросах:
session = requests.Session()
login_data = {'username': 'admin', 'password': 'secret'}
session.post('https://example.com/login', data=login_data)
# Теперь куки хранятся в сессии
response = session.get('https://example.com/dashboard')
print(response.text)
Страница dashboard отображается только авторизованным пользователям.
5. Работа с API, требующем токен (Bearer)
Автоматическое добавление заголовка Authorization через сессию:
session = requests.Session()
session.headers.update({'Authorization': 'Bearer my_api_token'})
response = session.get('https://api.github.com/user')
print(response.json()['login'])
Возвращается информация о текущем пользователе (если токен валидный).
6. Прокси для обхода ограничений
Настройка прокси-сервера через аргумент proxies:
proxies = {'http': 'http://proxy.example.com:8080', 'https': 'http://proxy.example.com:8080'}
response = requests.get('https://httpbin.org/ip', proxies=proxies)
print(response.json())
# Для аутентификации прокси: 'http://user:pass@proxy.example.com:8080'
{
"origin": "IP-адрес прокси"
}
7. Асинхронные запросы с использованием ThreadPoolExecutor
Если нужно отправить много запросов параллельно, можно применить пул потоков:
from concurrent.futures import ThreadPoolExecutor
import requests
urls = ['https://httpbin.org/get'] * 5
def fetch(url):
return requests.get(url).json()
with ThreadPoolExecutor(max_workers=3) as executor:
results = list(executor.map(fetch, urls))
print(len(results)) # 5
Все пять запросов выполняются параллельно, сокращая общее время.
8. Обработка переадресаций вручную
Отключаем автоматическое следование редиректам и анализируем Location:
response = requests.get('https://httpbin.org/redirect/3', allow_redirects=False)
print(response.status_code) # 302
print(response.headers['Location']) # /redirect/2
Можно реализовать собственную логику редиректа, например ограничить количество переходов.
9. Использование метода DELETE с телом запроса
Хотя HTTP DELETE обычно не требует тела, некоторые API принимают JSON-данные:
response = requests.delete('https://httpbin.org/delete', json={'reason': 'test'})
print(response.json()['json'])
{
"reason": "test"
}
10. Отправка PUT-запроса для полного обновления ресурса
import requests
resource = {'id': 1, 'name': 'Updated Item', 'price': 99.99}
response = requests.put('https://api.example.com/items/1', json=resource)
if response.status_code == 200:
print('Ресурс обновлён')
Обычно PUT заменяет весь ресурс данными из тела запроса.
Эти примеры охватывают основные и продвинутые сценарии использования библиотеки requests. Каждый фрагмент кода можно адаптировать под конкретную задачу.