4.1 Обработка ответов
Модуль requests предоставляет удобные методы для работы с ответами сервера.
Статус-коды
Кроме ответа, сервер еще присылает статус обработки запроса. Информация о статусе содержится в полях status_code и reason. Пример ниже:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code) # Выводит статус-код ответа
print(response.reason) # Выводит текстовое описание статуса
print(response.ok) # Возвращает True, если статус-код меньше 400
Заголовки
Ну и конечно, какой HTTP-запрос без заголовков? Если вам нужны заголовки запроса или заголовки ответа, то к ним можно обратиться через поле headers:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.headers) # Выводит заголовки ответа
print(response.headers['Content-Type']) # Выводит значение конкретного заголовка
Тело ответа
Ответ сервера может содержать набор байтов, текст, json или xml. Если вы знаете, что именно вы запрашиваете у сервера, то можете сразу получить объект нужного типа, воспользовавшись одним из методов/полей:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.text) # Выводит тело ответа в виде текста
print(response.json()) # Выводит тело ответа в виде JSON
print(response.content) # Выводит тело ответа в виде байтов
Более подробно о заголовках (headers) и статусах ответа вы узнаете в лекциях про устройство сети.
4.2 Обработка ошибок
Модуль requests предоставляет исключения для обработки ошибок.
HTTP-стандарт не подразумевает исключений, вместо этого он работает с кодами ошибок (status_code). Если вы хотите, чтобы в результате неудачного запроса было сгенерировано исключение Python, вам нужно явно вызвать функцию raise_for_status().
Пример:
import requests
try:
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
response.raise_for_status() # Генерирует исключение для статус-кодов 4xx и 5xx
except requests.exceptions.HTTPError as err:
print(f"HTTP error occurred: {err}")
except Exception as err:
print(f"Other error occurred: {err}")
else:
print("Success!")
Более подробно про коды ошибок вы можете узнать из лекций про устройство сети.
4.3 Отправка данных
До изобретения JSON большие объемы данных отправлялись посредством «формы». Форма – это специальный объект страницы браузера (и стандарт данных в HTTP). Если вы хотите отправить данные «посредством формы», то вам нужно просто вместе с запросом передать параметр data.
Важно! GET-запросы не поддерживают формы, поскольку не содержат тела запроса. Все их данные передаются только в URL.
Отправка данных в GET-запросе
В GET-запросе данные передаются через параметры URL. Вот пример:
import requests
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url) # Выведет URL с добавленными параметрами
Отправка данных формы
Мы воспользуемся POST-запросом, чтобы отправить данные на сервер.
Пример:
import requests
data = {
'username': 'example',
'password': 'password'
}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())
Отправка файлов
Если вы хотите отправить в интернет бинарные данные, например, загрузить картинку, то для этого вам нужно передать ваш файл или файлы в запрос с помощью параметра files.
Пример:
import requests
files = {'file': open('example.txt', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
Просто как дважды два. Если вы хотите отправить несколько файлов, то перечислите их под любыми именами в переменной files.
Важно! Не забывайте закрывать файл после отправки, чтобы избежать утечки ресурсов. Лучше всего использовать конструкцию with, которая автоматически закроет файл после завершения операции:
import requests
with open('example.txt', 'rb') as f:
files = {'file': f}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
4.4 Логин и авторизация
API (Application Programming Interface) – это набор правил и протоколов, которые позволяют различным программам взаимодействовать друг с другом. Очень многие сайты и сервисы разрешают отправлять им запросы и работать с их API только после логина.
После успешного логина вы получаете специальный объект – сессию (session), который содержит уникальный номер вашей «авторизованной сессии с сервером». Для дальнейших запросов вам нужно будет использовать этот объект.
Аутентификация
Для того, чтобы залогиниться на сервер, нужно пройти аутентификацию (процесс логина), для чего вам нужно передать с запросом учетные данные.
import requests
from requests.auth import HTTPBasicAuth
response = requests.get('https://httpbin.org/basic-auth/user/pass', \
auth=HTTPBasicAuth('user', 'pass'))
print(response.status_code)
Так выглядит процесс авторизации, но обычно его используют вместе с сессией.
Использование сессий
Сессии позволяют сохранять параметры между запросами, такие как cookies или информация об авторизации пользователя.
import requests
payload = {
'username': 'your_username',
'password': 'your_password'
}
# Создание сессии
session = requests.Session()
# Логин на сайт
login_response = session.post('https://example.com/login', data = payload)
# Дальнейшая работа под сессией залогиненного пользователя
data_response = session.get('https://example.com/api/data')
print(data_response.json())
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ