Весь веб работает по протоколу HTTP. Чтобы открыть эту страницу, вы отправили через браузер HTTP-запрос на сервер, на котором размещен блог Timeweb Cloud. Сервер проанализировал ваш запрос и дал ответ — вернул этот пост, чтобы вы могли познакомиться с библиотекой requests в Python.
Библиотека requests позволяет отправлять HTTP-запросы. С ее помощью вы можете писать запросы на Python для решения самых разных задач.
Что нужно знать для работы с requests
Отправка HTTP-запросов и использование ответов — не rocket science. Но некоторые базовые знания все-таки требуются. Как минимум нужно знать основные методы, которые вы и будете отправлять на серверы.
- GET — получить ресурс.
- POST — создать ресурс.
- PUT — обновить ресурс.
- DELETE — удалить ресурс.
Это не все методы. Есть еще HEAD, PATCH и другие. Но нам для практики понадобится только GET. Это самый распространенный метод, пользователи постоянно просят, чтобы серверы им что-нибудь отдали: страницы, посты, картинки. Обработка HTTP-запросов на Python с другими методами строится аналогичным образом.
В ответ на запросы приходят коды состояния. Они находятся в диапазоне от 1xx до 5xx. Все пользователи интернета с ними встречаются, просто не все знают, что это такое. Ошибка 404 — это код состояния 404. Он сообщает, что произошла ошибка на стороне клиента: пользователь пытается перейти на страницу, которой не существует.
Первая цифра кода состояния говорит о статусе ответа:
- 1xx — информационные коды.
- 2xx — успешно.
- 3xx — перенаправление.
- 4xx — ошибка на стороне клиента.
- 5xx — ошибка на стороне сервера.
Этих базовых знаний будет достаточно для того, чтобы выполнить пару интересных запросов и правильно интерпретировать ответы. Теперь давайте посмотрим, как вся эта внутренняя красота интернета обрабатывается библиотекой requests.
Установка библиотеки
Для работы с библиотекой на компьютере должен быть Python. Еще потребуется менеджер пакетов pip, чтобы установить requests.
Установка Python requests с помощью pip:
Код библиотеки лежит на GitHub. Вы можете клонировать его на свой компьютер:
За последними изменениями в процессе установки следите в документации библиотеки.
Примеры использования
Теперь самое интересное — практика.
Начнем с простого запроса. Дадим задание библиотеке Python requests связаться со страницей, на которой размещена информация про облачные серверы Timeweb Cloud.
Создайте файл script.py. Пусть внутри него будет такой скрипт:
Первой строкой вы импортируете библиотеку requests. Затем вводите переменную result и применяете метод GET, чтобы получить ответ от сервера, и указываете URI, который вас интересует. Последняя строчка — вывод ответа в терминале.
Чтобы запустить эту короткую программу, откройте любой терминал, перейдите в папку, где лежит файл script.py, и выполните его командой:
В ответ должен вернуться код статуса 200. Это значит, что запрошенная страница доступна. Можно работать с ней дальше.
В качестве примера давайте попробуем задать несуществующий URI. В теории должен вернуться код ошибки 404.
Меняем адрес страницы в нашем скрипте. Можно придумать свой вариант или просто испортить любую рабочую ссылку.
В ответ приходит код статуса 404.
С точки зрения Python каждый ответ — это объект. У этого объекта есть собственные методы и функции, которые помогают получить дополнительную информацию или нормализовать данные.
Давайте вернем правильный адрес страницы и попробуем получить ее содержимое. Для этого достаточно добавить метод text в команду print. Так должен выглядеть скрипт после редактирования:
Выполнение скрипта приведет к тому, что в терминале отобразится весь HTML-код запрошенной страницы. Вы можете увидеть разметку, подключенные файлы стилей, скрипты, контент. Это общедоступная информация. Ее можно увидеть и в браузере, используя опцию просмотра кода страницы.
Вместо метода text можно использовать, например, метод url. Тогда в терминале отобразится ссылка, к которой вы делали запрос. Или, например, применить метод status_code. Тогда в терминале появится статус код запроса.
Это было самое начало работы с requests в Python. Теперь давайте посмотрим более интересные примеры.
Базовая аутентификация
Аутентификация помогает приложению понять, кто вы такой, и проверить, есть ли информация о вас в базе. Обычно вы предоставляете серверу свои учетные данные, передавая их через заголовок Authorization.
Один из примеров API, который требует аутентификации пользователя, — API GitHub Authenticated User. Эта служба предоставляет информацию о профиле аутентифицированного пользователя. Чтобы сделать запрос к Authenticated User API, вы должны передать имя пользователя и пароль GitHub в кортеже, используя метод get():
Если вы передали в кортеже auth действительные учетные данные, то в ответ вы получите сообщение об успехе:
Если вы попытаетесь сделать тот же запрос без действительных учетных данных, то получите в ответ код состояния 401 Unauthorized:
Когда вы передаете имя пользователя и пароль в кортеже, учетные данные применяются с использованием базовой схемы проверки подлинности доступа. Вы можете сделать тот же запрос, используя HTTPBasicAuth:
Библиотека requests предоставляет и другие методы аутентификации, такие как HTTPDigestAuth и HTTPProxyAuth.
Вы также можете использовать собственную реализацию. Главное помнить, что плохо проработанные механизмы аутентификации могут стать причиной появления уязвимостей в системе безопасности. Если нет строгой необходимости создавать свое решение, следует использовать проверенную схему аутентификации, такую как Basic или OAuth.
Проверка SSL
Работа с запросами в Python позволяет также решить еще одну интересную задачу — проверять наличие SSL-сертификата на сайте.
При работе с конфиденциальными данными важна безопасность. Защитить их при передаче через HTTP помогает установка зашифрованного соединения с использованием сертификата SSL.
Чтобы убедиться в безопасности сайта, необходимо проверять SSL-сертификат целевого сервера. Хорошая новость — библиотека requests делает это за вас по умолчанию. Однако для некоторых случаев вы можете изменить это поведение.
Если хотите отключить проверку SSL-сертификата, передайте значение False параметру verify:
Requests даже предупреждает вас, когда вы делаете запрос без проверки SSL, чтобы помочь сохранить данные в безопасности.
Получаем прогноз погоды
Напоследок — небольшая проектная работа. Создадим утилиту, которая будет запрашивать прогноз погоды и отображать результат в терминале. Источником данных станет портал OpenWeather. Там можно бесплатно создать ключ для доступа по API.
Создайте файл weather.py и напишите в нем:
Сначала вы импортируете библиотеку requests. Затем делаете запрос по API к сервису погоды. После параметра q указываете город и страну, appid — это ключ, который вы должны создать на OpenWeather. Параметр units=metric говорит, что нужно использовать метрическую систему. Тогда температура будет отображаться в градусах Цельсия.
Ответ по умолчанию приходит в формате JSON. Но можно выбрать XML или HTML, добавив в запрос параметр mode с соответствующим значением.
Вот пример ответа в формате JSON:
Даже без дополнительной обработки данных легко обнаружить, что на момент проверки в Москве была температура чуть выше 7 градусов и небольшой ветер. С этой информацией можно уже работать: например, создать под них веб-интерфейс для понятного отображения.
Заключение
Вы изучили основы библиотеки requests. Теперь вы можете делать запросы, используя методы HTTP, выполнять аутентификацию пользователей, проверять данные и получать информацию из разных источников. Дальше — самостоятельное изучение и применение для решения реальных задач.
