0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>12 апр 2023</li>
2
<ul><li>12 апр 2023</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Разбираемся в методах работы с HTTP-запросами в Python на практике.</p>
4
</ul><p>Разбираемся в методах работы с HTTP-запросами в Python на практике.</p>
5
<p>Иллюстрация: Катя Павловская для Skillbox Media</p>
5
<p>Иллюстрация: Катя Павловская для Skillbox Media</p>
6
<p>Изучает Python, его библиотеки и занимается анализом данных. Любит путешествовать в горах.</p>
6
<p>Изучает Python, его библиотеки и занимается анализом данных. Любит путешествовать в горах.</p>
7
<p>Библиотека Requests для Python позволяет работать с HTTP-запросами любого уровня сложности, используя простой синтаксис. Это помогает не тратить время на написание кода, а быстро взаимодействовать с серверами.</p>
7
<p>Библиотека Requests для Python позволяет работать с HTTP-запросами любого уровня сложности, используя простой синтаксис. Это помогает не тратить время на написание кода, а быстро взаимодействовать с серверами.</p>
8
<p>Python Requests - это библиотека, которая создана для быстрой и простой работы с запросами. Стандартные HTTP-библиотеки Python, например та же Urllib3, часто требуют значительно больше кода для выполнения одного и того же действия, а это затрудняет работу. Давайте сравним код для простой задачи, написанный с помощью<a>Urllib3</a>и <a>Requests</a>.</p>
8
<p>Python Requests - это библиотека, которая создана для быстрой и простой работы с запросами. Стандартные HTTP-библиотеки Python, например та же Urllib3, часто требуют значительно больше кода для выполнения одного и того же действия, а это затрудняет работу. Давайте сравним код для простой задачи, написанный с помощью<a>Urllib3</a>и <a>Requests</a>.</p>
9
<p>Urllib3:</p>
9
<p>Urllib3:</p>
10
import urllib3 http = urllib3.PoolManager() gh_url = 'https://api.github.com' headers = urllib3.util.make_headers(user_agent= 'my-agent/1.0.1', basic_auth='abc:xyz') requ = http.request('GET', gh_url, headers=headers) print (requ.headers) print(requ.data) # ------# 200# 'application/json'<p>Requests:</p>
10
import urllib3 http = urllib3.PoolManager() gh_url = 'https://api.github.com' headers = urllib3.util.make_headers(user_agent= 'my-agent/1.0.1', basic_auth='abc:xyz') requ = http.request('GET', gh_url, headers=headers) print (requ.headers) print(requ.data) # ------# 200# 'application/json'<p>Requests:</p>
11
import requests r = requests.get('https://api.github.com', auth=('user', 'pass')) print r.status_codeprint r.headers['content-type'] # ------# 200# 'application/json'<p>Количество строк различается в два раза: на Urllib3 - восемь строк, а на Requests - четыре. И это только один небольшой запрос.</p>
11
import requests r = requests.get('https://api.github.com', auth=('user', 'pass')) print r.status_codeprint r.headers['content-type'] # ------# 200# 'application/json'<p>Количество строк различается в два раза: на Urllib3 - восемь строк, а на Requests - четыре. И это только один небольшой запрос.</p>
12
<p>Писать код на Python лучше всего в специальной IDE, например в <a>PyCharm</a>или<a>Visual Studio Code</a>. Они подсвечивают синтаксис и предлагают автодополнение кода - это сильно упрощает работу программиста. Весь код из этой статьи мы писали в Visual Studio Code.</p>
12
<p>Писать код на Python лучше всего в специальной IDE, например в <a>PyCharm</a>или<a>Visual Studio Code</a>. Они подсвечивают синтаксис и предлагают автодополнение кода - это сильно упрощает работу программиста. Весь код из этой статьи мы писали в Visual Studio Code.</p>
13
<p>Для начала работы с библиотекой Requests её необходимо установить в IDE. Для этого откройте IDE и введите команду в терминале:</p>
13
<p>Для начала работы с библиотекой Requests её необходимо установить в IDE. Для этого откройте IDE и введите команду в терминале:</p>
14
pip install requests<p>Библиотека готова к работе. Остаётся только импортировать её:</p>
14
pip install requests<p>Библиотека готова к работе. Остаётся только импортировать её:</p>
15
import requests<p>Из всех<a>HTTP-запросов</a>наиболее часто используется GET. Он позволяет получить данные из указанного источника - обычно с какого-то веб-сайта. Чтобы отправить GET-запрос, используется метод requests.get(), в который в качестве параметра добавляется URL-адрес назначения:</p>
15
import requests<p>Из всех<a>HTTP-запросов</a>наиболее часто используется GET. Он позволяет получить данные из указанного источника - обычно с какого-то веб-сайта. Чтобы отправить GET-запрос, используется метод requests.get(), в который в качестве параметра добавляется URL-адрес назначения:</p>
16
requests.get('https://skillbox.ru')<p>Этот код совершает одно действие - связывается с указанным адресом и получает от сервера информацию о нём. Когда вы вводите домен в адресную строку браузера и переходите на сайт, под капотом выполняются те же самые операции. Единственное различие в том, что Requests позволяет получить чистый HTML-код страницы без рендеринга, то есть мы не видим вёрстку и разные визуальные компоненты - только код и техническую информацию.</p>
16
requests.get('https://skillbox.ru')<p>Этот код совершает одно действие - связывается с указанным адресом и получает от сервера информацию о нём. Когда вы вводите домен в адресную строку браузера и переходите на сайт, под капотом выполняются те же самые операции. Единственное различие в том, что Requests позволяет получить чистый HTML-код страницы без рендеринга, то есть мы не видим вёрстку и разные визуальные компоненты - только код и техническую информацию.</p>
17
<p>Для проверки ответа на запрос существуют специальные НТТР-коды состояния. Чтобы воспользоваться ими, необходимо присвоить запрос переменной и "распечатать" её значение:</p>
17
<p>Для проверки ответа на запрос существуют специальные НТТР-коды состояния. Чтобы воспользоваться ими, необходимо присвоить запрос переменной и "распечатать" её значение:</p>
18
res = requests.get('https://skillbox.ru') # Создаём переменную, в которую сохраним код состояния запрашиваемой страницы. print(res) # Выводим код состояния.<p>Если запустить этот код, то в терминале выведется <Response [200]>. Это хороший результат - значит, запрос прошёл успешно. Но бывают и другие HTTP-коды состояний.</p>
18
res = requests.get('https://skillbox.ru') # Создаём переменную, в которую сохраним код состояния запрашиваемой страницы. print(res) # Выводим код состояния.<p>Если запустить этот код, то в терминале выведется <Response [200]>. Это хороший результат - значит, запрос прошёл успешно. Но бывают и другие HTTP-коды состояний.</p>
19
<p>Коды состояний имеют вид трёхзначных чисел от 100 до 500. Чаще всего встречаются следующие:</p>
19
<p>Коды состояний имеют вид трёхзначных чисел от 100 до 500. Чаще всего встречаются следующие:</p>
20
<ul><li>200 - "OK". Запрос прошёл успешно, и мы получили ответ.</li>
20
<ul><li>200 - "OK". Запрос прошёл успешно, и мы получили ответ.</li>
21
<li>400 - "Плохой запрос". Его получаем тогда, когда сервер не может понять запрос, отправленный клиентом. Как правило, это указывает на неправильный синтаксис запроса, неправильное оформление сообщения запроса и так далее.</li>
21
<li>400 - "Плохой запрос". Его получаем тогда, когда сервер не может понять запрос, отправленный клиентом. Как правило, это указывает на неправильный синтаксис запроса, неправильное оформление сообщения запроса и так далее.</li>
22
<li>401 - "Unauthorized". Для выполнения запроса необходимы актуальные учётные данные.</li>
22
<li>401 - "Unauthorized". Для выполнения запроса необходимы актуальные учётные данные.</li>
23
<li>403 - "Forbidden". Сервер понял запрос, но не может его выполнить. Например, у используемой учётной записи нет достаточных прав для просмотра содержимого.</li>
23
<li>403 - "Forbidden". Сервер понял запрос, но не может его выполнить. Например, у используемой учётной записи нет достаточных прав для просмотра содержимого.</li>
24
<li>404 - "Не найдено". Сервер не нашёл содержимого, соответствующего запросу.</li>
24
<li>404 - "Не найдено". Сервер не нашёл содержимого, соответствующего запросу.</li>
25
</ul><p>Кодов состояния намного больше. С полным списком<a>можно ознакомиться здесь</a>.</p>
25
</ul><p>Кодов состояния намного больше. С полным списком<a>можно ознакомиться здесь</a>.</p>
26
<p>Для получения содержимого страницы используется метод content. Он позволяет получить информацию в виде байтов, то есть в итоге у нас будет вся информация, не только строковая. Запустим его и посмотрим на результат:</p>
26
<p>Для получения содержимого страницы используется метод content. Он позволяет получить информацию в виде байтов, то есть в итоге у нас будет вся информация, не только строковая. Запустим его и посмотрим на результат:</p>
27
response = requests.get('https://api.github.com') response.content<p>Ответ:</p>
27
response = requests.get('https://api.github.com') response.content<p>Ответ:</p>
28
<em>Скриншот: Requests / Skillbox Media</em><p>Информацию из байтового вида в строковый можно декодировать с помощью метода text:</p>
28
<em>Скриншот: Requests / Skillbox Media</em><p>Информацию из байтового вида в строковый можно декодировать с помощью метода text:</p>
29
response = requests.get('https://api.github.com') response.text<p>Ответ:</p>
29
response = requests.get('https://api.github.com') response.text<p>Ответ:</p>
30
<em>Скриншот: Requests / Skillbox Media</em><p>В обоих случаях мы получаем классический JSON-текст, который можно использовать как словарь, получая доступ к нужным значениям по известному ключу.</p>
30
<em>Скриншот: Requests / Skillbox Media</em><p>В обоих случаях мы получаем классический JSON-текст, который можно использовать как словарь, получая доступ к нужным значениям по известному ключу.</p>
31
<p>Заголовки ответа - важная часть запроса. Хотя в них и нет содержимого исходного сообщения, зато там можно обнаружить множество важных деталей ответа: информация о сервере, дата, кодировка и так далее. Для работы с ними используется метод headers:</p>
31
<p>Заголовки ответа - важная часть запроса. Хотя в них и нет содержимого исходного сообщения, зато там можно обнаружить множество важных деталей ответа: информация о сервере, дата, кодировка и так далее. Для работы с ними используется метод headers:</p>
32
print(response.headers)<p>Ответ:</p>
32
print(response.headers)<p>Ответ:</p>
33
<em>Скриншот: Requests / Skillbox Media</em><p>Зачем это надо? Например, таким образом мы можем узнать дату и время на сервере в момент получения запроса. В нашем случае ответ пришёл 9 марта в 05:45:28 GMT. Это помогает логировать действия для их последующей оценки, например, при поиске ошибок выполнения.</p>
33
<em>Скриншот: Requests / Skillbox Media</em><p>Зачем это надо? Например, таким образом мы можем узнать дату и время на сервере в момент получения запроса. В нашем случае ответ пришёл 9 марта в 05:45:28 GMT. Это помогает логировать действия для их последующей оценки, например, при поиске ошибок выполнения.</p>
34
МетодОписаниеGETGET-метод используется для обычного запроса к серверу и получения информации по URL.POSTМетод запроса POST запрашивает веб-сервис для приёма данных, например для хранения информации.PUTМетод PUT просит, чтобы вложенный в него объект был сохранён под определённым URI. Если URI ссылается на уже существующий ресурс, он модифицируется, а если URI указывает на несуществующий ресурс, сервер может создать новый ресурс с этим URI.DELETEМетод DELETE удаляет объект с сервера.HEADМетод HEAD запрашивает ответ, идентичный запросу GET, но без тела ответа.PATCHМетод используется для модификации информации на сервере.<p>Подробнее о методах можно<a>прочитать в официальной документации</a>.</p>
34
МетодОписаниеGETGET-метод используется для обычного запроса к серверу и получения информации по URL.POSTМетод запроса POST запрашивает веб-сервис для приёма данных, например для хранения информации.PUTМетод PUT просит, чтобы вложенный в него объект был сохранён под определённым URI. Если URI ссылается на уже существующий ресурс, он модифицируется, а если URI указывает на несуществующий ресурс, сервер может создать новый ресурс с этим URI.DELETEМетод DELETE удаляет объект с сервера.HEADМетод HEAD запрашивает ответ, идентичный запросу GET, но без тела ответа.PATCHМетод используется для модификации информации на сервере.<p>Подробнее о методах можно<a>прочитать в официальной документации</a>.</p>
35
<p>Запрос GET можно настроить с помощью передачи параметров в методе params. Посмотрим, как это работает на простом примере - попробуем найти изображение на фотостоке Pixabay.</p>
35
<p>Запрос GET можно настроить с помощью передачи параметров в методе params. Посмотрим, как это работает на простом примере - попробуем найти изображение на фотостоке Pixabay.</p>
36
<p>Для начала создадим переменную, которая будет содержать необходимые нам параметры:</p>
36
<p>Для начала создадим переменную, которая будет содержать необходимые нам параметры:</p>
37
query = {'q': 'Forest', 'order': 'popular', 'min_width': '1000', 'min_height': '800'}<p>Наш запрос для поиска изображений на стоке Pixabay представлен словарём, где:</p>
37
query = {'q': 'Forest', 'order': 'popular', 'min_width': '1000', 'min_height': '800'}<p>Наш запрос для поиска изображений на стоке Pixabay представлен словарём, где:</p>
38
<ul><li>q - передаём ключевые слова для поиска;</li>
38
<ul><li>q - передаём ключевые слова для поиска;</li>
39
<li>order - порядок фильтрации поиска, в нашем случае - по популярности;</li>
39
<li>order - порядок фильтрации поиска, в нашем случае - по популярности;</li>
40
<li>min_width и min_height - минимальная ширина и высота соответственно.</li>
40
<li>min_width и min_height - минимальная ширина и высота соответственно.</li>
41
</ul><p>Напишем запрос и посмотрим на результат выполнения:</p>
41
</ul><p>Напишем запрос и посмотрим на результат выполнения:</p>
42
req = requests.get('<a href="https://pixabay.com/en/photos/">https://pixabay.com/en/photos/</a>', params=query) req.url<p>В ответе мы получим ссылку с нужными параметрами запроса:</p>
42
req = requests.get('<a href="https://pixabay.com/en/photos/">https://pixabay.com/en/photos/</a>', params=query) req.url<p>В ответе мы получим ссылку с нужными параметрами запроса:</p>
43
<p>'<a href="https://pixabay.com/en/photos/?order=popular_height=800&q=Forest&min_width=1000">https://pixabay.com/en/photos/?order=popular_height=800&q=Forest&min_width=1000</a>'</p>
43
<p>'<a href="https://pixabay.com/en/photos/?order=popular_height=800&q=Forest&min_width=1000">https://pixabay.com/en/photos/?order=popular_height=800&q=Forest&min_width=1000</a>'</p>
44
<p>Откроём её в браузере:</p>
44
<p>Откроём её в браузере:</p>
45
<em>Скриншот: Requests / Skillbox Media</em><p>Всё получилось. У нас правильно настроена сортировка и размеры изображений.</p>
45
<em>Скриншот: Requests / Skillbox Media</em><p>Всё получилось. У нас правильно настроена сортировка и размеры изображений.</p>
46
<p>Аутентификацию используют в тех случаях, когда сервис должен понять, кто вы. Например, это часто необходимо при работе с API. Аутентификация в библиотеке Requests очень простая - для этого достаточно использовать параметр с именем auth. Попробуем написать код для доступа к API GitHub. Для него вам потребуются данные учётной записи на сервисе - логин и пароль. Поставьте их в нужные места кода:</p>
46
<p>Аутентификацию используют в тех случаях, когда сервис должен понять, кто вы. Например, это часто необходимо при работе с API. Аутентификация в библиотеке Requests очень простая - для этого достаточно использовать параметр с именем auth. Попробуем написать код для доступа к API GitHub. Для него вам потребуются данные учётной записи на сервисе - логин и пароль. Поставьте их в нужные места кода:</p>
47
from getpass import getpass # Импортируем метод getpass из одноимённой библиотеки для ввода пароля доступа. requests.get('https://api.github.com/user', auth=('username', getpass())<p>При запуске кода вам будет необходимо ввести пароль от своего профиля. Если пароль правильный, вернётся ответ 200, если нет - 401.</p>
47
from getpass import getpass # Импортируем метод getpass из одноимённой библиотеки для ввода пароля доступа. requests.get('https://api.github.com/user', auth=('username', getpass())<p>При запуске кода вам будет необходимо ввести пароль от своего профиля. Если пароль правильный, вернётся ответ 200, если нет - 401.</p>
48
<p>SSL-сертификат указывает на то, что установленное через HTTP соединение безопасно и зашифровано. Важно, что библиотека Requests не только умеет работать с SSL-сертификатами "из коробки", но и позволяет настраивать взаимодействие с ними. Для примера отключим проверку SSL-сертификата, передав параметру функции запроса verify значение False:</p>
48
<p>SSL-сертификат указывает на то, что установленное через HTTP соединение безопасно и зашифровано. Важно, что библиотека Requests не только умеет работать с SSL-сертификатами "из коробки", но и позволяет настраивать взаимодействие с ними. Для примера отключим проверку SSL-сертификата, передав параметру функции запроса verify значение False:</p>
49
requests.get('https://api.github.com', verify=False)<p>Ответ:</p>
49
requests.get('https://api.github.com', verify=False)<p>Ответ:</p>
50
<em>Скриншот: Requests / Skillbox Media</em><p>Мы видим, что ответ на запрос содержит предупреждение о неверифицированном сертификате. Всё дело в том, что мы отключили его получение вручную в коде выше с помощью функции verify.</p>
50
<em>Скриншот: Requests / Skillbox Media</em><p>Мы видим, что ответ на запрос содержит предупреждение о неверифицированном сертификате. Всё дело в том, что мы отключили его получение вручную в коде выше с помощью функции verify.</p>
51
<p>Метод GET позволяет работать с запросами на высоком уровне абстракции, не разбираясь в деталях их выполнения, при этом надо настроить лишь базовые параметры.</p>
51
<p>Метод GET позволяет работать с запросами на высоком уровне абстракции, не разбираясь в деталях их выполнения, при этом надо настроить лишь базовые параметры.</p>
52
<p>Однако возможности библиотеки Requests на этом не заканчиваются: с помощью класса Session мы можем контролировать выполнение запросов и увеличивать скорость их выполнения.</p>
52
<p>Однако возможности библиотеки Requests на этом не заканчиваются: с помощью класса Session мы можем контролировать выполнение запросов и увеличивать скорость их выполнения.</p>
53
<p>Класс Session позволяет создавать сеансы - базовые запросы с сохранёнными параметрами (то есть без повторного указания параметров).</p>
53
<p>Класс Session позволяет создавать сеансы - базовые запросы с сохранёнными параметрами (то есть без повторного указания параметров).</p>
54
<p>Напишем код для простой сессии, позволяющей получить доступ к GitHub:</p>
54
<p>Напишем код для простой сессии, позволяющей получить доступ к GitHub:</p>
55
import requests from getpass import getpass with requests.Session() as session: session.auth = ('login', getpass()) response = session.get('https://api.github.com/user') # Выведем ответ на экран. print(response.headers) print(response.json())<p>Запустим его и введём пароль. Как видим, всё сработало:</p>
55
import requests from getpass import getpass with requests.Session() as session: session.auth = ('login', getpass()) response = session.get('https://api.github.com/user') # Выведем ответ на экран. print(response.headers) print(response.json())<p>Запустим его и введём пароль. Как видим, всё сработало:</p>
56
<em>Скриншот: Requests / Skillbox Media</em><p>Запрос возвращает информацию с сервера при этом работает с помощью session. То есть теперь нам не придётся вводить повторные параметры авторизации при следующих запросах.</p>
56
<em>Скриншот: Requests / Skillbox Media</em><p>Запрос возвращает информацию с сервера при этом работает с помощью session. То есть теперь нам не придётся вводить повторные параметры авторизации при следующих запросах.</p>
57
<p>Библиотека Requests - простой инструмент для работы с HTTP-запросами разного уровня сложности. Рекомендуем подробно изучить возможности библиотеки, методы и примеры их использования в <a>официальной документации</a>.</p>
57
<p>Библиотека Requests - простой инструмент для работы с HTTP-запросами разного уровня сложности. Рекомендуем подробно изучить возможности библиотеки, методы и примеры их использования в <a>официальной документации</a>.</p>
58
<p>Python для всех</p>
58
<p>Python для всех</p>
59
<p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
59
<p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
60
<p><a>Пройти бесплатно</a></p>
60
<p><a>Пройти бесплатно</a></p>
61
<a><b>Бесплатный курс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>
61
<a><b>Бесплатный курс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>