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'])Пояснение.
Этот подход позволяет гибко настраивать запрос до отправки.