Не работает post запрос python

Requests в Python – Примеры выполнения HTTP запросов

Библиотека requests является стандартным инструментом для составления HTTP-запросов в Python. Простой и аккуратный API значительно облегчает трудоемкий процесс создания запросов. Таким образом, можно сосредоточиться на взаимодействии со службами и использовании данных в приложении.

Содержание статьи

В данной статье представлены наиболее полезные особенности requests. Показано, как изменить и приспособить requests к различным ситуациям, с которыми программисты сталкиваются чаще всего. Здесь также даются советы по эффективному использованию requests и предотвращению влияния сторонних служб, которые могут сильно замедлить работу используемого приложения. Мы использовали библиотек requests в уроке по парсингу html через библиотеку BeautifulSoup.

Ключевые аспекты инструкции:

  • Создание запросов при помощи самых популярных HTTP методов;
  • Редактирование заголовков запросов и данных при помощи строки запроса и содержимого сообщения;
  • Анализ данных запросов и откликов;
  • Создание авторизированных запросов;
  • Настройка запросов для предотвращения сбоев и замедления работы приложения.

В статье собран оптимальный набор информации, необходимый для понимания данных примеров и особенностей их использования. Информация представлена в доступной в форме. Тем не менее, стоит иметь в виду, что для оптимального разбора инструкции потребуются хотя бы базовые знания HTTP.

Далее будут показаны наиболее эффективные методы использования requests в разрабатываемом приложении.

Python установка библиотеки requests

Для начала работы потребуется установить библиотеку requests . Для этого используется следующая команда.

Источник

Почему библиотека requests не работает при проверке статуса кода в Python?

Писал скрипт, который проверяет статус сервера в таком варианте все работало:

> python3 requester.py ya.ru
[200] Все хорошо: https://ya.ru
> python3 requester.py ya.ru/bgdtrubi
[404] Страница отсутствует: https://ya.ru/bgdtrubi

Но код ответа не всегда соответствует заданным, по этому я отредактировал, что бы понимать какой код возвращает скрипт:

При вводе существующего домена вывод терминала такой:

> python3 requester.py ya.ru
[200] Все хорошо: ya.ru
> python3 requester.py ya.ru/bgdtrubi
[404] Не все хорошо: ya.ru/bgdtrubi

Traceback (most recent call last):
File «/home/usr/.local/lib/python3.6/site-packages/urllib3/connection.py», line 157, in _new_conn
(self._dns_host, self.port), self.timeout, **extra_kw
File «/home/usr/.local/lib/python3.6/site-packages/urllib3/util/connection.py», line 61, in create_connection
for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
File «/usr/lib/python3.6/socket.py», line 745, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File «/home/usr/.local/lib/python3.6/site-packages/urllib3/connectionpool.py», line 672, in urlopen
chunked=chunked,
File «/home/usr/.local/lib/python3.6/site-packages/urllib3/connectionpool.py», line 387, in _make_request
conn.request(method, url, **httplib_request_kw)
File «/usr/lib/python3.6/http/client.py», line 1264, in request
self._send_request(method, url, body, headers, encode_chunked)
File «/usr/lib/python3.6/http/client.py», line 1310, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File «/usr/lib/python3.6/http/client.py», line 1259, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File «/usr/lib/python3.6/http/client.py», line 1038, in _send_output
self.send(msg)
File «/usr/lib/python3.6/http/client.py», line 976, in send
self.connect()
File «/home/usr/.local/lib/python3.6/site-packages/urllib3/connection.py», line 184, in connect
conn = self._new_conn()
File «/home/usr/.local/lib/python3.6/site-packages/urllib3/connection.py», line 169, in _new_conn
self, «Failed to establish a new connection: %s» % e
urllib3.exceptions.NewConnectionError: : Failed to establish a new connection: [Errno -2] Name or service not known

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File «/home/usr/.local/lib/python3.6/site-packages/requests/adapters.py», line 449, in send
timeout=timeout
File «/home/usr/.local/lib/python3.6/site-packages/urllib3/connectionpool.py», line 720, in urlopen
method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
File «/home/usr/.local/lib/python3.6/site-packages/urllib3/util/retry.py», line 436, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host=’yqqqqa.ru’, port=80): Max retries exceeded with url: / (Caused by NewConnectionError(‘: Failed to establish a new connection: [Errno -2] Name or service not known’,))

During handling of the above exception, another exception occurred:

Источник

Использование модуля Requests в Python

Requests — это модуль Python, который вы можете использовать для отправки всех видов HTTP-запросов. Это простая в использовании библиотека с множеством функций, начиная от передачи параметров в URL-адресах до отправки пользовательских заголовков и проверки SSL. В этом уроке вы узнаете, как использовать эту библиотеку для отправки простых HTTP-запросов в Python.

Вы можете использовать Запросы с Python версии 2.6-2.7 и 3.3-3.6. Прежде чем продолжить, вы должны знать о том, что Requests является внешним модулем, поэтому сначала вам нужно будет установить его, прежде чем попробовать примеры из этого урока. Вы можете установить его, выполнив следующую команду в терминале:

Читайте также:  Как починить разбитую вазу

После установки модуля вы можете проверить, был ли он успешно установлен, импортировав его с помощью этой команды:

Если установка прошла успешно, вы не увидите никаких сообщений об ошибках.

Создание запроса GET

Очень просто отправить HTTP-запрос с помощью Requests. Сначала вы импортируете модуль и затем выполните запрос. Вот пример:

Вся информация о нашем запросе теперь хранится в объекте Response, называемом req . Например, вы можете получить кодировку веб-страницы, используя свойство req.encoding . Вы также можете получить код состояния запроса, используя свойство req.status_code .

Вы можете получить доступ к файлам cookie, отправленным сервером с помощью req.cookies . Аналогично, вы можете получить заголовки ответов, используя req.headers . Свойство req.headers возвращает нечувствительный к регистру словарь заголовков ответов. Это означает, что req.headers[‘Content-Length’] , req.headers[‘content-length’] и req.headers[‘CONTENT-LENGTH’] вернут значение заголовка ответа Content-Length .

Вы можете проверить, является ли ответ корректным HTTP-перенаправлением, которое могло быть обработано автоматически с использованием свойства req.is_redirect . Он будет возвращать True или False на основе ответа. Вы также можете получить время, прошедшее между отправкой запроса и возвратом ответа с использованием свойства req.elapsed .

URL, который вы первоначально передали функции get() , может отличаться от конечного URL-адреса ответа по целому ряду причин, включая перенаправления. Чтобы увидеть окончательный URL-адрес ответа, вы можете использовать свойство req.url .

Получение всей этой информации о веб-странице, к которой вы обращаетесь, приятно, но вы, скорее всего, хотите получить доступ к фактическому контенту. Если контент, к которому вы обращаетесь, является текстом, вы можете использовать свойство req.text для доступа к нему. Затем содержимое анализируется как unicode. Вы можете передать кодировку, с помощью которой можно декодировать текст, используя свойство req.encoding .

В случае нетекстовых ответов вы можете получить к ним доступ в двоичной форме, используя req.content . Модуль автоматически расшифровывает gzip и deflate кодирование передачи. Это может быть полезно, когда вы имеете дело с медиафайлами. Аналогично, вы можете получить доступ к json-закодированному контенту ответа, если он существует, используя req.json() .

Вы также можете получить исходный ответ с сервера, используя req.raw . Имейте в виду, что вам придется передать stream=True в запросе, чтобы получить исходный ответ.

Некоторые файлы, которые вы загружаете из Интернета с помощью модуля Requests, могут иметь огромный размер. В таких случаях неразумно загружать весь ответ или файл в память сразу. Вы можете загрузить файл на куски или фрагменты, используя метод iter_content(chunk_size = 1, decode_unicode = False) .

Этот метод выполняет итерацию по данным ответа в chunk_size количество байтов одновременно. Когда в запросе задан stream = True , этот метод не позволит сразу считывать весь файл в память для больших ответов. Параметр chunk_size может быть integer или None . Когда установлено значение integer, chunk_size определяет количество байтов, которые должны быть прочитаны в памяти.

Если для параметра chunk_size установлено значение None , а для stream установлено значение True , данные будут считаны по мере того, как он достигнет любого размера кусков. Если для параметра chunk_size установлено значение None , а для stream установлено значение False , все данные будут возвращены как один кусок.

Давайте загрузим этот образ леса на Pixabay с помощью модуля Requests. Вот фактическое изображение:

Это код, который вам нужен:

‘path/to/forest.jpg’ — это фактический URL изображения; вы можете поместить URL-адрес любого другого изображения здесь, чтобы загрузить что-то еще. Данный файл изображения имеет размер 185kb, и вы установили chunk_size в 50 000 байт. Это означает, что сообщение «Получено сообщение» должно быть напечатано четыре раза в терминале. Размер последнего фрагмента будет всего 39350 байт, потому что часть файла, которая остается полученной после первых трех итераций, составляет 39350 байт.

Запросы также позволяют передавать параметры в URL-адресе. Это может быть полезно при поиске на веб-странице некоторых результатов, таких как конкретный образ или учебник. Вы можете предоставить эти строки запроса как словарь строк, используя ключевое слово params в запросе GET. Вот пример:

Выполнение запроса POST

Выполнение запроса POST так же просто, как создание запросов GET. Вы просто используете функцию post() вместо get() . Это может быть полезно, когда вы автоматически отправляете формы. Например, следующий код загрузит всю страницу Википедии по нанотехнологии и сохранит ее на вашем ПК.

Как уже упоминалось ранее, вы можете получить доступ к файлам cookie и заголовкам, которые сервер отправляет вам обратно с помощью req.cookies и req.headers . Запросы также позволяют отправлять свои собственные cookie-файлы и заголовки с запросом. Это может быть полезно, если вы хотите, скажем, установить пользовательский агента для вашего запроса.

Чтобы добавить HTTP-заголовки в запрос, вы можете просто передать их в dict для параметра headers . Аналогично, вы также можете отправлять свои собственные файлы cookie на сервер, используя dict , переданный в параметр cookie .

Читайте также:  После удаления желудка не работает кишечник

Cookies также может быть передано в Cookie Jar. Они предоставляют более полный интерфейс, позволяющий использовать эти файлы cookie на нескольких путях. Вот пример:

Объекты сеанса

Иногда полезно сохранять определенные параметры для нескольких запросов. Объект Session делает именно это. Например, он будет сохранять данные cookie во всех запросах, сделанных с использованием того же сеанса. Объект Session использует объединение соединений urllib3. Это означает, что базовое TCP-соединение будет повторно использоваться для всех запросов, сделанных на один и тот же хост. Это может значительно повысить производительность. Вы также можете использовать методы объекта Requests с объектом Session.

Ниже приведен пример нескольких запросов, отправленных с использованием и без использования сеансов:

Как вы можете видеть, cookie сеанса имеет другое значение в первом и втором запросах, но имеет такое же значение, когда мы использовали объект Session. При тестировании кода вы получите другое значение, но в вашем случае cookie для запросов, сделанных с использованием объекта сеанса, будет иметь такое же значение.

Сессии также полезны, если вы хотите отправлять одни и те же данные по всем запросам. Например, если вы решили отправить куки-файл или заголовок пользовательского агента со всеми запросами в данный домен, вы можете использовать объекты сеанса. Вот пример:

Как вы можете видеть, cookie сеанса «visit-month» отправляется со всеми тремя запросами. Однако cookie «visit-year» отправляется только во время второго запроса. В третьем запросе также не упоминается «vist-year» . Это подтверждает тот факт, что файлы cookie или другие данные, установленные по отдельным запросам, не будут отправляться с другими запросами сеанса.

Заключение

Концепции, обсуждаемые в этом руководстве, должны помочь вам сделать базовые запросы на сервер путем передачи определенных заголовков, куки или строк запроса. Это будет очень удобно, когда вы пытаетесь получить данные с некоторых веб-страниц. Теперь вы также сможете автоматически загружать музыкальные файлы и обои с разных сайтов, как только вы определили шаблон в URL-адресах.

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

Если у вас есть какие-либо вопросы относительно этого урока, пожалуйста, дайте мне знать в комментариях.

Источник

Python API Tutorial: Примеры GET POST AUTH requests (HTTP запросов)

В этом уроке по API Python мы узнаем, как получать данные для проектов по науке о данных. В Интернете существуют миллионы API, которые предоставляют доступ к данным. Такие сайты, как Bitrix24, AmoCRM, Yandex API, Twitter, Instagram, VK и Facebook, предлагают определенные данные через свои API. Это могут быть данные предоставляемые только тем, у кого есть access_token, либо API с открытым доступом.

Python API Tutorial: Примеры GET POST AUTH requests (HTTP запросов). Структура запроса GET и POST. Выгрузка данных из API облачных систем

Чтобы использовать API, вы отправляете запрос на удаленный веб-сервер и извлекаете необходимые данные.

Что такое API?

API (Application Programming Interface) или интерфейс прикладного программирования — это сервер, который вы можете использовать для извлечения и отправки данных с использованием кода (запросов). API-интерфейсы чаще всего используются для извлечения данных, и это будет основной темой этого урока для начинающих.

Когда мы хотим получить данные из API, нам нужно сделать запрос . Запросы используются во всем Интернете. Например, когда вы открываете страницу сайта, то сначала ваш веб-браузер отправляет URL-запрос на веб-сервер хостинга (где расположен сайт), а хостинг возвращает некоторое содержимое этой веб-страницы.

Запросы API работают точно так же — вы отправляете запрос на сервер API для данных, а сервер возвращает ответ. API Необходимы для того, чтобы не давать прямой доступ к базе данных. Т.к. при прямом доступе к БД очень велика вероятность неправильных действий, что может привести к различным ошибкам.

GET и POST запросы с использованием Python

Существует два метода запросов HTTP (протокол передачи гипертекста): запросы GET и POST в Python.

Что такое HTTP/HTTPS?

HTTP — это набор протоколов, предназначенных для обеспечения связи между клиентами и серверами. Он работает как протокол запроса-ответа между клиентом и сервером.

Веб-браузер может быть клиентом, а приложение на компьютере, на котором размещен веб-сайт, может быть сервером.

Итак, чтобы запросить ответ у сервера, в основном используют два метода:

  1. GET : запросить данные с сервера. Т.е. мы отправляем только URL (HTTP) запрос без данных. Метод HTTP GET предназначен для получения информации от сервера. В рамках GET-запроса некоторые данные могут быть переданы в строке запроса URI в формате параметров (например, условия поиска, диапазоны дат, ID Объекта, номер счетчика и т.д.).
  2. POST : отправить данные для обработки на сервер (и получить ответ от сервера). Мы отправляем набор информации, набор параметров для API. Метод запроса POST предназначен для запроса, при котором веб-сервер принимает данные, заключённые в тело сообщения POST запроса.
Читайте также:  Как настроить каналы видеонаблюдения

Чтобы сделать HTTP-запросы в python, мы можем использовать несколько HTTP-библиотек, таких как:

Самая элегантная и простая из перечисленных выше библиотек — это Requests. Библиотека запросов не является частью стандартной библиотеки Python, поэтому вам нужно установить ее, чтобы начать работать с ней.

Если вы используете pip для управления вашими пакетами Python, вы можете устанавливать запросы, используя следующую команду:

Если вы используете conda, вам понадобится следующая команда:

После того, как вы установили библиотеку, вам нужно будет ее импортировать. Давайте начнем с этого важного шага:

Синтаксис / структура получения данных через GET/POST запросы к API

Есть много разных типов запросов. Наиболее часто используемый, GET запрос, используется для получения данных.

Когда мы делаем запрос, ответ от API сопровождается кодом ответа, который сообщает нам, был ли наш запрос успешным. Коды ответов важны, потому что они немедленно сообщают нам, если что-то пошло не так.

Чтобы сделать запрос «GET», мы будем использовать requests.get() функцию .

Метод post() используется, когда вы хотите отправить некоторые данные на сервер.

Ниже приведена подборка различных примеров использования запросов GET и POST через библиотеку REQUESTS. Безусловно, существует еще больше разных случаев. Всегда прежде чем, писать запрос, необходимо обратиться к официальной документации API (например, у Yandex есть документация к API различных сервисов, у Bitrix24 есть документация к API, у AmoCRM есть дока по API, у сервисов Google есть дока по API и т.д.). Вы смотрите какие методы есть у API, какие запросы API принимает, какие данные нужны для API, чтобы он мог выдать информацию в соответствии с запросом. Как авторизоваться, как обновлять ключи доступа (access_token). Все эти моменты могут быть реализованы по разному и всегда нужно ответ искать в официальной документации у поставщика API.

Коды состояния API

Коды состояния возвращаются при каждом запросе к веб-серверу. Коды состояния указывают информацию о том, что произошло с запросом.

Ответы сгруппированы в пять классов:

  1. Информационные ответы ( 100 — 199 ),
  2. Успешные ответы ( 200 — 299 ),
  3. Перенаправления ( 300 — 399 ),
  4. Ошибки клиента ( 400 — 499 ),
  5. и ошибки сервера ( 500 — 599 ).

Вот некоторые коды, которые относятся к запросам GET :

  • 200 : Все прошло хорошо и результат был возвращен (если есть).
  • 301 : Сервер перенаправляет вас на другую конечную точку. Это может произойти, когда компания меняет доменные имена или имя конечной точки изменяется.
  • 400 : Сервер считает, что вы сделали неверный запрос. Это может произойти, если вы отправите неверные данные.
  • 401 : Сервер думает, что вы не аутентифицированы. Для многих API требуются учетные данные для входа, поэтому код 401 случается, когда вы отправляете неверные учетные данные для доступа к API.
  • 403 : Ресурс, к которому вы пытаетесь получить доступ, запрещен: у вас нет прав для его просмотра.
  • 404 : Ресурс, к которому вы пытались получить доступ, не найден на сервере.
  • 503 : Сервер не готов обработать запрос.

Посмотреть информацию по другим ошибкам можно по ссылке HTTP response status codes.

Работа с данными JSON в Python

JSON (JavaScript Object Notation) — это язык API. JSON — это способ кодирования структур данных, который простоту чтения данных машинами. JSON — это основной формат, в котором данные передаются туда и обратно в API, и большинство серверов API отправляют свои ответы в формате JSON.

JSON выглядит так, как будто он содержит словари, списки, строки и целые числа Python. Вы можете думать о JSON как о комбинации этих объектов, представленных в виде строк.

Python имеет отличный инструментарий для работы с данными в формате JSON (п акет json — является частью стандартной библиотеки). Мы можем конвертировать списки и словари в JSON, а также конвертировать строки в списки и словари .

Библиотека JSON имеет две основные функции:

  • json.dumps() — принимает объект Python и преобразует его в строку.
  • json.loads() — принимает строку JSON и преобразует (загружает) ее в объект Python.

Функция dumps() особенно полезна, поскольку мы можем использовать ее для печати отформатированной строки, которая облегчает понимание вывода JSON.

Теперь попробуем применить функцию dump() — структура данных станет более наглядна:

Дополнительные команды для просмотра параметров Response библиотеки Requests Python

Пример скрипта Python:

Результат:

Примеры запросов GET с использованием библиотеки REQUESTS в PYTHON

Рассмотрим первый пример получения данных из Yandex Метрика API данных через метод get библиотеки requests.

Выгрузка данных из Яндекс Метрики с помощью библиотеки Requests.Get

Код запроса (номер счетчика и токен изменены):

Результат:

Получим цены на нефть в формате JSON с ресурса oilpriceapi.com

Для получения токена, необходимо пройти регистрацию на сайте oilpriceapi.com.

Пример для токена 984a45fflkj09j9870ujkheca7jj977658 (у вас будет свой ключ доступа):

Источник

Оцените статью