Отправка HTTP запросов из Python: библиотеки и примеры

Раздел: Веб-разработка -> HTTP

Основное решение: библиотека requests

Для большинства задач по отправке HTTP запросов в Python оптимальным выбором является сторонняя библиотека requests. Она предоставляет интуитивно понятный интерфейс, автоматическую обработку кодировок, поддержку сессий, таймаутов и многое другое.


import requests

# GET запрос
response = requests.get('https://api.example.com/data')
print(response.status_code)
print(response.text)

# POST запрос с JSON
payload = {'key': 'value'}
response = requests.post('https://api.example.com/submit', json=payload)
print(response.json())

# Параметры строки запроса
params = {'search': 'python', 'page': 1}
response = requests.get('https://api.example.com/search', params=params)

# Заголовки
headers = {'Authorization': 'Bearer token123'}
response = requests.get('https://api.example.com/protected', headers=headers)

# Обработка ошибок
try:
    response = requests.get('https://nonexistent.url', timeout=5)
    response.raise_for_status()
    print('Успех')
except requests.exceptions.RequestException as e:
    print(f'Ошибка: {e}')
  

Python requests get (get-запрос через requests в python)

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

  • ConnectionError – сервер недоступен. Проверьте URL или интернет.
  • Timeout – превышено время ожидания. Увеличьте параметр timeout.
  • HTTPError (4xx, 5xx) – используйте raise_for_status() для явной обработки.
  • InvalidURL – некорректный URL. Валидируйте перед запросом.

Как выполнить HTTP запрос без установки сторонних библиотек?

Стандартный модуль urllib.request позволяет отправлять запросы без дополнительных зависимостей.


from urllib.request import urlopen, Request
from urllib.parse import urlencode

# GET запрос
response = urlopen('https://api.example.com/data')
data = response.read().decode('utf-8')
print(data)

# POST запрос с параметрами
params = urlencode({'key': 'value'}).encode()
req = Request('https://api.example.com/submit', data=params, method='POST')
response = urlopen(req)
print(response.read().decode())

# Обработка ошибок
from urllib.error import URLError, HTTPError
try:
    response = urlopen('https://nonexistent.url', timeout=5)
except HTTPError as e:
    print(f'HTTP ошибка: {e.code} {e.reason}')
except URLError as e:
    print(f'URL ошибка: {e.reason}')
  

Get html python (получение html-содержимого через http в python)

Проблемы и решения:

  • Нет автоматического декодирования – нужно вручную вызывать .decode() с правильной кодировкой.
  • Отсутствует raise_for_status() – проверяйте статус через response.getcode() или обрабатывайте HTTPError.
  • Для работы с JSON требуется json.loads().
  • Сложнее настройка заголовков и сессий.

Как использовать современный HTTP клиент с поддержкой HTTP/2 и асинхронности?

Библиотека httpx предлагает как синхронный, так и асинхронный API, а также поддержку HTTP/2.


import httpx

# Синхронный GET
with httpx.Client() as client:
    response = client.get('https://api.example.com/data')
    print(response.status_code, response.json())

# Асинхронный GET
import asyncio

async def fetch():
    async with httpx.AsyncClient() as client:
        response = await client.get('https://api.example.com/data')
        print(response.text)

asyncio.run(fetch())
  

Url запрос python (работа с url в python)

Специфические сложности:

  • Для HTTP/2 требуется установка pip install httpx[http2].
  • Асинхронный код требует среды выполнения asyncio.
  • На Windows могут возникать проблемы с select-циклом.

Как выполнить асинхронные HTTP запросы для высоконагруженных систем?

Библиотека aiohttp – популярное решение для асинхронной работы с HTTP.


import aiohttp
import asyncio

async def fetch_data():
    async with aiohttp.ClientSession() as session:
        async with session.get('https://api.example.com/data') as response:
            print(await response.text())

asyncio.run(fetch_data())
  

Python urllib request (отправка запросов с помощью urllib.request в python)

  • Требуется тщательно управлять сессиями и закрывать их.
  • Ошибки в асинхронном коде сложнее отлаживать.
  • Необходимо учитывать лимиты соединений.

Как повторно использовать соединения и сохранять cookies?

Объект requests.Session сохраняет параметры между запросами и автоматически управляет cookies.


import requests

with requests.Session() as session:
    session.headers.update({'User-Agent': 'MyApp'})
    # Первый запрос – получаем cookies
    response = session.get('https://httpbin.org/cookies/set?name=value')
    # Второй запрос – cookies отправляются автоматически
    response = session.get('https://httpbin.org/cookies')
    print(response.json())
  
  • Сессия потребляет память; не забывайте закрывать через контекстный менеджер.
  • Если cookies устарели, нужно обновлять их вручную.
- Python request data (извлечение данных из http-запроса (request) в python)
- Python send request (отправка http-запроса в python (requests.get/post))
- Python post file (отправка файла через post-запрос (requests.post(file)) в python)

Расширенные примеры работы с URL в Python

1. Отправка multipart/form-data с файлом

Пример

import requests

url = 'https://httpbin.org/post'
files = {'file': ('report.xlsx', open('report.xlsx', 'rb'), 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')}
response = requests.post(url, files=files)
print(response.json())
  
{
  "files": {"file": "..."},
  "form": {},
  "headers": {"Content-Type": "multipart/form-data; boundary=..."}
}
  

2. Работа с прокси (HTTP и SOCKS)

Пример

import requests

# HTTP прокси
proxies = {
    'http': 'http://user:pass@proxy.example.com:8080',
    'https': 'http://user:pass@proxy.example.com:8080'
}
try:
    response = requests.get('https://api.example.com', proxies=proxies, timeout=10)
    print(response.status_code)
except requests.exceptions.ProxyError as e:
    print(f'Ошибка прокси: {e}')

# SOCKS5 прокси (требуется pip install requests[socks])
proxies = {
    'http': 'socks5://user:pass@proxy.example.com:1080',
    'https': 'socks5://user:pass@proxy.example.com:1080'
}
response = requests.get('https://api.example.com', proxies=proxies)
  

3. Настройка таймаутов и автоматических повторных попыток

Пример

import requests
from requests.adapters import HTTPAdapter
from requests.packages.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('https://', adapter)
session.mount('http://', adapter)

try:
    response = session.get('https://api.example.com/unstable', timeout=10)
    print(response.status_code)
except requests.exceptions.RetryError as e:
    print('Все попытки исчерпаны', e)
  
200 (после нескольких попыток, если сервер стал отвечать)
  

4. Потоковая загрузка большого файла (streaming)

Пример

import requests

url = 'https://example.com/largefile.zip'
response = requests.get(url, stream=True)
response.raise_for_status()

with open('largefile.zip', 'wb') as f:
    for chunk in response.iter_content(chunk_size=8192):
        f.write(chunk)
print('Файл скачан')
  

5. Проверка SSL сертификата и работа с самоподписанными сертификатами

Пример

import requests

# Игнорирование проверки (не рекомендуется для продакшена)
response = requests.get('https://self-signed.badssl.com', verify=False)

# Использование собственного CA bundle
response = requests.get('https://internal.example.com', verify='/path/to/custom_ca.pem')

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

6. Использование Bearer токена для авторизации

Пример

import requests

token = 'eyJhbGciOiJIUzI1NiIs...'
headers = {'Authorization': f'Bearer {token}'}
response = requests.get('https://api.example.com/user', headers=headers)
if response.status_code == 200:
    print(response.json())
else:
    print('Ошибка авторизации')
  
{
  "id": 123,
  "name": "Иван"
}
  

Работа с URL в Python - comments

En
Url запрос python (python)