Библиотека requests: выполнение HTTP запросов в Python

Раздел: Python -> Requests

Основные возможности библиотеки requests

Библиотека requests предоставляет простой интерфейс для отправки HTTP-запросов. Установка выполняется командой pip install requests. Основной метод - requests.get().

import requests
response = requests.get('https://httpbin.org/get')
print(response.status_code)
print(response.text)

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

Ответ содержит статус, заголовки и тело. Если сайт недоступен, возникает ConnectionError. Решение - использование обработки исключений.

Ошибка requests.exceptions.ConnectionError возникает при недоступности сервера. Для обработки используйте конструкцию try/except.

Как передать параметры в URL?

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

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

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

Результат: https://httpbin.org/get?key1=value1&key2=value2

Если передать список значений, параметр будет повторяться. Например, params = {'key': ['a','b']} даёт ?key=a&key=b.

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

Метод requests.post() использует аргумент data для передачи данных формы.

data = {'username': 'admin', 'password': 'secret'}
r = requests.post('https://httpbin.org/post', data=data)
print(r.json())

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

Данные кодируются как application/x-www-form-urlencoded.

Для отправки JSON данных используйте параметр json, а не data. Иначе сервер не распознает JSON.

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

Используйте параметр json со словарём.

import json
data = {'name': 'John', 'age': 30}
r = requests.post('https://httpbin.org/post', json=data)
print(r.json())

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

Библиотека автоматически устанавливает заголовок Content-Type: application/json и сериализует данные.

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

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

headers = {'User-Agent': 'Mozilla/5.0'}
r = requests.get('https://httpbin.org/headers', headers=headers)
print(r.json())

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

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

Для загрузки файлов используется аргумент files.

files = {'file': open('example.txt', 'rb')}
r = requests.post('https://httpbin.org/post', files=files)
print(r.json())

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

Файл отправляется как multipart/form-data. После завершения запроса файл нужно закрыть.

Если не указать режим 'rb', возможны проблемы с кодировкой. Закрытие файла обязательно для освобождения ресурсов.

Как обработать ошибки HTTP (статусы 4xx, 5xx)?

Метод raise_for_status() генерирует исключение при плохом статусе.

r = requests.get('https://httpbin.org/status/404')
try:
    r.raise_for_status()
except requests.exceptions.HTTPError as err:
    print(f'Ошибка HTTP: {err}')

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

Этот подход предотвращает незаметное игнорирование ошибок.

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

Объект requests.Session() сохраняет куки и другие параметры между запросами.

session = requests.Session()
session.get('https://httpbin.org/cookies/set?name=value')
response = session.get('https://httpbin.org/cookies')
print(response.json())  # {'cookies': {'name': 'value'}}

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

Сессии также полезны для повторного использования заголовков и пула соединений.

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

Таймаут задаётся аргументом timeout в секундах.

try:
    r = requests.get('https://httpbin.org/delay/5', timeout=3)
except requests.exceptions.Timeout:
    print('Запрос превысил время ожидания')

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

Таймаут предотвращает зависание программы при медленных серверах.

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

Прокси передаются через аргумент proxies.

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

Прокси могут потребовать аутентификации, которая указывается в URL.

- Python requests post (отправка post-запроса с помощью requests python)
- Requests errors python (ошибки библиотеки requests python)
- Python request install (установка библиотеки requests python)

Расширенные примеры использования библиотеки requests

В этом разделе рассмотрены менее распространённые, но полезные возможности модуля requests.

Аутентификация: Basic и Digest

Для HTTP Basic аутентификации используется аргумент auth.

Пример
from requests.auth import HTTPBasicAuth
r = requests.get('https://httpbin.org/basic-auth/user/pass',
                 auth=HTTPBasicAuth('user', 'pass'))
print(r.status_code)  # 200

Для Digest аутентификации применяется HTTPDigestAuth.

Пример
from requests.auth import HTTPDigestAuth
r = requests.get('https://httpbin.org/digest-auth/auth/user/pass',
                 auth=HTTPDigestAuth('user', 'pass'))
print(r.status_code)
Если аутентификация неверна, сервер вернёт 401. Исключение не возникает, если не вызван raise_for_status().

Потоковая загрузка больших файлов

Для загрузки больших файлов без сохранения всего содержимого в память используйте параметр stream=True.

Пример
url = 'https://httpbin.org/image/jpeg'
with requests.get(url, stream=True) as r:
    r.raise_for_status()
    with open('image.jpg', 'wb') as f:
        for chunk in r.iter_content(chunk_size=8192):
            f.write(chunk)

Метод iter_content() возвращает части данных. Это эффективно для больших объёмов.

Использование PreparedRequest для предварительной подготовки запроса

Объект PreparedRequest позволяет сформировать запрос и изменить его перед отправкой.

Пример
from requests import Request, Session
s = Session()
req = Request('POST', 'https://httpbin.org/post',
              data={'key': 'value'},
              headers={'X-Custom': 'test'})
prepared = req.prepare()
# модификация перед отправкой
prepared.headers['Authorization'] = 'Bearer token'
response = s.send(prepared)
print(response.json())

Этот подход удобен для логирования или централизованной модификации запросов.

Обработка SSL сертификатов

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

Пример
# отключение проверки (опасно!)
r = requests.get('https://self-signed.badssl.com/', verify=False)
# использование собственного CA
r = requests.get('https://example.com', verify='/path/to/certfile.pem')
Если сертификат недействителен и verify не установлен, возникнет SSLError. В продакшене всегда указывайте корректный CA.

Параллельные запросы с ThreadPoolExecutor

Для ускорения массовых запросов можно использовать пул потоков.

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

def fetch(url):
    return requests.get(url)

urls = ['https://httpbin.org/get'] * 10
with ThreadPoolExecutor(max_workers=4) as executor:
    results = list(executor.map(fetch, urls))
for r in results:
    print(r.status_code)

Внимание: библиотека requests не является потокобезопасной в полной мере, но для большинства сценариев это работает.

Использование hooks (обработчики событий)

Механизм hooks позволяет выполнять код при наступлении определённых событий, например, после получения ответа.

Пример
def print_url(r, *args, **kwargs):
    print(f'Запрос выполнен: {r.url}')

r = requests.get('https://httpbin.org/get', hooks={'response': print_url})
print(r.status_code)

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

Работа с cookies вручную

Можно управлять куками через объект RequestsCookieJar.

Пример
from requests.cookies import RequestsCookieJar
jar = RequestsCookieJar()
jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
r = requests.get('https://httpbin.org/cookies', cookies=jar)
print(r.json())

Этот способ удобен, если требуется изолировать куки от сессии.

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

En
Python 3 requests (python)