Як використовувати Python cURL?

Curl – це інструмент командного рядка, що функціонує як HTTP-клієнт. Він отримав широке розповсюдження для здійснення HTTP-запитів безпосередньо з командного інтерфейсу. Curl дозволяє автоматизувати процеси веб-скрепінгу, виконувати моніторинг працездатності веб-сайтів та завантажувати файли, використовуючи командний рядок.

Його відрізняє простота використання та підтримка багатьма мовами програмування. У цій статті ми розглянемо, що таке cURL та як його можна застосовувати в Python.

Що являє собою cURL?

Згідно з офіційним веб-сайтом, cURL є абревіатурою від “Client URL”. Це утиліта командного рядка, а також бібліотека, призначена для передачі даних з використанням різноманітних мережевих протоколів, таких як HTTP, HTTPS, FTP та IMAP.

Він є надзвичайно популярним та використовується в понад 10 мільярдах інсталяцій на різноманітних пристроях, включаючи радіо, телевізори, маршрутизатори, принтери та комп’ютери. cURL є абсолютно безкоштовним програмним забезпеченням з відкритим вихідним кодом, доступним на GitHub.

Сфери застосування cURL

cURL є надзвичайно корисним та універсальним інструментом. Нижче перелічено найпоширеніші випадки його використання. Варто зазначити, що це не повний список, а лише деякі з найпопулярніших застосувань:

  • Тестування API: cURL дозволяє перевірити коректність роботи API, аналізуючи відповіді на певні запити. Крім того, можна виміряти швидкість відповіді API. За допомогою сценаріїв можна автоматизувати перевірку працездатності API та отримувати сповіщення у разі виявлення проблем.
  • Веб-скрепінг: cURL може автоматично видобувати дані з веб-сайтів. Він використовується в поєднанні з різними мовами програмування та як команда Bash. За допомогою cURL можна динамічно отримувати дані з веб-сторінок, аналізувати HTML-код та витягувати необхідну інформацію. Якщо вас цікавить веб-скрепінг, можете розглянути TechUkraine.net Web Scraping API, який полегшує цей процес.
  • Завантаження даних: cURL дозволяє зберігати відповіді на запити у файлах. Ці відповіді можуть бути даними API або файлами із сервера. Фактично, записуючи відповідь у файл, ви завантажуєте файл. Оскільки cURL є інструментом командного рядка, можна автоматизувати процес одночасного завантаження багатьох файлів.

Застосування cURL в Python (PycURL)

Інсталяція PycURL

Для використання cURL в Python застосовується бібліотека PycURL. PycURL – це Python-інтерфейс для бібліотеки cURL, що забезпечує ефективну взаємодію. Це робить PycURL швидшою за інші бібліотеки для створення запитів, такі як urllib та requests. Для початку роботи з PycURL необхідно її встановити. Інструкції щодо встановлення наведені нижче, найпростіший спосіб – через pip.

pip install PycURL

В Ubuntu 22.04 перед встановленням PycURL потрібно інсталювати додаткові інструменти. Використайте наступну команду перед спробою встановити PycURL через pip:

sudo apt install libcurl4-openssl-dev libssl-dev

Створення простого GET-запиту

Для виконання запиту потрібно створити Python-скрипт. Відкрийте файл за допомогою текстового редактора. В прикладі використовується Vim, але ви можете обрати будь-який зручний для вас. Щоб відкрити файл у Vim, скористайтеся наступною командою:

vim pycurl.py

Тут pycurl.py – це ім’я файлу, в який буде записано код, але ви можете надати файлу будь-яку назву.

Далі потрібно імпортувати клас Curl з модуля PycURL:

from pycurl import Curl

Після імпорту PycURL, імпортуємо BytesIO з io. Це необхідно для створення буфера, куди буде записана відповідь PycURL.

from io import BytesIO

Створюємо новий екземпляр Curl:

c = Curl()

Далі створюємо екземпляр BytesIO для створення нового буфера. PycURL не має вбудованого механізму зберігання відповідей, тому необхідно створити буфер і вказати, куди записувати дані:

buffer = BytesIO()

Тепер можна встановити параметри для нашого об’єкта клієнта. В даному випадку потрібно встановити два параметри: URL запиту та місце, куди буде записано тіло відповіді. Код для цього виглядає так:

c.setopt(c.URL, 'http://pycurl.io/')
c.setopt(c.WRITEDATA, buffer)

Після цього можна виконати запит, викликавши метод perform об’єкта клієнта, а потім закрити запит методом close:

c.perform()
c.close()

Щоб отримати відповідь, викликаємо метод getvalue() об’єкта буфера та декодуємо його. Потім виводимо результат на консоль:

body = buffer.getvalue()
print(body.decode('iso-8859-1'))

Ваш файл повинен виглядати так:

from pycurl import Curl
from io import BytesIO

# Create a pycUrl instance
c = Curl()
buffer = BytesIO()

c.setopt(c.URL, 'http://pycurl.io/')
c.setopt(c.WRITEDATA, buffer)

# Make the request
c.perform()

# Close the connection
c.close()

body = buffer.getvalue()
print(body.decode('iso-8859-1'))

Після запуску скрипту, ви отримаєте наступний результат:

Створення POST-запиту

Для виконання POST-запиту необхідно встановити параметри POSTFIELDS об’єкта клієнта cURL. Наприклад, нижче представлено запит POST до JSON Placeholder API:

from io import BytesIO
from json import dumps
from pycurl import Curl

# Create a pycUrl instance
c = Curl()
buffer = BytesIO()

# Create a data dictionary
data = {
    'userId': 1,
    'title': 'Lorem Ipsum',
    'body': 'Dolor sit amet'
}

# Encode the data to json
encoded_data = dumps(data)

# Set request options
c.setopt(c.URL, 'https://jsonplaceholder.typicode.com/posts')
c.setopt(c.HTTPHEADER, ['Accept: application/json', 'Content-Type: application/json'])
c.setopt(c.POSTFIELDS, encoded_data)
c.setopt(c.WRITEDATA, buffer)

# Make the request
c.perform()

# Close the connection
c.close()

body = buffer.getvalue()
print(body.decode('iso-8859-1'))

У наведеному коді створено словник з даними, які відправляються в запиті. Дані закодовано в JSON та відправлено як корисне навантаження, встановлюючи параметр POSTFIELDS. Також вказані заголовки для визначення типу контенту запиту та прийнятного типу даних відповіді. Після запуску коду, ви отримаєте наступну відповідь:

Запис відповідей у файли

Ви також можете передати файловий буфер параметру cURL WRITEDATA, що дозволить записати дані відповіді у файл. Наступний приклад ілюструє цю концепцію:

from pycurl import Curl

file_name="output.json"

# Opening the file in write mode
with open(file_name, 'wb') as f:
    
    # Creating a Curl instance
    c = Curl()

    # Set request options
    c.setopt(c.URL, 'https://jsonplaceholder.typicode.com/users/1')
    c.setopt(c.HTTPHEADER, ['Accept: application/json'])
    c.setopt(c.WRITEDATA, f)

    # Make the request
    c.perform()

    # Close the connection
    c.close()

    print(f'Wrote output to {file_name}')

Альтернативи PycURL

PycURL є лише тонкою обгорткою над бібліотекою cURL, що дозволяє гнучко налаштовувати його параметри, маючи більший контроль над функціями нижчого рівня.

Проте, це ускладнює його використання, тому він більше підходить для досвідчених розробників. Часто потрібні простіші альтернативи PycURL. У цьому розділі ми розглянемо деякі з них.

#1. Інші бібліотеки

Крім PycURL, Python має інші бібліотеки для створення запитів, такі як requests та urllib, які є популярними альтернативами.

#2. Інші мови

cURL має інтерфейси, реалізовані іншими мовами. Curl Converter – це зручний інструмент для конвертації команд cURL. За його допомогою ви вводите команду cURL для потрібного запиту, а він автоматично перетворює її на код вибраною мовою програмування. Також можна безпосередньо використовувати команду cURL в терміналі або написати Bash-скрипт.

Висновок

У цій статті було представлено cURL та пояснено, як використовувати його в Python за допомогою модуля PycURL. Також розглянуто альтернативи PycURL, такі як модуль requests, а також можливість використання інших мов для ваших застосувань.

Радимо далі ознайомитися з використанням команди cURL на прикладах з реального життя.