Requests Python — это модуль для языка Python, который используют, чтобы сделать работу с HTTP-запросами проще. Он удобнее встроенного Urllib. Даже в документации Python рекомендовано использовать Requests.
Установка библиотеки Requests
Самый простой вариант установить Requests Python — использовать pip — систему управления пакетами. Обычно pip предустанавливается вместе с интерпретатором. Если его нет, можно скачать. Для этого нужно ввести в командную строку:
Linux / MacOS
python -m ensurepip --upgrade
Windows
py -m ensurepip --upgrade
Когда pip установлен, для установки модуля Requests нужно ввести команду:
pip install requests
Как настроить библиотеку Requests Python
Библиотеке не нужны дополнительные настройки — ею можно сразу же пользоваться.
Начало работы. Давайте рассмотрим пример простейшего запроса в модуле Requests:
import requests # делаем запрос на чтение страницы https://sky.pro/media/
response = requests.get('https://sky.pro/media/')
print(response.ok) # проверяем, успешен ли запрос?
print(response.text) # выводим полученный ответ на экран
А вот как сделать то же самое, но при помощи встроенной библиотеки Urllib:
from urllib.request import urlopen
# открываем запрос на чтение страницы http://sky.pro/media
with urlopen('http://sky.pro/media') as response:
response_status = response.status # сохраняем статус запроса в переменную
html = response.read() # вычитываем ответ в переменную
print(response_status == 200) # проверяем успешен ли запрос
print(html.decode()) # выводим полученный ответ на экран
Модуль Requests Python упрощает и автоматизирует многие действия, которые в стандартной библиотеке надо делать самостоятельно. Именно из-за этого его используют многие разработчики.
Подробнее об этом — на курсе «Python-разработчик» . А еще под руководством опытных преподавателей освоите основные инструменты для работы, составите портфолио из интересных проектов и получите диплом установленного образца.
Давайте разберемся, как работать с Requests и из чего состоят HTTP-запросы.
Методы HTTP-запросов
HTTP — это протокол передачи информации в интернете. Он описывает правила и формат общения между двумя сторонами. Например, как браузеру описать запрос, серверу — сформировать ответ. HTTP — это текстовый протокол, поэтому его может прочитать и человек.
Давайте разберем простейший запрос:
GET /media/ HTTP/1.1
Host: sky.pro
Первая строка формирует запрос: сообщение серверу, что нужно прочитать (GET) ресурс по адресу /media/. В конце – версия протокола: HTTP/1.1.
Со второй строки передается дополнительная информация, которая называется заголовком. Она опциональная, кроме заголовка Host. Он указывает домен, на котором находится запрашиваемый ресурс.
HTTP-ответ выглядит аналогично:
HTTP/1.1 200 OK
Content-Type: text/html
<тело ответа>
В первой строке указывается версия протокола и код ответа — статус, который описывает результат запроса. В следующих строках, так же как и в запросе, перечисляются заголовки. В данном случае сервер говорит, что в ответе находится HTML-страница (Content-Type: text/html).
И в самом конце находится тело ответа: файл, HTML-страница или ничего. Браузер отрисовывает тело ответа — это уже то, что видит человек, когда загружает страницу.
Методы HTTP-запросов нужны, чтобы объяснить серверу, какое действие нужно совершить над ресурсом. Ресурс — это цель HTTP-запроса. Это может быть документ, фотография или просто веб-страница.
Как составлять HTTP-запросы, рассказывают на курсе «Веб-разработчик». Освоите технологии для позиционирования элементов на странице, узнаете, как подключить к проекту препроцессоры. Отточите навыки на создании четырех лендингов и положите эти проекты в портфолио.
Разберем на примерах распространенные методы — в чём их суть и чем они отличаются. Важно: ниже разбираются механизмы работы каждого метода в том виде, в котором они описаны в спецификации. На практике поведение может отличаться, но такое встречается нечасто.
OPTIONS
Метод OPTIONS нужен, чтобы спросить сервер о том, какие методы поддерживает ресурс. Он редко используется напрямую, обычно вызывается браузером автоматически. Поддерживается не всеми сайтами/ресурсами. Пример:
HTTP-ответ выглядит аналогично:
import requests
response = requests.options('https://httpbin.org')
print(response.text) # будет пустым
print(response.headers['Allow']) # 'HEAD, GET, OPTIONS'
GET
GET — самый распространенный HTTP-метод. Его используют, чтобы читать интернет-ресурс. Браузер отправляет метод GET, когда нужно открыть какой-либо сайт. Пример:
import requests
response = requests.get('https://httpbin.org/get')
print(response.text)
Вот простой пример, как использовать параметры в GET-запросе с библиотекой Requests:
import requests
params = {
'q': 'python',
'page': 2
}
response = requests.get('https://example.com/search', params=params)
print(response.url)
POST
Метод POST используют для отправки на сервер данных, которые передаются в теле запроса. Для этого при вызове requests.post() надо указать аргумент data, который принимает на вход словарь, список кортежей, байты или файл.
Если для передачи данных используется формат JSON, вместо data можно указать json. Это просто удобная конвенция, которая правильно формирует отправляемый запрос. Пример:
import requests
data_response = requests.post('https://httpbin.org/post', data={'foo': 'bar'})
print(data_response.text) # переданные данные находятся по ключу form
json_response = requests.post('https://httpbin.org/post', json={'foo': 'bar'})
print(data_response.text) # ключ form пустой, теперь данные лежат в json
HEAD
Этот метод очень похож на GET — с той лишь разницей, что HEAD возвращает пустое тело ответа. Он необходим, когда нужно посмотреть только на заголовки, при этом не загружать ответ целиком.
Например, мы хотим иметь свежую версию PDF-файла с расписанием автобусов. Файл хранится на каком-то сайте и периодически обновляется. Вместо того чтобы каждый раз скачивать и сверять файл вручную, можно использовать метод HEAD. Он поможет быстро проверить дату, когда был изменен файл по заголовкам ответа.
import requests
response = requests.get('https://httpbin.org/head')
print(response.text) # ответ будет пустым
print(response.headers)
PUT
Метод PUT очень похож на POST: несколько последовательных вызовов PUT должны приводить к одному и тому же результату. POST этого не гарантирует и может привести к неожиданным результатам, например к дублированию сущности, которую создали до этого.
import requests
response = requests.put('https://httpbin.org/put', data={'foo': 'bar'})
print(response.text)
PATCH
PATCH аналогичен методу POST, но с двумя отличиями: его используют для частичных изменений ресурса и его нельзя использовать в HTML-формах.
В теле запроса передается набор модификаций, которые надо применить.
import requests
response = requests.patch('https://httpbin.org/patch', data={'foo': 'bar'})
print(response.text)
DELETE
Метод используют, чтобы удалить ресурс. Он может передавать данные в теле запроса, но это необязательно — чаще всего тело остается пустым.
Как и PUT, последовательный вызов DELETE должен приводить к одному и тому же результату.
import requests
response = requests.delete('https://httpbin.org/delete')
print(response.text)
HTTP-коды состояний
Каждый ответ HTTP-запроса обязательно имеет код состояния — трехзначное число, которое как-то характеризует полученный результат. По этому коду можно понять, всё ли успешно отработало, и если произошла ошибка, то почему.
Подробнее об этом рассказывают на курсе «Веб-разработчик». Уделяйте учебе всего три часа в день, чтобы стать настоящим профессионалом. Сможете верстать сайты, адаптировать их под разные устройства и работать с кодом. После обучения в портфолио будет восемь проектов, а еще получите диплом установленного образца.
Всего выделяют пять групп кодов состояний.
1хх-коды
К этой группе относятся информационные коды состояний. Они сообщают клиенту о промежуточном статусе запроса и не являются финальным результатом.
Их немного, и останавливаться на них мы не будем, потому что они встречаются нечасто.
2хх-коды
Коды из этой группы означают, что запрос принят и обработан сервером без ошибок:
- 200 OK — запрос выполнен успешно. Чаще всего встречается именно это число.
- 201 Created — в результате запроса был создан новый ресурс. Как правило, этим кодом отвечают на POST- и иногда на PUT-запросы.
- 202 Accepted — запрос принят, но ещё не выполнен. Используется, когда по какой-то причине сервер не может выполнить его сразу. Например, если обработку делает какой-то сторонний процесс, который выполняется раз в день.
- 204 No Content указывает, что тело ответа пустое, но заголовки могут содержать полезную информацию. Не используется с методом HEAD, поскольку ответ на него всегда должен быть пустым.
3хх-коды
Это группа кодов перенаправления. Это значит, что клиенту нужно сделать какое-то действие, чтобы запрос продолжил выполняться:
- 301 Moved Permanently — URL запрашиваемого ресурса изменился, новый URL содержится в ответе.
- 302 Found аналогичен предыдущему коду. Отличие в том, что URL изменился временно. При этом статусе состояния поисковые системы не будут менять ссылку в своей поисковой выдаче на новую.
- 304 Not Modified означает, что содержимое ресурса было закешировано, его наполнение не поменялось и запрос можно не продолжать.
4хх-коды
Это коды ошибок, которые допустил клиент при формировании запроса:
- 400 Bad Request — запрос сформирован с ошибкой, поэтому сервер не может его обработать. Причин может быть много, но чаще всего ошибку надо искать в теле запроса.
- 401 Unauthorized — для продолжения необходимо залогиниться.
- 403 Forbidden — пользователь залогинен, но у него нет прав для доступа к ресурсу.
- 404 Not Found — всем известный код: страница не найдена. Некоторые сайты могут возвращать 404 вместо 403, чтобы скрыть информацию от неавторизованных пользователей.
- 405 Method Not Allowed — данный ресурс не поддерживает метод запроса. Например, так бывает, если разработчик хочет отправить PUT-запрос на ресурс, который его не поддерживает.
- 429 Too Many Requests означает, что сработал защитный механизм: он ограничивает слишком частые запросы от одного пользователя. Таким образом защищаются от DDoS- или brute-force-атак.
5хх-коды
Это ошибки, которые возникли на сервере во время выполнения запроса:
- 500 Internal Server Error — на сервере произошла неожиданная ошибка. Как правило, происходит из-за того, что в коде сервера возникает исключение.
- 502 Bad Gateway возникает, если на сервере используется обратный прокси, который не смог достучаться до приложения.
- 503 Service Unavailable — сервер пока не готов обработать запрос. В ответе также может содержаться информация о том, когда сервис станет доступен.
- 504 Gateway Timeout — эта ошибка означает, что обратный прокси не смог получить ответ за отведенное время (обычно — 60 секунд).
Заголовки, текст ответа и файлы Cookie
Файлы Cookie знают все – это то, о чём в первую очередь спрашивает каждый сайт.
Рассмотрим, как работать с запросами и ответами в Requests Python. Чтобы увидеть результат HTTP-запроса, можно использовать один из трех способов.
Выбор способа зависит от того, какие данные мы получили. В непонятной ситуации можно использовать атрибут text, который возвращает содержимое в виде строки:
import requests
response = requests.get('https://httpbin.org/get')
print(response.text)
Если заранее известно, что ответ будет в формате JSON, можно использовать одноименный атрибут, который автоматически проанализирует ответ и вернет его в виде словаря:
json_response = response.json()
print(json_response)
Обратите внимание, как изменится вывод функции print().
Наконец, если ответом на запрос является файл, стоит использовать атрибут content, который возвращает байты:
import requests
response = requests.get('https://httpbin.org/image/jpeg')
print(response.content)
Попробуйте вывести на экран response.text для предыдущего запроса и сравните результат.
Заголовок — это дополнительная информация, которой обмениваются клиент и сервер. В заголовках могут содержаться: размер ответа (Content-Length), формат передаваемых данных (Content-Type) или информация о клиенте (User-Agent).
Полный список очень длинный, знать их все необязательно, а часть и вовсе подставляется автоматом. Например, модуль Requests зачастую сам проставляет Content-Type — формат передаваемых данных.
Заголовок состоит из названия и значения, которые разделяются двоеточием, поэтому удобнее всего передавать их в виде словаря. Рассмотрим на примере, как это работает:
import requests
response = requests.get('https://httpbin.org/image', headers={'Accept': 'image/jpeg'})
print(response.headers)
Здесь мы передали заголовок, который указывает, в каком формате мы хотим получить изображение. Попробуйте поменять значение на image/png и посмотрите, как изменится ответ.
Еще можно посмотреть и на заголовки запроса:
print(response.request.headers)
Обратите внимание, что Requests сам подставил информацию о клиенте — User-Agent.
Cookie (куки) — это информация, которую сервер отправляет браузеру для хранения. Они позволяют зафиксировать некоторое состояние. Например, в куки может храниться информация о том, что пользователь уже залогинен. Она хранится в браузере и передается на сервер при каждом запросе, поэтому нам не нужно каждый раз проходить авторизацию заново.
Работать с куками в модуле Requests очень просто:
import requests
response = requests.get('https://httpbin.org/cookies', cookies={'foo': 'bar'})
print(response.text)
Посмотреть, какие куки пришли от сервера, можно при помощи атрибута cookies объекта Response:
print(response.cookies)
Как отправлять запросы при помощи Python Requests
Рассмотрим несколько частых примеров использования модуля Requests, чтобы понять, как отправлять запросы.
Что такое аутентифицированный запрос
Аутентифицированный запрос — это запрос с авторизацией. Передает данные, которые подтверждают личность пользователя. Например, токен или логин/пароль.
Вот пример аутентифицированного GET-запроса с использованием токена:
import requests
headers = {
'Authorization': 'Bearer your_token_here'
}
response = requests.get('https://example.com/protected-resource', headers=headers)
print(response.status_code)
print(response.json())
Отправка данных
Отправка данных в контексте HTTP-запросов обычно означает передачу информации на сервер, чаще всего через POST-запрос. Это используется, когда нужно, например, отправить форму, сохранить данные или авторизоваться.
Вот пример отправки данных с помощью метода POST в requests:
python
Копировать
Редактировать
import requests
data = {
'username': 'john_doe',
'password': 'secure123'
}
response = requests.post('https://example.com/login', data=data)
print(response.status_code)
print(response.text)
Получение данных
Это процесс запроса информации с сервера, чаще всего через GET-запрос. Используется, когда нужно загрузить страницу, получить список товаров, новости или другие ресурсы.
Вот пример получения данных с использованием requests:
python
Копировать
Редактировать
import requests
response = requests.get('https://api.example.com/products')
print(response.status_code)
print(response.json())
Скачивание файлов
import requests
response = requests.get('https://www.python.org/static/img/python-logo.png')
with open('python_logo.png', 'wb') as image:
image.write(response.content)
Выше описан не самый эффективный способ скачивания файлов. Если файл окажется большого размера, код выше загрузит результат целиком в оперативную память. В лучшем случае программа упадет с ошибкой, в худшем — всё намертво зависнет.
Вот как это можно исправить:
import requests
response = requests.get('https://www.python.org/static/img/python-logo@2x.png', stream=True)
with open('python_logo.png', 'wb') as image:
for chunk in response.iter_content(chunk_size=1024):
image.write(chunk)
В этом варианте мы используем параметр stream=True, который открывает соединение, но не скачивает содержимое. Затем мы задаем размер чанка — кусочка информации, который будет скачиваться за одну итерацию цикла, и делаем его равным 1 Кб (1024 байт). Модуль Requests сам закрывает соединение после прочтения последнего чанка.
Чтобы заранее узнать размер файла, можно воспользоваться методом HEAD. Эта информация передается в заголовке ‘Content-Length’ и исчисляется в байтах.
import requests
head_response = requests.head('https://www.python.org/static/img/python-logo@2x.png')
image_size = int(head_response.headers['Content-Length'])
print('Размер загружаемого файла: {0} кб'.format(image_size / 1024)
)
Авторизация на сайте
Рассмотрим два способа авторизации, которые встречаются чаще всего: Basic Auth и Bearer Auth. В обоих случаях механизм очень похожий — запрос должен передать заголовок ‘Authorization’ с каким-то значением. Для Basic Auth — это логин и пароль, закодированные в base64, для Bearer — токен, который мы получили на сайте заранее.
Для базовой авторизации у модуля Requests есть очень удобный параметр auth=, который делает всю работу за нас:
import requests
response = requests.get('https://httpbin.org/basic-auth/foo/bar')
print(response.status_code) # 401
response = requests.get('https://httpbin.org/basic-auth/foo/bar', auth=('foo', 'bar'))
print(response.status_code) # 200
print(response.request.headers[‘Authorization’]) # 'Basic Zm9vOmJhcg=='
Обратите внимание, что модуль Requests сам добавил заголовок Authorization и подставил туда закодированные логин и пароль.
Для Bearer Auth нам придется добавлять его самостоятельно:
import requests
response = requests.get('https://httpbin.org/bearer')
print(response.status_code) # 401
headers = {'Authorization': 'Bearer some_token'}
response = requests.get('https://httpbin.org/bearer', headers=headers)
print(response.status_code) # 200
У каждого API своя спецификация — вместо Bearer может быть Token или что-то другое. Поэтому важно внимательно читать документацию сервиса.
Мультискачивание
Напишем код, который умеет скачивать сразу несколько файлов. Для этого вынесем работу с модулем Requests в отдельную функцию и параметризируем место сохранения файла.
Не забывайте про сохранение файла по чанкам, чтобы крупные файлы не загружались в память целиком.
import requests
def download_file(url, save_path):
response = requests.get(url, stream=True)
with open(save_path, 'wb') as file:
for chunk in response.iter_content(chunk_size=1024):
file.write(chunk)
download_list = [
'https://cdn.pixabay.com/photo/2022/04/10/19/33/house-7124141_1280.jpg',
'https://cdn.pixabay.com/photo/2022/08/05/18/50/houseplant-7367379_1280.jpg',
'https://cdn.pixabay.com/photo/2022/06/09/04/53/ride-7251713_1280.png',
]
for url in download_list:
save_path = url.split('/')[-1]
download_file(url, save_path)
Заключение
- Requests — это простой и мощный инструмент для работы с интернет-запросами на Python.
- Позволяет отправлять HTTP-запросы в пару строк — быстро и понятно.
- Подходит для авторизации на сайтах, отправки форм и скачивания файлов.
- Можно загружать сразу несколько файлов и работать с API без лишней сложности.
- Один из самых популярных модулей в Python-сообществе благодаря интуитивному интерфейсу.
Добавить комментарий