Использование библиотеки Requests в Python
Для начала давайте разберемся, что же вообще такое библиотека Requests.
Requests — это HTTP-библиотека, написанная на Python (под лицензией Apache2). Она спроектирована для взаимодействия людей с эим языком. Это означает, что вам не нужно вручную добавлять строки запроса в URL-адреса или заносить данные в форму для POST -запроса. Если это кажется вам бессмысленным, не волнуйтесь. В нужное время все прояснится.
Что же делает библиотека Requests?
Библиотека Requests дает вам возможность посылать HTTP/1.1-запросы, используя Python. С ее помощью вы можете добавлять контент, например заголовки, формы, многокомпонентные файлы и параметры, используя только простые библиотеки Python. Также вы можете получать доступ к таким данным.
В программировании библиотека — это набор или, точнее сказать, предварительно настроенный набор подпрограмм, функций и операций, которые в дальнейшем может использовать ваша программа. Эти элементы часто называют модулями, которые хранятся в объектном формате.
Библиотеки очень важны, потому что вы можете загрузить модуль и использовать все, что он предлагает, без явной связи с вашей программой. Они действительно автономны, так что вы можете создавать свои собственные программы с ними, и все же они остаются отделенными от ваших программ.
Таким образом, о модулях можно думать как о неких шаблонах кода.
Повторимся еще раз, Requests — это библиотека языка Python.
Как установить Requests
Сразу сообщим вам хорошую новость: существует множество способов для установки Requests. С полным списком можно ознакомиться в официальной документации библиотеки Requests.
Вы можете использовать pip, easy_install или tarball.
Если вам нужен исходный код, вы можете найти его на GitHub.
Мы для установки библиотеки воспользуемся менеджером pip.
В интерпретаторе Python введите следующую команду:
pip install requests
Импортирование модуля Requests
Для работы с библиотекой Requests в Python вам необходимо импортировать соответствующий модуль. Вы можете это сделать, просто поместив следующий код в начало вашей программы:
import requests
Разумеется, предварительно этот модуль должен быть установлен и доступен для интерпретатора.
Делаем запрос
Когда вы пингуете веб-сайт или портал для получения информации, то это как раз и называется созданием запроса.
Для получения веб-страницы вам нужно написать что-то в таком духе:
r = requests.get(‘https://github.com/timeline.json’)
Работаем с кодом ответа
Перед тем как вы будете что-то делать с веб-сайтом или URL, хорошей идеей будет проверить код ответа, который вернул вам сервер. Это можно сделать следующим образом:
r = requests.get('https://github.com/timeline.json') r.status_code >>200 r.status_code == requests.codes.ok >>> True requests.codes['temporary_redirect'] >>> 307 requests.codes.teapot >>> 418 requests.codes['o/'] >>> 200
Получаем содержимое страницы
После того как сервер вам ответил, вы можете получить нужный вам контент. Это также делается при помощи функции get библиотеки Requests.
import requests r = requests.get('https://github.com/timeline.json') print(r.text) # Библиотека Requests также имеет встроенный JSON-декодер на # тот случай, если вам понадобятся данные JSON import requests r = requests.get('https://github.com/timeline.json') print(r.json)
Работаем с заголовками
Используя словари Python, вы можете просмотреть заголовки ответа сервера. Особенностью работы библиотеки Requests является то, что для получения доступа к заголовкам вы можете использовать в ключах словаря как заглавные, так и строчные буквы.
Если вызываемого заголовка нет, будет возвращено значение None .
r.headers < 'status': '200 OK', 'content-encoding': 'gzip', 'transfer-encoding': 'chunked', 'connection': 'close', 'server': 'nginx/1.0.4', 'x-runtime': '148ms', 'etag': '"e1ca502697e5c9317743dc078f67693f"', 'content-type': 'application/json; charset=utf-8' >r.headers['Content-Type'] >>>'application/json; charset=utf-8' r.headers.get('content-type') >>>'application/json; charset=utf-8' r.headers['X-Random'] >>>None # Получаем заголовки данного URL resp = requests.head("http://www.google.com") print resp.status_code, resp.text, resp.headers
Кодирование
Библиотека Requests автоматически декодирует любой контент, извлеченный из сервера. Хотя большинство наборов символов Unicode в любом случае легко декодируются.
Когда вы делаете запрос к серверу, библиотека Requests делает обоснованное предположение о кодировке ответа. Это делается на основании заголовков HTTP. Предполагаемая кодировка будет использоваться при доступе к файлу r.text .
С помощью этого файла вы можете определить, какую кодировку использует библиотека Requests, и при необходимости изменить ее. Это возможно благодаря атрибуту r.encoding , который вы найдете в файле.
Когда вы измените значение кодировки, в дальнейшем библиотека Requests при вызове вами r.text будет использовать новый тип кодировки.
print(r.encoding) >> utf-8 >>> r.encoding = ‘ISO-8859-1’
Пользовательские заголовки
Если вы хотите добавить пользовательские заголовки в HTTP-запрос, вы должны передать их через словарь в параметр заголовков.
import json url = 'https://api.github.com/some/endpoint' payload = headers = r = requests.post(url, data=json.dumps(payload), headers=headers)
Переадресация и история
Библиотека Requests автоматически поддерживает переадресацию при выполнении команд GET и OPTION .
Например, GitHub из соображений безопасности автотоматически переадресует все HTTP -запросы на HTTPS .
Вы можете отслеживать статус переадресации при помощи метода history , который реализован для объекта response .
r = requests.get('http://github.com') r.url >>> 'https://github.com/' r.status_code >>> 200 r.history >>> []
Осуществление POST-запроса HTTP
Также с помощью библиотеки Requests вы можете работать и с POST -запросами:
r = requests.post(http://httpbin.org/post)
Но вы также можете выполнять и другие HTTP -запросы, такие как PUT , DELETE , HEAD , и OPTIONS .
r = requests.put("http://httpbin.org/put") r = requests.delete("http://httpbin.org/delete") r = requests.head("http://httpbin.org/get") r = requests.options("http://httpbin.org/get")
При помощи этих методов можно сделать массу разных вещей. Например, при помощи следующего кода вы можете создать репозиторий GitHub:
import requests, json github_url = "https://api.github.com/user/repos" data = json.dumps() r = requests.post(github_url, data, auth=('user', '*****')) print r.json
Ошибки и исключения
Есть ряд ошибок и исколючений, с которыми вам надо ознакомиться при использовании библиотеки Requests.
- При проблемах с сетью, например с DNS , или отказе соединения, библиотека Requests вызовет исключение ConnectionError .
- При недопустимом ответе HTTP библиотека Requests вызвоет исключение HTTPError , но это довольно редкий случай.
- Если время запроса истекло, возникнет исключение Timeout .
- Когда при запросе будет превышено заранее заданное количество переадресаций, возникнет исключение TooManyRedirects .
Все исключения, вызываемые библиотекой Requests, наследуются от объекта requests.exceptions.RequestException .
Дополнительные материалы
Более подробно про билиотеку Requests вы можете почитать, пройдя по следующим ссылкам:
- http://docs.python-requests.org/en/latest/api/
- http://pypi.python.org/pypi/requests
- http://docs.python-requests.org/en/latest/user/quickstart/
- http://isbullsh.it/2012/06/Rest-api-in-python/#requests
Локальная установка библеотек Python(Requests, urllib3)
Машина локальная, отлученная от интернет сети. Мне нужно спарсить наш локальный сайт и собрать информацию для отчета. Для реализации поставленной задачи я выбрал beautifulsoup. Для его работы вдруг потребовались библиотеки Request, для url запросов. Скачал поставил и столкнулся с проблемой.
C:\Users\ . \PycharmProjects\pythonProject1\venv\Scripts\python.exe C:\Users\ . \PycharmProjects\pythonProject1\main.py Traceback (most recent call last): File "C:\Users\ . \PycharmProjects\pythonProject1\main.py", line 2, in import requests File "C:\Users\ . \PycharmProjects\pythonProject1\venv\Lib\site-packages\requests-2.28.2-py3.11.egg\requests\__init__.py", line 43, in import urllib3 ModuleNotFoundError: No module named 'urllib3'
Устанавливаю urllib3, ей тоже не хочется ставится локально!
(venv) PS C:\Users\ . \PycharmProjects\pythonProject1py .\download\urllib3-main\setup.py install =============================== Unsupported installation method =============================== This version of urllib3 has dropped support for Python 2.7 and no longer supports installation with `python setup.py install`. Please use `python -m pip install .` instead. Process finished with exit code 1
Посоветуйте пожалуйста, как их установить и заставить работать через локальную установку!? upd попытка установки библиотеки urllib3 командой py -m pip install .\download\urllib3-2.0.0a3\ , если это команда предназначена для локальной установки то почему она пытается выйти в интернет и выполнить действие с сертификатами, и что она пытается с ними сделать?
(venv) PS C:\Users\ryzhonkov.ia\PycharmProjects\pythonProject> py -m pip install .\download\urllib3-2.0.0a3\ Processing c:\users\ryzhonkov.ia\pycharmprojects\pythonproject\download\urllib3-2.0.0a3 Installing build dependencies . error error: subprocess-exited-with-error × pip subprocess to install build dependencies did not run successfully. │ exit code: 1 ╰─> [10 lines of output] WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to ge t local issuer certificate (_ssl.c:992)'))': /simple/hatchling/ WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to ge t local issuer certificate (_ssl.c:992)'))': /simple/hatchling/ WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to ge t local issuer certificate (_ssl.c:992)'))': /simple/hatchling/ WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to ge t local issuer certificate (_ssl.c:992)'))': /simple/hatchling/ WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to ge t local issuer certificate (_ssl.c:992)'))': /simple/hatchling/ Could not fetch URL https://pypi.org/simple/hatchling/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/hatchling/ (Caused by SSLError( SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:992)'))) - skipping ERROR: Could not find a version that satisfies the requirement hatchling=1.6.0 (from versions: none) ERROR: No matching distribution found for hatchling=1.6.0 Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError(SSLCertVerif icationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:992)'))) - skipping WARNING: There was an error checking the latest version of pip. [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. error: subprocess-exited-with-error × pip subprocess to install build dependencies did not run successfully. │ exit code: 1 ╰─> See above for output. note: This error originates from a subprocess, and is likely not a problem with pip. Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError(SSLCertVerificatio nError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:992)'))) - skipping WARNING: There was an error checking the latest version of pip. (venv) PS C:\Users\ryzhonkov.ia\PycharmProjects\pythonProject>
Установка .whl файла командой py -m pip .\download\request-2.28.2-py3-none-any.whl опять сертификаты!
(venv) PS C:\Users\ryzhonkov.ia\PycharmProjects> py -m pip .\download\request-2.28.2-py3-none-any.whl Processing c:\users\ryzhonkov.ia\pycharmprojects\pythonproject\download\requests-2.28.2-py3-none-any.whl WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get loca l issuer certificate (_ssl.c:992)'))': /simple/charset-normalizer/ WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get loca l issuer certificate (_ssl.c:992)'))': /simple/charset-normalizer/ WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get loca l issuer certificate (_ssl.c:992)'))': /simple/charset-normalizer/ WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get loca l issuer certificate (_ssl.c:992)'))': /simple/charset-normalizer/ WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get loca l issuer certificate (_ssl.c:992)'))': /simple/charset-normalizer/ Could not fetch URL https://pypi.org/simple/charset-normalizer/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/charset-normalizer/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:992)'))) - skipping ERROR: Could not find a version that satisfies the requirement charset-normalizer=2 (from requests) (from versions: none) ERROR: No matching distribution found for charset-normalizer=2 Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError(SSLCertVerificatio nError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:992)'))) - skipping WARNING: There was an error checking the latest version of pip.
Как использовать модуль Requests в Python
Рассказываем о том, как работают библиотеки Requests и как устроены HTTP-запросы.

Игорь Перепилицын
Автор статьи
13 сентября 2022 в 18:13
Requests — это модуль для языка Python, который используют для упрощения работы с HTTP-запросами. Он удобнее и проще встроенного Urllib настолько, что даже в документации Python рекомендовано использовать Requests.
Установка библиотеки Requests
Самый простой вариант установки сторонних пакетов в Python — использовать pip — систему управления пакетами. Обычно pip предустанавливается вместе с интерпретатором. Если его нет — можно скачать. Для этого нужно ввести в командную строку:
Linux / MacOS
python -m ensurepip --upgrade
Windows
py -m ensurepip --upgrade
Когда pip установлен, для установки модуля Requests нужно ввести команду:
pip install requests
Как настроить библиотеку Requests. Библиотека не требует дополнительной настройки — ею можно сразу же пользоваться.
Начало работы. Давайте рассмотрим пример простейшего запроса в модуле 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-разработчик». А еще под руководством опытных преподавателей освоите основные инструменты для работы, составите портфолио из интересных проектов и получите диплом установленного образца.
Python-разработчик: новая работа через 9 месяцев
Получится, даже если у вас нет опыта в IT

Давайте разберёмся, как работать с 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)
POST
Метод POST используют для отправки на сервер данных, которые передаются в теле запроса. Для этого при вызове requests.post() надо указать аргумент data, который принимает на вход словарь, список кортежей, байты или файл.
Если для передачи данных используется формат JSON, вместо data можно указать json. Это просто удобная конвенция, которая правильно формирует отправляемый запрос. Пример:
import requests data_response = requests.post('https://httpbin.org/post', data=) print(data_response.text) # переданные данные находятся по ключу form json_response = requests.post('https://httpbin.org/post', json=) 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=) print(response.text)
PATCH
PATCH аналогичен методу POST, но с двумя отличиями: он используется для частичных изменений ресурса и его нельзя использовать в HTML-формах.
В теле запроса передается набор модификаций, которые надо применить.
import requests response = requests.patch('https://httpbin.org/patch', data=) 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
Теперь рассмотрим, как работать с запросами и ответами в Requests. Чтобы увидеть результат 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=) print(response.headers)
Здесь мы передали заголовок, который указывает, в каком формате мы хотим получить изображение. Попробуйте поменять значение на image/png и посмотрите, как изменится ответ.
Так же можно посмотреть и на заголовки запроса:
print(response.request.headers)
Обратите внимание, что Requests сам подставил информацию о клиенте — User-Agent.
Cookie (куки) — это информация, которую сервер отправляет браузеру для хранения. Они позволяют зафиксировать некоторое состояние. Например, в куки может храниться информация о том, что пользователь уже залогинен. Она хранится в браузере и передается на сервер при каждом запросе, поэтому нам не нужно каждый раз проходить авторизацию заново.
Работать с куками в модуле Requests очень просто:
import requests response = requests.get('https://httpbin.org/cookies', cookies=) print(response.text)
Посмотреть, какие куки пришли от сервера, можно при помощи атрибута cookies объекта Response:
print(response.cookies)
Как отправлять запросы при помощи Python Requests
Рассмотрим несколько частых примеров использования модуля Requests, чтобы понять, как отправлять запросы.
Скачивание файлов
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('Размер загружаемого файла: кб'.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 = 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
Requests — это одна из библиотек, которая поможет вам подружить ваш локальный скрипт с веб-ресурсами и глобальной сетью. Requests предоставляет разработчику обширный пул функций для работы со всеми видами HTTP-запросов. Благодаря этой библиотеке вы сможете получить прогноз погоду, перевести текст, скачать фильм или фото без использования браузера внутри скрипта.
В этом материале вы найдете вводную информацию по этой библиотеке, которой будет достаточно для её использования в ваших скриптах.
Как установить библиотеку Requests в Python
В рамках всего материала речь будет идти про работу в IDE Pycharm.
Библиотека Requests в Python является сторонней, поэтому перед началом работы её необходимо установить. Создаем проект и открываем терминал. В Python установка библиотеки Requests осуществляется следующей командой:
pip3 install requests
Если вы используете виртуальную среду Pipenv, то установка библиотеки Requests в Python 3 производится другой командой:
pipenv install requests
После исполнения этих команд начнется загрузка модуля. С помощью команды pip freeze можем узнать, какие модули были установлены:
PS C:\Users\Timeweb\PycharmProjects\RequestTimeweb> pip3 freeze
certifi==2022.9.24
charset-normalizer==2.1.1
idna==3.4
requests==2.28.1
urllib3==1.26.12
Расскажем, какие функции выполняют эти модули:
- certifi — пакет сертификатов для обеспечения безопасного соединения;
- charset-normalizer — библиотека, которая автоматически распознает тексты неизвестной кодировки. Полезный модуль, поскольку не все сайты и сервисы работают на распространенной UTF-8;
- idna — библиотека для поддержки интернационализированных доменных имен в приложениях;
- requests — собственно, сам модуль requests;
- urllib3 — модуль, включающий в себя функции и классы для работы с URL-адресами;
Первые запросы
В этой части статьи мы напишем код для получения информации с ресурсов и узнаем основные составляющие библиотеки Requests. В дальнейшем мы более детально разберем все аспекты.
Работа с библиотекой Requests в Python начинается с импорта:
import requests
Обратимся к сайту google.com:
import requests as rq
response = rq.get('https://google.com')
print(response)
Здесь мы используем HTTP-запрос GET. Его работа аналогична переходу на сайт по URL в браузере. Далее мы подробнее разберем его.
В ответ мы получили объект Response. У него огромное количество различных свойств, которые мы также разберем дальше. При выводе этого объекта мы получаем код 200 — он означает, что запрос выполнен успешно. Если мы обратимся к несуществующему разделу на сайте google.com, то получим ответ об его отсутствии:
import requests as rq
response = rq.get('https://google.com/timeweb')
print(response)
Теперь разберем, какие вообще существуют запросы и как с ними работать.
HTTP-запросы
Основным запросом к сервисам и сайтам является GET. Он позволяет просматривать содержимое ресурса без его изменения. Однако для полноценной работы с ресурсами в сети может понадобится ряд других запросов. Некоторые из них могут не поддерживаться со стороны того или иного сервера. Вот 7 запросов, которые поддерживает библиотека Requests:
Для тестирования библиотеки создатели спроектировали сайт https://httpbin.org , с помощью которого вы можете попрактиковаться.
GET
GET передает информацию сайту прямо в заголовке. Поэтому его стоит использовать в случаях, когда передаваемая информация не является чем-то ценным: например, поиск некоторой страницы в интернет-магазине. Его не стоит использовать для передачи паролей, банковский карт и подобных данных.
Для передачи данных серверу к его URL-адресу добавляется знак ?, затем идут сами данные. Выглядит это следующим образом:
https://serverurl.ru/get?param1=value1¶m2=value2
- https://serverurl.ru/get — это URL;
- param1=value1¶m2=value2 — параметры. Если параметров несколько, то они отделяются амперсандом «&».
В Requests GET имеет следующий синтаксис:
requests.get( 'URL-адрес', , различные аргументы)
- URL-адрес — адрес ресурса;
- — параметры. Метод самостоятельно включит их в запрос. Необязательный аргумент метода;
- Различные аргументы — необязательные аргументы. Например, время таймаута.
Опробуем его на практике:
import requests as rq
GetParams =
response = rq.get('https://google.com', GetParams)
print(response.url)
https://www.google.com/?param1=value1¶m2=value2
POST
POST используется для отправки данных на сайт в теле запроса. Тело запроса — это данные, передающиеся при совершении запроса к ресурсу. Эта информация не размещается в заголовке и подходят для передачи конфиденциальных данных.
В Requests POST имеет следующий синтаксис:
requests.post('URL-адрес', , различные аргументы>
- URL-адрес — адрес ресурса;
- — параметры. Метод самостоятельно включит их в тело запроса. Необязательный аргумент метода;
- Различные аргументы — необязательные аргументы. Например, время таймаута.
Если не указать параметры, то GET и POST запросы вернут одинаковый результат для одного URL. Посмотрим, как работает это на практике:
import requests as rq
PostParams =
response = rq.post('https://httpbin.org/post', PostParams, timeout=2)
print(response.json()['form'])
С помощью метода json() мы получили тело запроса из response. К слову, если бы мы совершили аналогичный запрос к google.com, то получили бы ошибку:
import requests as rq
PostParams =
response = rq.post('https://google.com', PostParams, timeout=2)
print(response)
Ошибка 405 (Method Not Allowed) означает, что ресурс не поддерживает такой запрос.
Для того, чтобы узнать какие запросы поддерживает ресурс необходимо использовать OPTIONS.
OPTIONS
С помощью OPTIONS мы можем узнать, какие запросы не будут заблокированы ресурсом.
requests.option('URL-адрес', необязательные аргументы)
Отправим OPTIONS-запрос к google.com и узнаем, какие запросы он поддерживает:
import requests as rq
response = rq.options('https://google.com', timeout=2)
print(response.headers['Allow'])
GET, HEAD
HEAD
В ответ на HEAD сервер вернет HTTP заголовки. Этот запрос выполняется, когда нужно получить не содержимое файла, а другие данные. Также HEAD может выполнять тестовые функции.
requests.head('URL-адрес', различные аргументы)
- URL-адрес — адрес ресурса;
- Различные аргументы — необязательные аргументы. Например, время таймаута.
Применим его к google.com:
import requests as rq
response = rq.head('https://google.com', timeout=2)
print(response.headers)
В выводе мы получили большое количество заголовков.
PUT
PUT создает новый объект или заменяет существующий. Он похож на метод POST, но отличается идемпотентностью. Это означает, что при повторных выполнениях PUT с аналогичными данными результат не изменится.
Для лучшего понимания представим базу данных с паролями и логинами. Допустим пользователь хочет поменять пароль. При использовании метода POST он добавит новую запись со своим идентификатором, в данном случае логином (при отсутствии других программных проверок). При использовании PUT он обновит текущий.
requests.put('URL-адрес', , различные аргументы)
- URL-адрес — адрес ресурса;
- — параметры. Метод самостоятельно включит их в тело запроса.
- Различные аргументы — необязательные аргументы. Например, время таймаута.
Применим его к httpbin:
import requests as rq
PutParams =
response = rq.put('https://httpbin.org/put', data=PutParams, timeout=2)
print(response.status_code)
PATCH
С помощью PATCH осуществляется частичное обновление данных на ресурсе (например, смена токена). Синтаксис следующий:
requests.patch ('URL-адрес', , различные аргументы)
- URL-адрес — адрес ресурса;
- — параметры. Метод самостоятельно включит их в тело запроса.
- Различные аргументы — необязательные аргументы. Например, время таймаута.
Применим его httpbin:
import requests as rq
PatchParams =
response = rq.patch('https://httpbin.org/patch', data=PatchParams, timeout=2)
print(response.status_code)
DELETE
Используется для удаления некого объекта на ресурсе. Синтаксис:
requests.delete('URL-адрес', )
- URL-адрес — адрес ресурса;
- — параметры (данные, которые необходимо удалить). Метод самостоятельно включит их в тело запроса.
import requests as rq
DelParams =
response = rq.delete('https://httpbin.org/delete', data=DelParams, timeout=2)
print(response.status_code)
Объект Response
Как было показано в примерах, объект Response обладает большим количеством методов и свойств. Ниже вы найдете их с кратким описанием:
- apparent_encoding — кодировка, распознанная charset-normalizer;
- close() — закрывает соединение с сервером;
- content — вывод полученных данных в байтах;
- cookies — вывод куки;
- elapsed — вывод времени;
- encoding — выбор кодировки для декодирования;
- headers — вывод заголовков ресурса;
- history — вывод переадресации;
- is_permanent_redirect — определение постоянных редиректов;
- is_redirect — определение наличия редиректа;
- iter_content() — возврат данных по частям;
- iter_lines() — возврат данных построчно;
- json() — возврат данных в формате JSON;
- links — возврат ссылок в заголовках ответа;
- next — возврат PreparedRequest;
- ok — True при удачном соединении, False при неудачном;
- raise_for_status() — вызов исключения HTTPError;
- reason — вывод текстового представления объекта;
- request — возврат результат PreparedRequest;
- status_code — код ответа;
- text — вывод ответа в юникоде;
- url — вывод URL.
Заключение
В рамках этого материала мы рассмотрели основные элементы библиотеки Requests. Если вы хотите узнать о ней больше, то официальная документация библиотеки Requests Python даст вам необходимые ответы. А для тестирования своих скриптов можно использовать облачные серверы от timeweb.cloud.
