Керівництво з використання cURL у Python

Коментарі: 0

У Python існують бібліотеки для надсилання HTTPS-запитів і виконання скрапінгу, однак використання cURL через PycURL дає змогу робити це ефективніше. У цьому посібнику ми покажемо, як застосовувати Python cURL для скрапінгу веб-сторінок на прикладах і проведемо порівняльний аналіз з іншими популярними бібліотеками, такими як Requests, HTTPX і AIOHTTP.

Початок роботи з cURL і Python

Команди cURL можна використовувати безпосередньо в терміналі для виконання різних завдань, включно з надсиланням GET і POST запитів.

Приклади команд cURL:

# GET запит
curl -X GET "https://httpbin.org/get"

# POST запит
curl -X POST "https://httpbin.org/post"

1.png

2.png

Встановлення необхідних бібліотек

Для використання cURL у Python нам потрібна бібліотека "pycurl", яка надає інтерфейс Python до бібліотеки cURL.

Встановлення PycURL:

pip install pycurl

Виконання HTTP-запитів за допомогою PycURL

PycURL дає змогу керувати HTTP-запитами в Python. Нижче наведено приклад, що демонструє, як зробити GET-запит з використанням PycURL:

import pycurl
import certifi
from io import BytesIO

# Створюємо об'єкт BytesIO для зберігання даних відповіді
buffer = BytesIO()

# Ініціалізуємо об'єкт cURL
c = pycurl.Curl()

# Встановлюємо URL для HTTP GET-запиту
c.setopt(c.URL, 'https://httpbin.org/get')

# Встановлюємо буфер для збереження вихідних даних
c.setopt(c.WRITEDATA, buffer)

# Встановлюємо шлях до файлу пакета CA для перевірки SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Виконуємо HTTP-запит
c.perform()

# Закриваємо об'єкт cURL для звільнення ресурсів
c.close()

# Отримуємо вміст відповіді з буфера
body = buffer.getvalue()

# Декодуємо і виводимо відповідь
print(body.decode('iso-8859-1'))

Обробка POST-запитів

У PycURL використовуйте опцію POSTFIELDS. Приклад виконання POST-запиту з використанням PycURL:

import pycurl
import certifi
from io import BytesIO

# Створюємо об'єкт BytesIO для зберігання даних відповіді
buffer = BytesIO()

# Ініціалізуємо об'єкт cURL
c = pycurl.Curl()

# Встановлюємо URL для HTTP POST-запиту
c.setopt(c.URL, 'https://httpbin.org/post')

# Встановлюємо дані для відправлення
post_data = 'param1="pycurl"¶m2=article'
c.setopt(c.POSTFIELDS, post_data)

# Встановлюємо буфер для збереження вихідних даних
c.setopt(c.WRITEDATA, buffer)

# Встановлюємо шлях до файлу пакета CA для перевірки SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Виконуємо HTTP-запит
c.perform()

# Закриваємо об'єкт cURL для звільнення ресурсів
c.close()

# Отримуємо вміст відповіді з буфера
body = buffer.getvalue()

# Декодуємо і виводимо відповідь
print(body.decode('iso-8859-1'))

Обробка кастомних HTTP-заголовків

Часто потрібне встановлення користувацьких заголовків або аутентифікація для HTTP-запитів. Нижче наведено приклад встановлення користувацьких заголовків за допомогою PycURL:

import pycurl
import certifi
from io import BytesIO

# Створюємо об'єкт BytesIO для зберігання даних відповіді
buffer = BytesIO()

# Ініціалізуємо об'єкт cURL
c = pycurl.Curl()

# Встановлюємо URL для HTTP GET-запиту
c.setopt(c.URL, 'https://httpbin.org/get')

# Встановлюємо кастомні HTTP-заголовки
c.setopt(c.HTTPHEADER, ['User-Agent: MyApp', 'Accept: application/json'])

# Встановлюємо буфер для збереження вихідних даних
c.setopt(c.WRITEDATA, buffer)

# Встановлюємо шлях до файлу пакета CA для перевірки SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Виконуємо HTTP-запит
c.perform()

# Закриваємо об'єкт cURL для звільнення ресурсів
c.close()

# Отримуємо вміст відповіді з буфера
body = buffer.getvalue()

# Декодуємо і виводимо відповідь
print(body.decode('iso-8859-1'))

Обробка XML-відповідей

Аналіз і обробка XML-відповідей вкрай важливі під час роботи з API. Нижче наведено приклад обробки XML-відповідей з використанням PycURL:

# Імпортуємо необхідні бібліотеки
import pycurl  # Бібліотека для виконання HTTP-запитів
import certifi  # Бібліотека для перевірки SSL-сертифікатів
from io import BytesIO  # Бібліотека для роботи з потоками байтів
import xml.etree.ElementTree as ET  # Бібліотека для парсингу XML

# Створюємо буфер для зберігання даних відповіді
buffer = BytesIO()

# Ініціалізуємо об'єкт cURL
c = pycurl.Curl()

# Встановлюємо URL для HTTP GET-запиту
c.setopt(c.URL, 'https://www.google.com/sitemap.xml')

# Встановлюємо буфер для збереження вихідних даних
c.setopt(c.WRITEDATA, buffer)

# Встановлюємо шлях до файлу пакета CA для перевірки SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Виконуємо HTTP-запит
c.perform()

# Закриваємо об'єкт cURL для звільнення ресурсів
c.close()

# Отримуємо вміст відповіді з буфера
body = buffer.getvalue()

# Парсимо XML-вміст в об'єкт ElementTree
root = ET.fromstring(body.decode('utf-8'))

# Виводимо тег і атрибути кореневого елемента XML-дерева
print(root.tag, root.attrib)

Обробка HTTP-помилок

Якісна обробка та усунення помилок необхідні для виконання HTTP-запитів. Нижче наведено приклад оброблення помилок із використанням PycURL:

import pycurl  # Імпортуємо бібліотеку pycurl
import certifi  # Імпортуємо бібліотеку certifi
from io import BytesIO  # Імпортуємо BytesIO для обробки потоків байтів

# Ініціалізуємо об'єкт Curl
c = pycurl.Curl()

buffer = BytesIO()
# Встановлюємо URL для HTTP-запиту
c.setopt(c.URL, 'http://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # Виконуємо HTTP-запит
    c.perform()
except pycurl.error as e:
    # У разі помилки під час запиту перехоплюємо виняток pycurl.error
    errno, errstr = e.args  # Отримуємо номер помилки та повідомлення про помилку
    print(f'Error: {errstr} (errno {errno})')  # Виводимо повідомлення про помилку та номер помилки
finally:
    # Закриваємо об'єкт Curl для звільнення ресурсів
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # Декодуємо і виводимо відповідь

3.png

Виправлений код коригує URL до "https://example.com", усуваючи проблеми з протоколом. Процес налаштування запиту, його виконання та обробки помилок залишається таким самим, як у вихідному коді. При успішному отриманні відповіді, "body" знову декодується і виводиться.

import pycurl  # Імпортуємо бібліотеку pycurl
import certifi  # Імпортуємо бібліотеку certifi
from io import BytesIO  # Імпортуємо BytesIO для обробки потоків байтів

# Повторно ініціалізуємо об'єкт Curl
c = pycurl.Curl()

buffer = BytesIO()
# Коригуємо URL для використання HTTPS
c.setopt(c.URL, 'https://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # Виконуємо виправлений HTTP-запит
    c.perform()
except pycurl.error as e:
    # У разі помилки під час запиту перехоплюємо виняток pycurl.error
    errno, errstr = e.args  # Отримуємо номер помилки та повідомлення про помилку
    print(f'Error: {errstr} (errno {errno})')  # Виводимо повідомлення про помилку та номер помилки
finally:
    # Закриваємо об'єкт Curl для звільнення ресурсів
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # Декодуємо і виводимо відповідь

Розширені можливості cURL

cURL надає безліч розширених опцій для контролю HTTP-запитів, як-от керування кукі й таймаутами. Нижче наведено приклад, що демонструє розширені опції з використанням PycURL.

import pycurl  # Імпортуємо бібліотеку pycurl
import certifi  # Імпортуємо бібліотеку certifi для перевірки SSL-сертифікатів
from io import BytesIO  # Імпортуємо BytesIO для обробки потоків байтів

# Створюємо буфер для зберігання даних відповіді
buffer = BytesIO()

# Ініціалізуємо об'єкт Curl
c = pycurl.Curl()

# Встановлюємо URL для HTTP-запиту
c.setopt(c.URL, 'http://httpbin.org/cookies')

# Вмикаємо кукі, встановивши певну пару ключ-значення
c.setopt(c.COOKIE, 'cookies_key=cookie_value')

# Встановлюємо таймаут запиту в 30 секунд
c.setopt(c.TIMEOUT, 30)

# Встановлюємо буфер для збереження вихідних даних
c.setopt(c.WRITEDATA, buffer)

# Встановлюємо шлях до файлу пакета CA для перевірки SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Виконуємо HTTP-запит
c.perform()

# Закриваємо об'єкт Curl для звільнення ресурсів
c.close()

# Отримуємо вміст відповіді з буфера
body = buffer.getvalue()

# Декодуємо відповідь з використанням кодування UTF-8 і виводимо її
print(body.decode('utf-8'))

Порівняння PycURL, Requests, HTTPX і AIOHTTP

Під час роботи з HTTP-запитами в Python виокремлюються чотири популярні бібліотеки: PycURL, Requests, HTTPX і AIOHTTP. У кожної з них є свої переваги та недоліки. Ось порівняльний аналіз для визначення найбільш підходящого інструменту:

Бібліотека PycURL Requests HTTPX AIOHTTP
Простота використання Помірна Дуже просто Просто Помірна
Продуктивність Висока Помірна Висока Висока
Підтримка асинхронності Ні Ні Так Так
Стрімінг Так Обмежений Так Так
Підтримка протоколів Широка (підтримує безліч протоколів) HTTP/HTTPS HTTP/HTTPS, HTTP/2, WebSockets HTTP/HTTPS, WebSockets

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

Вибір відповідної бібліотеки залежить від конкретних завдань і вимог вашого проекту. PycURL стане чудовим вибором для тих, хто потребує високої швидкості та розширених можливостей керування HTTP-запитами.

Коментарії:

0 Коментаріїв