Эффективная отправка HTTP-запросов в Python с помощью requests

Раздел: Python -> Requests

Работа с библиотекой requests в Python

Библиотека requests предоставляет удобный интерфейс для отправки HTTP-запросов и обработки ответов. Ниже приведен основной способ выполнения GET-запроса.

import requests

response = requests.get('https://api.example.com/data')
print(response.status_code)
print(response.text)

Python 2 requests (библиотека requests в python 2)

После установки библиотеки (pip install requests) можно выполнить запрос. Метод get() возвращает объект Response. Атрибут status_code показывает код состояния, text - тело ответа в виде строки. Для работы с JSON используется response.json().

Типичные проблемы:

  • ConnectionError - если сервер недоступен. Решение: проверить URL и интернет-соединение.
  • Timeout - при превышении времени ожидания. Выход: установить параметр timeout.
  • HTTPError - для кодов 4xx/5xx после вызова raise_for_status(). Обработка через проверку response.ok.
  • Некорректная кодировка - если сервер не указывает charset. Исправление: response.encoding = 'utf-8'.

Как выполнить GET-запрос с параметрами?

Параметры передаются через аргумент params в виде словаря. Библиотека автоматически кодирует их в URL.

params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url)  # https://httpbin.org/get?key1=value1&key2=value2

Python 3 requests (библиотека requests в python 3)

Как отправить POST-запрос с данными формы или JSON?

Для данных формы используется аргумент data, для JSON - json.

# Данные формы
response = requests.post('https://httpbin.org/post', data={'field': 'value'})

# JSON
response = requests.post('https://httpbin.org/post', json={'key': 'value'})

Python requests url (выполнение запроса по url с помощью requests в python)

Как обработать JSON-ответ?

Метод response.json() автоматически декодирует JSON-строку в словарь или список.

data = response.json()
print(data['key'])

Python requests headers (заголовки запросов в python requests)

Как настроить заголовки запроса?

Заголовки передаются через словарь в аргумент headers.

headers = {'User-Agent': 'Mozilla/5.0', 'Authorization': 'Bearer token'}
response = requests.get('https://example.com', headers=headers)

Python requests exceptions (исключения в python requests)

Как работать с сессиями и сохранять cookies?

Объект Session сохраняет куки и настройки между запросами.

session = requests.Session()
session.headers.update({'User-Agent': 'my-app'})
resp1 = session.get('https://example.com/login')
# Куки автоматически сохраняются
resp2 = session.get('https://example.com/profile')

Python requests codes (коды ответов http в python requests)

Как установить таймаут запроса?

Таймаут задается через параметр timeout в секундах. Можно указать отдельно для соединения и чтения.

response = requests.get('https://example.com', timeout=5)
# или (connect, read)
response = requests.get('https://example.com', timeout=(3, 10))

Python module requests (модуль requests в python)

Как обрабатывать ошибки и статус-коды?

Метод raise_for_status() генерирует исключение для кодов 4xx/5xx. Проверка response.ok возвращает True для 200-399.

if response.ok:
    print('Успешно')
else:
    print(f'Ошибка: {response.status_code}')

response.raise_for_status()  # исключение при ошибке

Python requests response (обработка ответа requests в python)

Как загрузить файл на сервер?

Файлы передаются через аргумент files в виде словаря.

files = {'file': open('photo.jpg', 'rb')}
response = requests.post('https://example.com/upload', files=files)

работа с requests python (работа с библиотекой requests в python)

Как выполнить аутентификацию (Basic/Digest/OAuth)?

Для Basic используется аргумент auth с кортежем (логин, пароль). Для Digest применяется класс HTTPDigestAuth из requests.auth.

from requests.auth import HTTPDigestAuth

response = requests.get('https://example.com', auth=('user', 'pass'))  # Basic
response = requests.get('https://example.com', auth=HTTPDigestAuth('user', 'pass'))

Requests python скачать (скачивание файлов с помощью requests в python)

Как использовать прокси?

Прокси задаются через словарь с ключами http/https.

proxies = {'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080'}
response = requests.get('https://example.com', proxies=proxies)
- Requests errors python (ошибки библиотеки requests python)
- Python request install (установка библиотеки requests python)

Расширенные примеры работы с requests

Потоковая загрузка большого файла с контролем размера чанков

Используется параметр stream=True и метод iter_content() для чтения данных по частям. Это позволяет загружать большие файлы без использования всей памяти.

Пример
import requests

url = 'https://proof.ovh.net/files/1Mb.dat'
response = requests.get(url, stream=True)
response.raise_for_status()

with open('large_file.dat', 'wb') as f:
    for chunk in response.iter_content(chunk_size=8192):
        if chunk:
            f.write(chunk)
            print(f'Загружено {response.elapsed.total_seconds():.2f} сек', end='\r')
print()
print(f'Статус: {response.status_code}')
print(f'Размер файла: {len(open("large_file.dat", "rb").read())} байт')
Загружено 0.05 сек
Загружено 0.12 сек
...
Статус: 200
Размер файла: 1048576 байт

Повторные попытки с экспоненциальной задержкой через Session и Retry

Библиотека urllib3 встроена в requests. Можно настроить повторные попытки для нестабильных соединений.

Пример
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

session = requests.Session()
retry_strategy = Retry(
    total=3,
    backoff_factor=1,
    status_forcelist=[500, 502, 503, 504],
    allowed_methods=['GET', 'POST']
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount('http://', adapter)
session.mount('https://', adapter)

try:
    response = session.get('https://httpbin.org/status/503', timeout=5)
    print(f'Успех: {response.status_code}')
except requests.exceptions.RetryError as e:
    print(f'Не удалось получить ответ после повторных попыток: {e}')
При задержках сервер 503 будет пытаться повторить запрос до 3 раз.
Пример вывода при недоступности:
Не удалось получить ответ после повторных попыток: ...

Отправка запроса с пользовательским сертификатом и отключением проверки SSL

Для тестирования или работы с самоподписанными сертификатами можно отключить проверку (verify=False) или указать свой CA-сертификат.

Пример
# Отключение проверки SSL (НЕ рекомендуется для продакшена)
response = requests.get('https://self-signed.badssl.com', verify=False)
print(response.status_code)

# Указание сертификата клиента
response = requests.get('https://example.com', cert=('/path/to/client.crt', '/path/to/client.key'))

# Указание CA-сертификата
response = requests.get('https://example.com', verify='/path/to/ca_bundle.crt')
200
(при успешном подключении)

Многопоточная отправка запросов с помощью ThreadPoolExecutor

Для ускорения загрузки множества URL можно использовать пул потоков из модуля concurrent.futures.

Пример
import requests
from concurrent.futures import ThreadPoolExecutor

def fetch_url(url):
    try:
        response = requests.get(url, timeout=10)
        return (url, response.status_code)
    except Exception as e:
        return (url, str(e))

urls = ['https://httpbin.org/delay/1'] * 5  # 5 одинаковых URL для теста
with ThreadPoolExecutor(max_workers=5) as executor:
    results = list(executor.map(fetch_url, urls))

for url, status in results:
    print(f'{url}: {status}')
https://httpbin.org/delay/1: 200
https://httpbin.org/delay/1: 200
https://httpbin.org/delay/1: 200
https://httpbin.org/delay/1: 200
https://httpbin.org/delay/1: 200

Работа с библиотекой requests в Python - comments

En
работа с requests python (python)