Curl — це утиліта командного рядка, яка використовується як HTTP-клієнт. Він популярний для виконання HTTP-запитів із командного рядка. cURL можна використовувати для написання сценаріїв для веб-збирання, перевірки працездатності сайту та завантаження файлів із командного рядка.
Він неймовірно простий і може використовуватися багатьма мовами програмування. Ця стаття пояснює, що таке cURL і як його використовувати в Python.
Що таке cURL?
Згідно з веб-сайтом, cURL розшифровується як «URL-адреса клієнта». Це інструмент командного рядка та бібліотека для передачі даних за допомогою різних мережевих протоколів прикладного рівня, таких як HTTP, HTTPS, FTP та IMAP.
Він неймовірно популярний і використовується в понад 10 мільярдах установок на таких пристроях, як радіо, телевізори, маршрутизатори, принтери та комп’ютери. cURL є абсолютно безкоштовним і має відкритий код. Його вихідний код доступний на GitHub.
Випадки використання cURL
cURL дуже корисний і універсальний. Нижче наведено найпопулярніші варіанти використання cURL. Хоча список не є вичерпним, нижче наведено лише деякі з найпопулярніших випадків:
- Тестування API: він може перевіряти, чи правильно працює API, повертаючи правильні дані для певного запиту. Крім того, його також можна використовувати для перевірки швидкості API, тобто того, наскільки швидко він відповідає на запити. Ви можете написати сценарій, щоб періодично перевіряти працездатність API та надсилати сповіщення, коли щось піде не так.
- Web Scraping: він також може автоматично отримувати дані з веб-сайтів. cURL можна використовувати в поєднанні з багатьма мовами програмування та як команду Bash. За допомогою cURL ви можете динамічно отримувати дані з веб-сайтів. З HTML відповіді ви можете аналізувати та витягувати потрібні дані. Якщо ви зацікавлені в веб-збиранні, ви можете перевірити techukraine.net Web Scraping API, який спрощує збирати дані.
- Завантаження даних: за допомогою cURL ви можете зберігати відповіді на запити у файлі. Ці відповіді можуть бути даними із запитів API або файлами з сервера. По суті, написавши відповідь у файл, ви завантажили файл. Оскільки cURL є інструментом командного рядка, ви можете автоматизувати цей процес, щоб завантажувати багато файлів одночасно.
Як використовувати cURL у Python (PycURL)
Встановлення PycURL
Щоб використовувати cURL у Python, ми використовуємо бібліотеку PycURL. PycURL — це інтерфейс Python для бібліотеки cURL. Він створює тонку оболонку над уже швидкою бібліотекою cURL. Це робить PycURL швидшим за інші бібліотеки для створення запитів, таких як urllib і запити. Щоб використовувати 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 має інші бібліотеки, які можна використовувати для створення запитів. До них входять бібліотека запитів і бібліотека urllib. Обидва вони є популярними альтернативами реклами pycURL.
#2. Інші мови
cURL має інтерфейси, реалізовані іншими мовами. Популярним веб-сайтом для конвертації веб-сайтів cURL є Curl Converter. За допомогою конвертера cURL ви пишете команду cURL для запиту, який хочете зробити, і він автоматично перетворює вашу команду на будь-яку вибрану мову програмування. Ви також можете просто викликати команду cURL безпосередньо у своєму терміналі або написати сценарій Bash.
Висновок
У цій статті я представив cURL і пояснив, як використовувати його в Python за допомогою модуля PycURL. Ми також обговорили альтернативи PycURL, такі як модуль запитів і використання різних мов для ваших програм.
Далі перевірте використання команди cURL із прикладами в реальному часі.