Эффективная отправка HTTP-запросов в 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=value2Python 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
Потоковая загрузка большого файла с контролем размера чанков
Используется параметр 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