Рубрики
Без рубрики

Использование cURL в Python с PycURL

Автор оригинала: Muhammad Junaid Khalid.

Использование cURL в Python с PycURL

Вступление

В этом уроке мы узнаем, как использовать PycURL , который является интерфейсом к библиотеке cURL в Python. cURL – это инструмент, используемый для передачи данных на сервер и с сервера, а также для выполнения различных типов запросов данных. PycURL отлично подходит для тестирования REST API, загрузки файлов и так далее. Некоторые разработчики предпочитают использовать Postman для тестирования API, но PycURL-еще один подходящий вариант, поскольку он поддерживает несколько протоколов, таких как FILE, FTPS, HTTPS, IMAP, POP3, SMTP, SCP, SMB и т. Д. Кроме того, PycURL пригодится, когда требуется много параллельных, быстрых и надежных соединений.

Как уже упоминалось выше, PycURL является интерфейсом к библиотеке libcURL в Python; поэтому PycURL наследует все возможности libcURL. PycURL чрезвычайно быстр (известно , что он намного быстрее, чем Requests, который является библиотекой Python для HTTP-запросов), имеет многопротокольную поддержку, а также содержит сокеты для поддержки сетевых операций.

Предварительные условия

Прежде чем приступить к этому уроку, обратите внимание, что есть несколько предварительных условий. Вы должны иметь базовое понимание синтаксиса Python и/или иметь, по крайней мере, опыт программирования на начальном уровне на каком-либо другом языке. Кроме того, вы должны хорошо понимать общие сетевые концепции, такие как протоколы и их типы, а также режим связи клиент-сервер. Знакомство с этими понятиями необходимо для понимания библиотеки PycURL.

Установка

Процесс установки PycURL довольно прост и понятен для всех операционных систем. Вам просто нужно установить libcURL в вашей системе, чтобы использовать PycURL.

ОС Mac/Linux

Для Mac OS и Linux установка PycURL является самой простой, так как она не имеет зависимостей, а libcURL устанавливается по умолчанию. Просто запустите следующую команду в вашем терминале, и установка будет завершена:

Установка через pip
$ pip install pycurl 
Установка через easy_install
$ easy_install pycurl

ОС Windows

Однако для Windows существует несколько зависимостей, которые необходимо установить, прежде чем PyCURL можно будет использовать в ваших программах. Если вы используете официальный дистрибутив Python (т. е. вы скачали версию Python с официального сайта https://www.python.org ) а также pip, вам просто нужно запустить следующую команду в командной строке, и установка будет выполнена:

$ pip install pycurl

Если вы не используете pip, установщики EXE и MSI доступны по адресу PycURL Windows . Вы можете скачать и установить их прямо оттуда, как и любое другое приложение.

Основные Примеры Кода

В этом разделе мы рассмотрим некоторые примеры кодирования PycURL, демонстрирующие различные функциональные возможности интерфейса.

Как уже упоминалось во введении, PycURL поддерживает множество протоколов и имеет множество сложных функций. Однако в наших примерах мы будем работать с протоколом HTTP для тестирования REST API с использованием наиболее часто используемых методов HTTP: GET, POST, PUT и DELETE, а также нескольких других примеров. Мы напишем синтаксис для их объявления в Python 3, а также объясним, что они делают.

Итак, начнем!

Пример 1: Отправка HTTP-запроса GET

Простая сетевая операция PycURL заключается в извлечении информации с данного сервера с помощью его URL-адреса. Это называется GET-запросом, поскольку он используется для get сетевого ресурса.

Простой запрос GET может быть выполнен с помощью PycURL путем импорта модуля BytesIO и создания его объекта. Объект CURL создается для передачи данных и файлов по URL-адресам.

Нужный URL-адрес задается с помощью функции setopt () , которая используется как setopt(option, value) . Параметр option указывает, какой параметр следует установить, например URL , WRITE DATA и т. Д., А параметр value указывает значение, заданное этому конкретному параметру.

Данные, полученные из заданного URL-адреса, затем записываются в виде байтов в объект BytesIO. Затем байты считываются из объекта BytesIO с помощью функции getvalue() и затем декодируются для печати HTML-кода на консоль.

Вот пример того, как это сделать:

import pycurl
from io import BytesIO 

b_obj = BytesIO() 
crl = pycurl.Curl() 

# Set URL value
crl.setopt(crl.URL, 'https://wiki.python.org/moin/BeginnersGuide')

# Write bytes that are utf-8 encoded
crl.setopt(crl.WRITEDATA, b_obj)

# Perform a file transfer 
crl.perform() 

# End curl session
crl.close()

# Get the content stored in the BytesIO object (in byte characters) 
get_body = b_obj.getvalue()

# Decode the bytes stored in get_body to HTML and print the result 
print('Output of GET request:\n%s' % get_body.decode('utf8')) 

Выход:

Output of GET request:









BeginnersGuide - Python Wiki



.
.
.

Пример 2: Проверка заголовков ответов GET

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

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

Чтобы изучить заголовки ответов, нам сначала нужно извлечь их, и мы делаем это с помощью опции HEADER FUNCTION и отобразить их с помощью нашей самостоятельной функции ( display_header() в данном случае).

Мы предоставляем URL-адрес сайта, заголовки ответов которого мы хотим изучить; ФУНКЦИЯ ЗАГОЛОВКА отправляет заголовки ответов в функцию display_header () , где они соответствующим образом отформатированы. Заголовки ответов декодируются в соответствии с заданным стандартом и разбиваются на соответствующие им имена и значения. Пробелы между именами и значениями удаляются, а затем они преобразуются в нижний регистр.

Затем заголовки ответов записываются в объект BytesIO, передаются запросчику и, наконец, отображаются в соответствующем формате.

from io import BytesIO
import pycurl

headers = {}

def display_header(header_line):
    header_line = header_line.decode('iso-8859-1')

    # Ignore all lines without a colon
    if ':' not in header_line:
        return

    # Break the header line into header name and value
    h_name, h_value = header_line.split(':', 1)

    # Remove whitespace that may be present
    h_name = h_name.strip()
    h_value = h_value.strip()
    h_name = h_name.lower() # Convert header names to lowercase
    headers[h_name] = h_value # Header name and value.

def main():
    print('**Using PycURL to get Twitter Headers**')
    b_obj = BytesIO()
    crl = pycurl.Curl()
    crl.setopt(crl.URL, 'https://twitter.com')
    crl.setopt(crl.HEADERFUNCTION, display_header)
    crl.setopt(crl.WRITEDATA, b_obj)
    crl.perform()
    print('Header values:-')
    print(headers)
    print('-' * 20)
    
main()

Выход:

**Using PycURL to get Twitter Headers**
Header values:-
{'cache-control': 'no-cache, no-store, must-revalidate, pre-check=0, post-check=0', 'content-length': '303055', 'content-type': 'text/html;charset=utf-8', 'date': 'Wed, 23 Oct 2019 13:54:11 GMT', 'expires': 'Tue, 31 Mar 1981 05:00:00 GMT', 'last-modified': 'Wed, 23 Oct 2019 13:54:11 GMT', 'pragma': 'no-cache', 'server': 'tsa_a', 'set-cookie': 'ct0=ec07cd52736f70d5f481369c1d762d56; Max-Age=21600; Expires=Wed, 23 Oct 2019 19:54:11 GMT; Path=/; Domain=.twitter.com; Secure', 'status': '200 OK', 'strict-transport-security': 'max-age=631138519', 'x-connection-hash': 'ae7a9e8961269f00e5bde67a209e515f', 'x-content-type-options': 'nosniff', 'x-frame-options': 'DENY', 'x-response-time': '26', 'x-transaction': '00fc9f4a008dc512', 'x-twitter-response-tags': 'BouncerCompliant', 'x-ua-compatible': 'IE=edge,chrome=1', 'x-xss-protection': '0'}
--------------------

В тех случаях, когда у нас есть несколько заголовков с одним и тем же именем, будет сохранено только последнее значение заголовка. Чтобы сохранить все значения в многозначных заголовках, мы можем использовать следующий фрагмент кода:

if h_name in headers:
    if isinstance(headers[h_name], list):
        headers[name].append(h_value)
    else:
        headers[h_name] = [headers[h_name], h_value]
else:
    headers[h_name] = h_value

Пример 3: Отправка данных формы через HTTP POST

POST-запрос-это тот, который отправляет данные на веб-сервер, заключая их в тело HTTP-запроса. Когда вы загружаете файл или отправляете форму, вы в основном отправляете POST – запрос на назначенный сервер.

POST-запрос может быть выполнен с помощью PycURL, сначала установив URL-адрес для отправки данных формы через функцию setopt . Отправляемые данные сначала хранятся в виде словаря (в парах ключ-значение), а затем кодируются URL-адресом с помощью функции urlencode , найденной в модуле urllib.parse .

Мы используем опцию POSTFIELDS при отправке данных формы, поскольку она автоматически устанавливает метод HTTP-запроса на POST, а также обрабатывает наши данные pf .

from urllib.parse import urlencode
import pycurl

crl = pycurl.Curl()
crl.setopt(crl.URL, 'https://www.code-learner.com/post/')
data = {'field': 'value'}
pf = urlencode(data)

# Sets request method to POST,
# Content-Type header to application/x-www-form-urlencoded
# and data to send in request body.
crl.setopt(crl.POSTFIELDS, pf)
crl.perform()
crl.close()

Примечание : Если вы хотите указать другой метод запроса, вы можете использовать для этого опцию CUSTOM REQUEST . Просто напишите имя выбранного вами метода запроса в пустых перевернутых запятых после crl.CUSTOM REQUEST .

crl.setopt(crl.CUSTOMREQUEST, '')

Пример 4: Загрузка файлов с помощью Multipart POST

Существует несколько способов репликации того, как файл загружается в HTML-форму с помощью PycURL:

  1. Если данные, которые будут отправлены по почтовому запросу, находятся в файле в вашей системе, вам необходимо сначала установить URL-адрес, по которому вы хотите отправить данные. Затем вы указываете свой метод запроса как HTTP POST и используете опцию file upload для загрузки содержимого нужного файла.
import pycurl

crl = pycurl.Curl()
crl.setopt(crl.URL, 'https://www.code-learner.com/post/')

crl.setopt(crl.HTTPPOST, [
    ('fileupload', (
        # Upload the contents of the file
        crl.FORM_FILE, './my-resume.doc',
    )),
])
crl.perform()
crl.close()

Примечание : Если вы хотите изменить имя и/или тип содержимого файла, вы можете сделать это, внеся небольшие изменения в приведенный выше код:

crl.setopt(crl.HTTPPOST, [
    ('fileupload', (
        # Upload the contents of this file
        crl.FORM_FILE, './my-resume.doc',
        # Specify a file name of your choice
        crl.FORM_FILENAME, 'updated-resume.doc',
        # Specify a different content type of upload
        crl.FORM_CONTENTTYPE, 'application/msword',
    )),
])
  1. Для файловых данных, которые у вас есть в памяти, все, что меняется при реализации POST-запроса, – это FORM_BUFFER и FORM_BUFFERPTR вместо FORM_FILE , поскольку они извлекают данные для публикации непосредственно из памяти.
import pycurl

crl = pycurl.Curl()
crl.setopt(crl.URL, 'https://www.code-learner.com/post/')

crl.setopt(crl.HTTPPOST, [
    ('fileupload', (
        crl.FORM_BUFFER, 'contact-info.txt',
        crl.FORM_BUFFERPTR, 'You can reach me at [email protected]',
    )),
])

crl.perform()
crl.close()

Пример 5: Загрузка файла с помощью HTTP PUT

PUT request по своей природе аналогичен POST request, за исключением того, что его можно использовать для загрузки файла в тело запроса. Вы используете запрос PUT, когда знаете URL-адрес объекта, который хотите создать или перезаписать. В основном PUT заменяет все, что в данный момент существует в целевом URL-адресе, чем-то другим.

Если нужные данные для загрузки находятся в физическом файле, вам сначала нужно установить целевой URL-адрес, а затем загрузить файл и открыть его. Важно, чтобы файл оставался открытым, пока объект cURL использует его. Затем данные считываются из файла с помощью READ DATA .

Наконец, передача файла (upload) выполняется с помощью функции perform , после чего сеанс cURL завершается. Наконец, файл, который был первоначально открыт для объекта CURL, закрывается.

import pycurl

crl = pycurl.Curl()
crl.setopt(crl.URL, 'https://www.code-learner.com/post/')

dat_file = open('data.txt')

crl.setopt(crl.UPLOAD, 1)
crl.setopt(crl.READDATA, dat_file)

crl.perform()
crl.close()
dat_file.close()

Если данные файла находятся в буфере, реализация PycURL практически такая же, как и при загрузке данных, расположенных в физическом файле, с небольшими изменениями. Объект BytesIO кодирует данные с использованием указанного стандарта. Это происходит потому, что READ DATA требует IO-подобного объекта, а закодированные данные необходимы для Python 3. Эти закодированные данные хранятся в буфере, а затем считываются. Загрузка данных выполняется, и по завершении загрузки сеанс cURL завершается.

import pycurl
crl = pycurl.Curl()
crl.setopt(crl.URL, 'https://www.code-learner.com/post/')

data = '{"person":{"name":"billy","email":"[email protected]"}}'
buffer = BytesIO(data.encode('utf-8'))

crl.setopt(crl.UPLOAD, 1)
crl.setopt(crl.READDATA, buffer)

crl.perform()
crl.close()

Пример 6: Отправка HTTP-запроса на УДАЛЕНИЕ

Другим важным и часто используемым методом HTTP является DELETE. Метод DELETE запрашивает, чтобы сервер удалил ресурс, идентифицированный целевым URL-адресом. Он может быть реализован с помощью функции CUSTOM REQUEST , как видно из приведенного ниже примера кода:

import pycurl

crl = pycurl.Curl()
crl.setopt(crl.URL, "http://api.example.com/user/148951")
crl.setopt(crl.CUSTOMREQUEST, "DELETE")
crl.perform()
crl.close()

Пример 7: Запись в файл

PycURL также можно использовать для сохранения ответа в файл. Мы используем функцию open для открытия файла, и ответ возвращается в виде объекта file. Функция open имеет вид: open(file, mode) . Параметр file представляет путь и имя открываемого файла, а mode – режим, в котором вы хотите открыть файл. В нашем примере важно, чтобы файл был открыт в двоичном режиме (т. е. wb ), чтобы избежать кодирования и декодирования ответа.

import pycurl

file = open('pycurl.md','wb')

crl = pycurl.Curl()
crl.setopt(crl.URL, 'https://wiki.python.org/moin/BeginnersGuide')
crl.setopt(crl.WRITEDATA, file)
crl.perform()
crl.close()

Вывод

В этом уроке мы узнали об интерфейсе PycURL в Python. Мы начали с обсуждения некоторых общих функций PycURL и их связи с библиотекой libcURL в Python. Затем мы увидели процесс установки Pycurl для различных операционных систем.

Наконец, мы рассмотрели некоторые общие примеры Pycurl, которые демонстрировали различные функциональные возможности, предлагаемые PycURL, такие как методы HTTP GET, POST, PUT и DELETE. После выполнения этого руководства вы сможете легко извлекать объекты, идентифицированные по URL-адресу в программе Python.