Весь веб работает по протоколу HTTP. Чтобы открыть эту страницу, вы отправили через браузер HTTP-запрос на сервер, на котором размещен блог Timeweb Cloud. Сервер проанализировал ваш запрос и дал ответ — вернул этот пост, чтобы вы могли познакомиться с библиотекой requests
в Python.
Библиотека requests
позволяет отправлять HTTP-запросы. С ее помощью вы можете писать запросы на Python для решения самых разных задач.
Отправка HTTP-запросов и использование ответов — не rocket science. Но некоторые базовые знания все-таки требуются. Как минимум нужно знать основные методы, которые вы и будете отправлять на серверы.
Это не все методы. Есть еще HEAD, PATCH и другие. Но нам для практики понадобится только GET
. Это самый распространенный метод, пользователи постоянно просят, чтобы серверы им что-нибудь отдали: страницы, посты, картинки. Обработка HTTP-запросов на Python с другими методами строится аналогичным образом.
В ответ на запросы приходят коды состояния. Они находятся в диапазоне от 1xx до 5xx. Все пользователи интернета с ними встречаются, просто не все знают, что это такое. Ошибка 404 — это код состояния 404. Он сообщает, что произошла ошибка на стороне клиента: пользователь пытается перейти на страницу, которой не существует.
Первая цифра кода состояния говорит о статусе ответа:
Этих базовых знаний будет достаточно для того, чтобы выполнить пару интересных запросов и правильно интерпретировать ответы. Теперь давайте посмотрим, как вся эта внутренняя красота интернета обрабатывается библиотекой requests
.
Для работы с библиотекой на компьютере должен быть Python. Еще потребуется менеджер пакетов pip
, чтобы установить requests
.
Установка Python requests
с помощью pip
:
python -m pip install requests
Код библиотеки лежит на GitHub. Вы можете клонировать его на свой компьютер:
git clone git://github.com/psf/requests.git
За последними изменениями в процессе установки следите в документации библиотеки.
Теперь самое интересное — практика.
Начнем с простого запроса. Дадим задание библиотеке Python requests
связаться со страницей, на которой размещена информация про облачные серверы Timeweb Cloud.
Создайте файл script.py
. Пусть внутри него будет такой скрипт:
import requests
result = requests.get('https://timeweb.cloud/services/cloud-servers')
print(result)
Первой строкой вы импортируете библиотеку requests
. Затем вводите переменную result
и применяете метод GET, чтобы получить ответ от сервера, и указываете URI, который вас интересует. Последняя строчка — вывод ответа в терминале.
Чтобы запустить эту короткую программу, откройте любой терминал, перейдите в папку, где лежит файл script.py
, и выполните его командой:
python script.py
В ответ должен вернуться код статуса 200. Это значит, что запрошенная страница доступна. Можно работать с ней дальше.
В качестве примера давайте попробуем задать несуществующий URI. В теории должен вернуться код ошибки 404.
Меняем адрес страницы в нашем скрипте. Можно придумать свой вариант или просто испортить любую рабочую ссылку.
import requests
result = requests.get('https://timeweb.cloud/badlink')
print(result)
В ответ приходит код статуса 404.
С точки зрения Python каждый ответ — это объект. У этого объекта есть собственные методы и функции, которые помогают получить дополнительную информацию или нормализовать данные.
Давайте вернем правильный адрес страницы и попробуем получить ее содержимое. Для этого достаточно добавить метод text
в команду print
. Так должен выглядеть скрипт после редактирования:
import requests
result = requests.get('https://timeweb.cloud/services/cloud-servers')
print(result.text)
Выполнение скрипта приведет к тому, что в терминале отобразится весь HTML-код запрошенной страницы. Вы можете увидеть разметку, подключенные файлы стилей, скрипты, контент. Это общедоступная информация. Ее можно увидеть и в браузере, используя опцию просмотра кода страницы.
Вместо метода text
можно использовать, например, метод url
. Тогда в терминале отобразится ссылка, к которой вы делали запрос. Или, например, применить метод status_code
. Тогда в терминале появится статус код запроса.
Это было самое начало работы с requests
в Python. Теперь давайте посмотрим более интересные примеры.
Аутентификация помогает приложению понять, кто вы такой, и проверить, есть ли информация о вас в базе. Обычно вы предоставляете серверу свои учетные данные, передавая их через заголовок Authorization
.
Один из примеров API, который требует аутентификации пользователя, — API GitHub Authenticated User. Эта служба предоставляет информацию о профиле аутентифицированного пользователя. Чтобы сделать запрос к Authenticated User API, вы должны передать имя пользователя и пароль GitHub в кортеже, используя метод get()
:
from getpass import getpass
requests.get('https://api.github.com/user', auth=('username', getpass()))
Если вы передали в кортеже auth
действительные учетные данные, то в ответ вы получите сообщение об успехе:
<Response [200]>
Если вы попытаетесь сделать тот же запрос без действительных учетных данных, то получите в ответ код состояния 401 Unauthorized:
>>> requests.get('https://api.github.com/user')
<Response [401]>
Когда вы передаете имя пользователя и пароль в кортеже, учетные данные применяются с использованием базовой схемы проверки подлинности доступа. Вы можете сделать тот же запрос, используя HTTPBasicAuth
:
from requests.auth import HTTPBasicAuth
from getpass import getpass
requests.get(
'https://api.github.com/user',
auth=HTTPBasicAuth('username', getpass())
)
<Response [200]>
Библиотека requests
предоставляет и другие методы аутентификации, такие как HTTPDigestAuth
и HTTPProxyAuth.
Вы также можете использовать собственную реализацию. Главное помнить, что плохо проработанные механизмы аутентификации могут стать причиной появления уязвимостей в системе безопасности. Если нет строгой необходимости создавать свое решение, следует использовать проверенную схему аутентификации, такую как Basic
или OAuth
.
Работа с запросами в Python позволяет также решить еще одну интересную задачу — проверять наличие SSL-сертификата на сайте.
При работе с конфиденциальными данными важна безопасность. Защитить их при передаче через HTTP помогает установка зашифрованного соединения с использованием сертификата SSL.
Чтобы убедиться в безопасности сайта, необходимо проверять SSL-сертификат целевого сервера. Хорошая новость — библиотека requests
делает это за вас по умолчанию. Однако для некоторых случаев вы можете изменить это поведение.
Если хотите отключить проверку SSL-сертификата, передайте значение False
параметру verify
:
requests.get('https://api.github.com', verify=False)
InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised.
<Response [200]>
Requests даже предупреждает вас, когда вы делаете запрос без проверки SSL, чтобы помочь сохранить данные в безопасности.
Напоследок — небольшая проектная работа. Создадим утилиту, которая будет запрашивать прогноз погоды и отображать результат в терминале. Источником данных станет портал OpenWeather. Там можно бесплатно создать ключ для доступа по API.
Создайте файл weather.py
и напишите в нем:
import requests
result = requests.get( 'https://api.openweathermap.org/data/2.5/weather?q=Moscow,ru&appid=someidappkey0ff7889240be2&units=metric')
weather = result.text
print(weather)
Сначала вы импортируете библиотеку requests. Затем делаете запрос по API к сервису погоды. После параметра q
указываете город и страну, appid
— это ключ, который вы должны создать на OpenWeather. Параметр units=metric
говорит, что нужно использовать метрическую систему. Тогда температура будет отображаться в градусах Цельсия.
Ответ по умолчанию приходит в формате JSON
. Но можно выбрать XML
или HTML
, добавив в запрос параметр mode
с соответствующим значением.
Вот пример ответа в формате JSON
:
{"coord":{"lon":37.6156,"lat":55.7522},"weather":[{"id":802,"main":"Clouds","description":"scattered clouds","icon":"03d"}],"base":"stations","main":{"temp":7.14,"feels_like":7.14,"temp_min":6.42,"temp_max":7.3,"pressure":1024,"humidity":27,"sea_level":1024,"grnd_level":1006},"visibility":10000,"wind":{"speed":1.16,"deg":249,"gust":3.13},"clouds":{"all":49},"dt":1651144117,"sys":{"type":2,"id":47754,"country":"RU","sunrise":1651110824,"sunset":1651165208},"timezone":10800,"id":524901,"name":"Moscow","cod":200}
Даже без дополнительной обработки данных легко обнаружить, что на момент проверки в Москве была температура чуть выше 7 градусов и небольшой ветер. С этой информацией можно уже работать: например, создать под них веб-интерфейс для понятного отображения.
Вы изучили основы библиотеки requests
. Теперь вы можете делать запросы, используя методы HTTP, выполнять аутентификацию пользователей, проверять данные и получать информацию из разных источников. Дальше — самостоятельное изучение и применение для решения реальных задач.