Руководство по работе с HTTP в Python

Blog

Весь веб работает по протоколу HTTP. Чтобы открыть эту страницу, вы отправили через браузер HTTP-запрос на сервер, на котором размещен блог Timeweb Cloud. Сервер проанализировал ваш запрос и дал ответ — вернул этот пост, чтобы вы могли познакомиться с библиотекой requests в Python. 

Библиотека requests позволяет отправлять HTTP-запросы. С ее помощью вы можете писать запросы на Python для решения самых разных задач.

Введение В Работу С Библиотекой Requests В Python (1)

Что нужно знать для работы с 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:

python -m pip install requests

Код библиотеки лежит на GitHub. Вы можете клонировать его на свой компьютер:

git clone git://github.com/psf/requests.git

За последними изменениями в процессе установки следите в документации библиотеки.

Примеры использования

Теперь самое интересное — практика.

Начнем с простого запроса. Дадим задание библиотеке Python requests связаться со страницей, на которой размещена информация про облачные серверы Timeweb.

Создайте файл script.py. Пусть внутри него будет такой скрипт:

import requests
result = requests.get('https://cloud.timeweb.com/vds-vps')
print(result)

Первой строкой вы импортируете библиотеку requests. Затем вводите переменную result и применяете метод GET, чтобы получить ответ от сервера, и указываете URI, который вас интересует. Последняя строчка — вывод ответа в терминале.

Чтобы запустить эту короткую программу, откройте любой терминал, перейдите в папку, где лежит файл script.py, и выполните его командой:

python script.py

В ответ должен вернуться код статуса 200. Это значит, что запрошенная страница доступна. Можно работать с ней дальше.

В качестве примера давайте попробуем задать несуществующий URI. В теории должен вернуться код ошибки 404. 

Меняем адрес страницы в нашем скрипте. Можно придумать свой вариант или просто испортить любую рабочую ссылку.

import requests
result = requests.get('https://cloud.timeweb.com/badlink')
print(result)

В ответ приходит код статуса 404.

С точки зрения Python каждый ответ — это объект. У этого объекта есть собственные методы и функции, которые помогают получить дополнительную информацию или нормализовать данные.

Давайте вернем правильный адрес страницы и попробуем получить ее содержимое. Для этого достаточно добавить метод text в команду print. Так должен выглядеть скрипт после редактирования:

import requests
result = requests.get('https://cloud.timeweb.com/vds-vps')
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.

Проверка SSL

Работа с запросами в 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, выполнять аутентификацию пользователей, проверять данные и получать информацию из разных источников. Дальше — самостоятельное изучение и применение для решения реальных задач.

Telegram
VK
Скопировать ссылку

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону