HTTP-запросы с requests в Python: практическое руководство

Раздел: Сетевое программирование -> Сетевые запросы

Основы работы с библиотекой requests

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

import requests\nresponse = requests.get('https://api.example.com')\nprint(response.status_code)\nprint(response.text)

узнать ip python (получение ip адреса с помощью python)

200\n{'key': 'value'}

Python request https (https запросы с requests)

Пояснение.

В этом примере отправляется GET запрос. Атрибут status_code содержит код ответа. text содержит тело ответа в виде строки. Для работы с JSON используется response.json().

Типичные ошибки.

  • Ошибка подключения (ConnectionError) при недоступности сервера.
  • Ошибка таймаута, если не указан timeout.
  • Неверный URL приводит к исключению MissingSchema.

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

Передача параметров через аргумент params словарём или списком кортежей.

params = {'q': 'python', 'page': 1}\nresponse = requests.get('https://api.example.com/search', params=params)\nprint(response.url)

Python requests data (работа с http запросами через библиотеку requests в python)

https://api.example.com/search?q=python&page=1

Пояснение.

Параметры автоматически кодируются и добавляются к URL. Библиотека корректно обрабатывает спецсимволы.

Возможные проблемы.

Если параметр имеет значение None, он будет пропущен. Если передать список значений, они будут повторяться (?key=1&key=2).

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

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

data = {'username': 'user', 'password': 'pass'}\nresponse = requests.post('https://httpbin.org/post', data=data)\nprint(response.json()['form'])
{'username': 'user', 'password': 'pass'}

Пояснение.

Данные кодируются как application/x-www-form-urlencoded. Для отправки файлов используется аргумент files.

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

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

import json\npayload = {'key': 'value'}\nresponse = requests.post('https://httpbin.org/post', json=payload)\nprint(response.json()['json'])
{'key': 'value'}

Пояснение.

Не следует одновременно использовать data и json. Приоритет у json.

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

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

headers = {'User-Agent': 'MyApp/1.0', 'Accept': 'application/json'}\nresponse = requests.get('https://api.example.com', headers=headers)

Пояснение.

Некоторые заголовки (например, Content-Type) могут устанавливаться автоматически в зависимости от аргументов.

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

Объект Session позволяет сохранять cookies, заголовки и параметры между запросами.

session = requests.Session()\nsession.headers.update({'Authorization': 'Bearer token'})\nresponse1 = session.get('https://api.example.com/user')\nresponse2 = session.get('https://api.example.com/profile')\nsession.close()

Пояснение.

Сессия автоматически обрабатывает cookies из ответов и отправляет их при последующих запросах. Это полезно для аутентификации.

Типичная ошибка.

Забыть закрыть сессию (метод close() или использование менеджера контекста with).

Как обрабатывать ошибки и устанавливать таймауты?

Таймаут задаётся аргументом timeout. Исключения обрабатываются с помощью raise_for_status().

try:\n    response = requests.get('https://api.example.com', timeout=3)\n    response.raise_for_status()\nexcept requests.exceptions.Timeout:\n    print('Таймаут')\nexcept requests.exceptions.HTTPError as e:\n    print(f'HTTP ошибка: {e}')\nexcept requests.exceptions.RequestException as e:\n    print(f'Ошибка: {e}')

Пояснение.

timeout устанавливает максимальное время ожидания ответа. raise_for_status() генерирует исключение при коде 4xx или 5xx.

Распространённая проблема.

Без таймаута запрос может зависнуть навсегда. Всегда рекомендуется указывать timeout.

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

Базовая аутентификация (Basic Auth)

Для Basic Auth используется кортеж (логин, пароль) в аргументе auth.

Пример
from requests.auth import HTTPBasicAuth\nresponse = requests.get('https://api.example.com', auth=HTTPBasicAuth('user', 'pass'))\n# или сокращённо: auth=('user', 'pass')\nprint(response.status_code)

Аутентификация через Bearer токен

Токен передаётся в заголовке Authorization.

Пример
headers = {'Authorization': 'Bearer ваш_токен'}\nresponse = requests.get('https://api.example.com', headers=headers)\nprint(response.json())

Отправка файлов (multipart/form-data)

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

Пример
files = {'file': open('example.txt', 'rb')}\nresponse = requests.post('https://httpbin.org/post', files=files)\nprint(response.json()['files'])\nfiles['file'].close()

Пояснение.

Также можно передать имя файла и тип контента в кортеже: ('filename', content, 'content_type').

Работа с прокси

Прокси задаются словарём с протоколами.

Пример
proxies = {\n    'http': 'http://10.10.1.10:3128',\n    'https': 'http://10.10.1.10:1080',\n}\nresponse = requests.get('https://api.example.com', proxies=proxies)

Пояснение.

Для аутентификации на прокси используется proxies={'http': 'http://user:pass@10.10.1.10:3128'}.

Автоматические повторные попытки (Retry)

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

Пример
from requests.adapters import HTTPAdapter\nfrom urllib3.util.retry import Retry\n\nsession = requests.Session()\nretry = Retry(total=3, backoff_factor=0.5, status_forcelist=[500, 502, 503, 504])\nadapter = HTTPAdapter(max_retries=retry)\nsession.mount('http://', adapter)\nsession.mount('https://', adapter)\nresponse = session.get('https://api.example.com')

Пояснение.

total - максимальное количество попыток. backoff_factor - время задержки между попытками.

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

Используется аргумент stream=True для скачивания частями.

Пример
with requests.get('https://example.com/large_file.zip', stream=True) as r:\n    r.raise_for_status()\n    with open('large_file.zip', 'wb') as f:\n        for chunk in r.iter_content(chunk_size=8192):\n            f.write(chunk)

Пояснение.

Метод iter_content возвращает части содержимого. При stream=True соединение не закрывается до завершения чтения.

Обработка cookies и управление сессией

Cookies можно получить из ответа и отправить вручную.

Пример
response = requests.get('https://httpbin.org/cookies/set?key=value')\nprint(response.cookies)\n# для отправки в следующий запрос:\nresponse2 = requests.get('https://httpbin.org/cookies', cookies=response.cookies)\nprint(response2.json())

Пояснение.

Но удобнее использовать Session, которая автоматически сохраняет и отправляет cookies.

Проверка SSL сертификата и игнорирование ошибок

По умолчанию проверяется сертификат. Для отключения используется verify=False (не рекомендуется).

Пример
response = requests.get('https://self-signed.badssl.com/', verify=False)\n# предупреждение будет подавлено если установить suppress_warnings\nimport urllib3\nurllib3.disable_warnings()

Пояснение.

Лучше передать путь к сертификату через verify='/path/to/cert.pem'.

Использование пользовательского перенаправления (redirect)

requests автоматически следует редиректам. Для отключения: allow_redirects=False.

Пример
response = requests.get('https://httpbin.org/redirect/3', allow_redirects=False)\nprint(response.status_code)  # 302\nprint(response.headers['Location'])

Работа с заголовками ответа и кэширование

Можно получить заголовки ответа и установить свои.

Пример
response = requests.get('https://api.example.com')\nprint(response.headers.get('Cache-Control'))\n# установка заголовка If-Modified-Since для условного запроса\nheaders = {'If-Modified-Since': 'Wed, 21 Oct 2023 07:28:00 GMT'}\nresponse2 = requests.get('https://api.example.com', headers=headers)

Составление сложных запросов с помощью Prepared Request

Можно создать объект PreparedRequest и затем отправить его через сессию.

Пример
from requests import Request, Session\nurl = 'https://httpbin.org/post'\ndata = {'key': 'value'}\nreq = Request('POST', url, data=data)\nprepared = req.prepare()\nsession = Session()\nresponse = session.send(prepared)\nprint(response.json()['form'])

Пояснение.

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

Работа с HTTP запросами через библиотеку requests в Python - comments

En
Python requests data (python)