Python 2 и requests: практическое применение

Раздел: Python -> Requests

Основные возможности requests в Python 2

Как наиболее эффективно выполнять HTTP-запросы в Python 2 с помощью библиотеки requests?

Библиотека requests предоставляет универсальный интерфейс для отправки HTTP-запросов. В Python 2 (версии 2.7) она используется практически так же, как в Python 3, но с учётом особенностей работы с кодировками и отсутствия встроенной поддержки SSL в некоторых старых дистрибутивах. Ниже приведён базовый, но надёжный шаблон, который покрывает большинство сценариев: сессия, обработка ошибок, таймауты и отключение проверки SSL при необходимости.

import requests
from requests.exceptions import RequestException, Timeout, ConnectionError

session = requests.Session()
session.headers.update({'User-Agent': 'Mozilla/5.0'})
session.auth = ('user', 'pass')  # Базовая аутентификация

try:
    response = session.get(
        'https://httpbin.org/get',
        params={'key': 'value'},
        timeout=10,
        verify=False  # Только для тестовых сертификатов
    )
    response.raise_for_status()  # Генерирует исключение при HTTP-ошибке
    data = response.json()
    print(data)
except Timeout:
    print('Превышен таймаут соединения')
except ConnectionError:
    print('Не удалось установить соединение')
except RequestException as e:
    print('Ошибка запроса: {}'.format(e))

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

Этот код объединяет создание сессии (для сохранения cookies и заголовков), аутентификацию, передачу параметров URL, установку таймаута и отключение проверки SSL-сертификата (verify=False) для случаев, когда сертификат не доверенный. Обработка исключений предотвращает падение программы при сетевых проблемах.

Как отправить GET-запрос с параметрами и обработать ответ в формате JSON?

import requests
params = {'search': 'python requests', 'page': 1}
r = requests.get('https://api.example.com/search', params=params)
print(r.status_code)
print(r.json())

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

Параметры автоматически кодируются в URL. Метод .json() декодирует тело ответа из JSON и возвращает словарь. Если ответ не является валидным JSON, возникнет исключение ValueError.

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

import requests

# Форма
data = {'username': 'admin', 'password': '1234'}
response = requests.post('https://httpbin.org/post', data=data)
print(response.text)

# JSON
import json
payload = {'name': 'John', 'age': 30}
response = requests.post('https://httpbin.org/post', json=payload)
print(response.json())

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

Аргумент data отправляет данные в формате application/x-www-form-urlencoded, а json - в формате application/json (автоматически сериализует словарь). В Python 2 строка JSON корректно обрабатывает unicode-строки.

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

headers = {'Authorization': 'Bearer token123', 'Accept': 'application/json'}
r = requests.get('https://api.example.com/me', headers=headers)
print(r.headers)  # Ответные заголовки

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

Заголовки передаются в виде словаря. Важно: некоторые заголовки (например, Content-Type) requests может переопределять, если вы используете аргумент data или json.

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

session = requests.Session()
session.cookies.set('session_id', 'abc123')
r1 = session.get('https://httpbin.org/cookies')
print(r1.json())
# cookies передаются автоматически в последующих запросах
r2 = session.get('https://httpbin.org/cookies/set?name=value')
print(r2.cookies)  # Новые cookies сохраняются в сессии

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

Сессии также поддерживают пул соединений (keep-alive). Для повышения производительности при множественных запросах к одному хосту используйте сессию.

Как настроить аутентификацию (Basic, Digest, OAuth)?

# Базовая аутентификация
from requests.auth import HTTPBasicAuth
r = requests.get('https://api.example.com/login', auth=HTTPBasicAuth('user', 'pass'))
# Или просто кортеж: auth=('user', 'pass')

# Digest-аутентификация
from requests.auth import HTTPDigestAuth
r = requests.get('https://httpbin.org/digest-auth/auth/user/pass', auth=HTTPDigestAuth('user', 'pass'))

# OAuth1 (требуется установка requests-oauthlib)
# from requests_oauthlib import OAuth1
# auth = OAuth1('client_key', 'client_secret', 'resource_owner_key', 'resource_owner_secret')

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

requests поддерживает несколько схем аутентификации. Для OAuth2 используйте библиотеку requests-oauthlib.

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

files = {'file': open('example.txt', 'rb')}  # 'rb' - чтение в бинарном режиме
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
# Для отправки нескольких файлов: files = {'file1': open(...), 'file2': open(...)}

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

Важно открывать файл в бинарном режиме ('rb'), иначе в Python 2 возможны проблемы с кодировкой. После запроса файл закроется автоматически, если используется менеджер контекста.

Как установить таймаут на соединение и чтение?

try:
    r = requests.get('http://example.com', timeout=(3.0, 7.5))  # (connect, read)
except requests.exceptions.Timeout:
    print('Запрос превысил время ожидания')

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

Таймаут можно задать одним числом (применяется для обоих этапов) или кортежем. Без таймаута запрос может зависнуть навсегда.

Как отключить проверку SSL-сертификата или указать собственный CA-файл?

# Отключить проверку (небезопасно)
r = requests.get('https://expired.badssl.com/', verify=False)
# Указать CA-файл
r = requests.get('https://example.com', verify='/path/to/cacert.pem')

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

В Python 2 при verify=False может появиться предупреждение InsecureRequestWarning. Его можно подавить:

from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

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

Как настроить прокси-сервер?

proxies = {
  'http': 'http://10.10.1.10:3128',
  'https': 'http://10.10.1.10:1080',
}
r = requests.get('http://example.org', proxies=proxies)

Python types requests (типы запросов в requests python)

Для аутентификации на прокси добавьте логин и пароль: 'http://user:pass@proxy:port'.

Как обработать перенаправления (redirects)?

r = requests.get('http://github.com', allow_redirects=False)  # отключить авто-перенаправление
print(r.status_code)  # 302
print(r.headers['Location'])  # URL перенаправления

# Включить (по умолчанию True)
r = requests.get('http://github.com', allow_redirects=True)
print(r.history)  # список объектов Response для редиректов

Python requests post (отправка post-запроса с помощью requests python)

Максимальное количество редиректов можно задать через параметр max_redirects в Session.

Какие типичные ошибки возникают при работе с requests в Python 2 и как их исправить?

  • SSL ошибка verify failed: Используйте verify=False или укажите путь к сертификату. Для постоянного решения установите сертификаты через certifi или обновите OpenSSL.
  • UnicodeDecodeError при декодировании JSON: Если ответ содержит не-ASCII символы, укажите правильную кодировку:
    response.encoding = 'utf-8'
    data = response.json()
  • ConnectionError или Timeout: Проверьте доступность сервера, настройки сети и таймауты.
  • TooManyRedirects: Увеличьте max_redirects или отключите редиректы.
  • Ошибка при отправке файла: Убедитесь, что файл открыт в бинарном режиме 'rb'.

Расширенные примеры использования requests в Python 2

Как выполнить потоковую загрузку (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):
        if chunk:
            f.write(chunk)
            f.flush()
print('Файл загружен частями')

Параметр stream=True предотвращает загрузку всего содержимого в память. Метод iter_content возвращает итератор с байтовыми чанками. Это экономит память при скачивании больших объёмов данных.

Файл загружен частями

Как использовать PreparedRequest для детального контроля над запросом?

Пример
from requests import Request, Session

session = Session()
req = Request('GET', 'https://httpbin.org/get', 
              headers={'X-Custom': 'value'},
              params={'param1': 'data'})
prepared = session.prepare_request(req)

# Модифицировать подготовленный запрос до отправки
prepared.headers['Authorization'] = 'Bearer abc'
prepared.body = None  # Убрать тело, если было

response = session.send(prepared)
print(response.json())

PreparedRequest позволяет изменить запрос непосредственно перед отправкой. Это полезно для перехвата, логирования или подписания запросов.

{"args": {"param1": "data"}, "headers": {"Authorization": "Bearer abc", "X-Custom": "value", ...}}

Как добавить автоматическую повторную отправку (retry) запроса при временных ошибках?

Пример
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],
    method_whitelist=['GET', 'POST']
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount('https://', adapter)
session.mount('http://', adapter)

response = session.get('https://httpbin.org/status/500')
print(response.status_code)  # после 3 попыток может быть 500

Retry настраивается через urllib3. backoff_factor задаёт задержку между попытками (1, 2, 4 секунды). Это повышает устойчивость к временным сбоям.

500

Как перехватывать события запроса с помощью хуков (hooks)?

Пример
import requests

def log_request(response, *args, **kwargs):
    print('URL:', response.request.url)
    print('Status:', response.status_code)

def check_error(response, *args, **kwargs):
    response.raise_for_status()

session = requests.Session()
session.hooks['response'] = [log_request, check_error]

response = session.get('https://httpbin.org/status/404')  # сгенерирует исключение

Хуки позволяют выполнить функцию после получения ответа. Можно реализовать логирование, автоматическую проверку ошибок или изменение ответа.

URL: https://httpbin.org/status/404
Status: 404
Traceback (most recent call last):
  ...
requests.exceptions.HTTPError: 404 Client Error: NOT FOUND for url: https://httpbin.org/status/404

Как использовать кастомный транспортный адаптер для поддержки протокола socks?

Пример
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.contrib.socks import SOCKSAdapter

session = requests.Session()
session.mount('socks5://', SOCKSAdapter())

# Использование с прокси
proxies = {
    'http': 'socks5://localhost:9050',
    'https': 'socks5://localhost:9050'
}
response = session.get('http://example.com', proxies=proxies)
print(response.text[:100])

Для работы с SOCKS требуется установить библиотеку PySocks (pip install PySocks). Адаптер автоматически обрабатывает SOCKS5, SOCKS4.



...

Как отправить запрос с самоподписанным сертификатом с использованием клиентских сертификатов (mTLS)?

Пример
import requests

url = 'https://example.com/api'
cert = ('/path/to/client.crt', '/path/to/client.key')
r = requests.get(url, cert=cert, verify='/path/to/ca.pem')
print(r.status_code)

Параметр cert принимает кортеж (путь к сертификату, путь к ключу) или строку с объединённым PEM. verify указывает на корневой CA-файл для проверки сервера.

200

Как использовать requests в асинхронном режиме (с помощью gevent или concurrent.futures)?

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

def fetch(url):
    resp = requests.get(url, timeout=5)
    return resp.json()

urls = ['https://httpbin.org/get', 'https://httpbin.org/ip']
with ThreadPoolExecutor(max_workers=5) as executor:
    results = list(executor.map(fetch, urls))
print(results)

requests не поддерживает полноценную асинхронность, но можно использовать пул потоков для параллельных запросов. Для асинхронной версии с asyncio используйте библиотеку aiohttp.

[{'args': {}, 'headers': {...}, ...}, {'origin': '123.123.123.123'}]

Библиотека requests в Python 2 - comments

En
Python 2 requests (python)