Python 2 и 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 попыток может быть 500Retry настраивается через 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'}]