Requests в Python – примеры запросов
В языке программирования Python существует библиотека requests. Это стандартный инструмент, который используют для составления HTTP-запросов. Согласно документации, библиотека Requests позволяет:
• создавать запросы посредством наиболее популярных HTTP-методов; • редактировать заголовки запросов и данных с помощью строки запроса, а также содержимого сообщения; • анализировать данные запросов и откликов; • создавать авторизированные запросы; • настраивать запросы с целью предотвращения сбоев и замедлений в работе приложения.
Установка библиотеки requests на Python
Работа начинается с установки библиотеки requests. Для этого подойдёт следующая команда:
$ pip install requests
Если вы используете виртуальную среду Pipenv, команда будет немного другой:
$ pipenv install requests
Когда установка выполнена, вы можете переходить в среду разработки и полноценно использовать requests в приложении, предварительно выполнив импорт requests:
import requests
Итак, подготовительные действия выполнены, поэтому можно переходить к изучению requests. Начать лучше с запроса GET.
Python Requests и метод GET
Как вы, наверное, знаете, существуют HTTP-методы GET и POST. Они определяют, какие конкретно действия выполнятся при формировании HTTP-запроса. Есть и другие методы: POST, DELETE, HEAD, PUT, PATCH и OPTIONS. И для каждого из них определена своя сигнатура.
Самый популярный запрос — GET. Он указывает, что осуществляется попытка извлечь данные из какого-нибудь ресурса. Для выполнения этого запроса используют команду
Вот, например, как выглядит запрос GET в отношении Root REST API на GitHub:
requests.get('https://api.github.com') <Response [200]>
Объект Response — получаем ответ на запрос в Python
Response — мощный объект, предназначенный для анализа результатов запроса.
response = requests.get('https://api.github.com')
В вышеописанном примере мы использовали
HTTP-коды состояний
Первые данные, которые мы получим посредством Response, будут коды состояния. Они сообщают о статусе нашего запроса.
К примеру, статус 200 OK означает, что запрос был успешно выполнен. А известная всем ошибка 404 NOT FOUND скажет нам, что запрашиваемый ресурс найден не был. Таких статусных информационных кодов существует довольно много.
Давайте с помощью .status_code, увидим код состояния, возвращаемый с сервера.
>>> response.status_code 200
В нашем случае .status_code вернул 200, что означает успешно выполненный запрос. Кстати, иногда полученная информация используется при написании кода:
if response.status_code == 200: print('Success!') elif response.status_code == 404: print('Not Found.')
Получаем содержимое страницы в Requests
Нередко ответ на GET-запрос включает в себя довольно ценную информацию. Эта информация находится в теле сообщения и её называют payload. Применяя атрибуты и методы библиотеки Response, мы сможем получить payload в разных форматах.
Если хотим получить содержимое запроса в байтах, нужно использовать .content.
>>> response = requests.get('https://api.github.com') >>> response.content
Применение .content обеспечивает нам доступ к любым данным в теле запроса. Но нередко надо конвертировать полученные данные в строку с кодировкой UTF-8. Для этого выполняем команду response.text. По умолчанию requests пытается узнать текущую кодировку по заголовкам HTTP. Но мы можем указать нужную кодировку путём добавления перед .text .encoding.
>>> response.encoding = 'utf-8' # Optional: requests infers this internally >>> response.text
Заголовки HTTP в Requests
HTTP-заголовки ответов на запросы тоже могут дать нам полезную информацию. Например, тип содержимого ответного payload либо ограничения по времени для кэширования ответа. Чтобы посмотреть заголовок, надо заглянуть в атрибут .headers. Вот, как это может выглядеть:
>>> response.headers {'Server': 'GitHub.com', 'Date': 'Mon, 10 Dec 2018 17:49:54 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Status': '200 OK', 'X-RateLimit-Limit': '60', 'X-RateLimit-Remaining': '59', 'X-RateLimit-Reset': '1544467794', 'Cache-Control': 'public, max-age=60, s-maxage=60', 'Vary': 'Accept', 'ETag': 'W/"7dc470913f1fe9bb6c7355b50a0737bc"', 'X-GitHub-Media-Type': 'github.v3; format=json', 'Access-Control-Expose-Headers': 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type', 'Access-Control-Allow-Origin': '*', 'Strict-Transport-Security': 'max-age=31536000; includeSubdomains; preload', 'X-Frame-Options': 'deny', 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'Referrer-Policy': 'origin-when-cross-origin, strict-origin-when-cross-origin', 'Content-Security-Policy': "default-src 'none'", 'Content-Encoding': 'gzip', 'X-GitHub-Request-Id': 'E439:4581:CF2351:1CA3E06:5C0EA741'}
Заголовок .headers возвращает словарь и предоставляет доступ к значению HTTP-заголовка по ключу. К примеру, чтобы посмотреть тип содержимого ответного payload, надо использовать Content-Type.
>>> response.headers['Content-Type'] 'application/json; charset=utf-8'
Согласно специфике HTTP, заголовки являются нечувствительными к регистру. Таким образом, при получении доступа к заголовкам мы можем не беспокоиться о том, какие буквы использованы: строчные либо прописные.
Это лишь базовые знания по теме библиотеки Requests в Python и HTTP-заголовков. Если хотите знать больше, вам могут быть полезны следующие статьи: — «Requests в Python – Примеры выполнения HTTP-запросов»; — «Краткое руководство по библиотеке Python Requests».