Руководство по использованию 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 комментариев