Библиотека requests: выполнение HTTP запросов в Python
Основные возможности библиотеки 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. Решение - использование обработки исключений.
Как передать параметры в 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
?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 со словарём.
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.
Расширенные примеры использования библиотеки 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)Потоковая загрузка больших файлов
Для загрузки больших файлов без сохранения всего содержимого в память используйте параметр 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')Параллельные запросы с 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())Этот способ удобен, если требуется изолировать куки от сессии.