Guía de uso de cURL con Python

Comentarios: 0

El web scraping consiste en extraer datos de sitios web para tareas como el análisis de datos, la investigación y la automatización. Aunque Python ofrece librerías para enviar peticiones HTTPS y realizar scraping, usar cURL a través de PycURL puede ser más eficiente. En este tutorial, demostraremos cómo utilizar Python cURL para scrapear páginas web. Proporcionaremos ejemplos y compararemos su rendimiento con otras librerías populares como Requests, HTTPX y AIOHTTP.

Introducción a cURL y Python

Antes de sumergirse en la integración de Python, es esencial entender los fundamentos de cURL. Puedes utilizar comandos cURL directamente en el terminal para realizar tareas como peticiones GET y POST.

Ejemplo de comandos cURL:

# Solicitud GET
curl -X GET "https://httpbin.org/get"

# Solicitud POST
curl -X POST "https://httpbin.org/post"

1.png

2.png

Instalación de las bibliotecas necesarias

Para utilizar cURL en Python, necesitamos la biblioteca pycurl, que proporciona una interfaz de Python a la biblioteca cURL.

Instalación de PycURL:

pip install pycurl

Realizar peticiones HTTP con PycURL

PycURL ofrece un control detallado sobre las peticiones HTTP en Python. A continuación se muestra un ejemplo que demuestra cómo hacer una petición GET con PycURL:

import pycurl
import certifi
from io import BytesIO

# Crear un objeto BytesIO para contener los datos de respuesta
buffer = BytesIO()

# Inicializar un objeto cURL
c = pycurl.Curl()

# Establezca la URL para la solicitud HTTP GET
c.setopt(c.URL, 'https://httpbin.org/get')

# Configurar el búfer para capturar los datos de salida
c.setopt(c.WRITEDATA, buffer)

# Establezca la ruta del archivo CA bundle para la verificación SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Realizar la solicitud HTTP
c.perform()

# Cerrar el objeto cURL para liberar recursos
c.close()

# Recuperar el contenido de la respuesta del búfer
body = buffer.getvalue()

# Decodificar e imprimir el cuerpo de la respuesta
print(body.decode('iso-8859-1'))

Gestión de solicitudes POST

El envío de datos con peticiones POST es habitual. Con PycURL, utilice la opción POSTFIELDS. Aquí tienes un ejemplo de cómo hacer una petición POST con PycURL:

import pycurl
import certifi
from io import BytesIO

# Crear un objeto BytesIO para contener los datos de respuesta
buffer = BytesIO()

# Inicializar un objeto cURL
c = pycurl.Curl()

# Establecer la URL para la solicitud HTTP POST
c.setopt(c.URL, 'https://httpbin.org/post')

# Establecer los datos a contabilizar
post_data = 'param1="pycurl"¶m2=article'
c.setopt(c.POSTFIELDS, post_data)

# Configurar el búfer para capturar los datos de salida
c.setopt(c.WRITEDATA, buffer)

# Establezca la ruta del archivo CA bundle para la verificación SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Realizar la solicitud HTTP
c.perform()

# Cerrar el objeto cURL para liberar recursos
c.close()

# Recuperar el contenido de la respuesta del búfer
body = buffer.getvalue()

# Decodificar e imprimir el cuerpo de la respuesta
print(body.decode('iso-8859-1'))

Gestión de cabeceras HTTP personalizadas

A menudo se requieren cabeceras personalizadas o autenticación con peticiones HTTP. A continuación se muestra un ejemplo de configuración de cabeceras personalizadas con PycURL:

import pycurl
import certifi
from io import BytesIO

# Crear un objeto BytesIO para contener los datos de respuesta
buffer = BytesIO()

# Inicializar un objeto cURL
c = pycurl.Curl()

# Establezca la URL para la solicitud HTTP GET
c.setopt(c.URL, 'https://httpbin.org/get')

# Establecer cabeceras HTTP personalizadas
c.setopt(c.HTTPHEADER, ['User-Agent: MyApp', 'Accept: application/json'])

# Configurar el búfer para capturar los datos de salida
c.setopt(c.WRITEDATA, buffer)

# Establezca la ruta del archivo CA bundle para la verificación SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Realizar la solicitud HTTP
c.perform()

# Cerrar el objeto cURL para liberar recursos
c.close()

# Recuperar el contenido de la respuesta del búfer
body = buffer.getvalue()

# Decodificar e imprimir el cuerpo de la respuesta
print(body.decode('iso-8859-1'))

Tratamiento de respuestas XML

Parsear y manejar respuestas XML es crucial cuando se trabaja con APIs. A continuación se muestra un ejemplo de manejo de respuestas XML con PycURL:

# Importar las bibliotecas necesarias
import pycurl  # Biblioteca para realizar peticiones HTTP
import certifi  # Biblioteca para la verificación de certificados SSL
from io import BytesIO  # Biblioteca para el tratamiento de flujos de bytes
import xml.etree.ElementTree as ET  # Biblioteca para el análisis sintáctico de XML

# Crear un búfer para contener los datos de respuesta
buffer = BytesIO()

# Inicializar un objeto cURL
c = pycurl.Curl()

# Establezca la URL para la solicitud HTTP GET
c.setopt(c.URL, 'https://www.google.com/sitemap.xml')

# Configurar el búfer para capturar los datos de salida
c.setopt(c.WRITEDATA, buffer)

# Establezca la ruta del archivo CA bundle para la verificación SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Realizar la solicitud HTTP
c.perform()

# Cerrar el objeto cURL para liberar recursos
c.close()

# Recuperar el contenido de la respuesta del búfer
body = buffer.getvalue()

# Parsear el contenido XML en un objeto ElementTree
root = ET.fromstring(body.decode('utf-8'))

# Imprime la etiqueta y los atributos del elemento raíz del árbol XML
print(root.tag, root.attrib)

Gestión de errores HTTP

Un manejo de errores robusto es esencial para realizar peticiones HTTP fiables. A continuación se muestra un ejemplo de gestión de errores con PycURL:

import pycurl  # Importar la biblioteca pycurl
import certifi  # Importar la biblioteca certifi
from io import BytesIO  # Importar BytesIO para gestionar flujos de bytes

# Inicializar un objeto Curl
c = pycurl.Curl()

buffer = BytesIO()
# Establecer la URL para la solicitud HTTP
c.setopt(c.URL, 'http://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # Realizar la solicitud HTTP
    c.perform()
except pycurl.error as e:
    # Si se produce un error durante la solicitud, captura la excepción pycurl.error
    errno, errstr = e.args  # Recuperar el número de error y el mensaje de error
    print(f'Error: {errstr} (errno {errno})')  # Imprimir el mensaje de error y el número de error
finally:
    # Cerrar el objeto Curl para liberar recursos
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # Decodifica e imprime el cuerpo de la respuesta

3.png

El código corregido ajusta la URL a https://example.com, resolviendo el problema del protocolo. Repite el proceso de configurar la petición, ejecutarla y gestionar los errores como en el fragmento inicial. Una vez ejecutado con éxito, el cuerpo de la respuesta se descodifica e imprime de nuevo. Estos fragmentos ponen de manifiesto la importancia de una configuración de URL adecuada y una gestión de errores robusta en las peticiones HTTP con pycurl.

import pycurl  # Importar la biblioteca pycurl
import certifi  # Importar la biblioteca certifi
from io import BytesIO  # Importar BytesIO para gestionar flujos de bytes

# Reiniciar el objeto Curl
c = pycurl.Curl()

buffer = BytesIO()
# Corregir la URL para utilizar HTTPS
c.setopt(c.URL, 'https://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # Realizar la petición HTTP corregida
    c.perform()
except pycurl.error as e:
    # Si se produce un error durante la solicitud, captura la excepción pycurl.error
    errno, errstr = e.args  # Recuperar el número de error y el mensaje de error
    print(f'Error: {errstr} (errno {errno})')  # Imprimir el mensaje de error y el número de error
finally:
    # Cerrar el objeto Curl para liberar recursos
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # Decodifica e imprime el cuerpo de la respuesta

Características avanzadas de cURL

cURL proporciona muchas opciones avanzadas para controlar el comportamiento de las peticiones HTTP, como el manejo de cookies y tiempos de espera. A continuación se muestra un ejemplo que demuestra las opciones avanzadas con PycURL.

import pycurl  # Importar la biblioteca pycurl
import certifi  # Importar la biblioteca certifi para la verificación de certificados SSL
from io import BytesIO  # Importar BytesIO para gestionar flujos de bytes

# Crear un búfer para contener los datos de respuesta
buffer = BytesIO()

# Inicializar un objeto Curl
c = pycurl.Curl()

# Establecer la URL para la solicitud HTTP
c.setopt(c.URL, 'http://httpbin.org/cookies')

# Habilitar cookies estableciendo un par clave-valor específico
c.setopt(c.COOKIE, 'cookies_key=cookie_value')

# Establecer un tiempo de espera de 30 segundos para la solicitud
c.setopt(c.TIMEOUT, 30)

# Configurar el búfer para capturar los datos de salida
c.setopt(c.WRITEDATA, buffer)

# Establezca la ruta del archivo CA bundle para la verificación SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Realizar la solicitud HTTP
c.perform()

# Cerrar el objeto Curl para liberar recursos
c.close()

# Recuperar el contenido de la respuesta del búfer
body = buffer.getvalue()

# Decodifica el cuerpo de la respuesta utilizando la codificación UTF-8 e imprímelo
print(body.decode('utf-8'))

Comparación de PycURL, Requests, HTTPX y AIOHTTP

Cuando se trabaja con peticiones HTTP en Python, cuatro librerías populares son PycURL, Requests, HTTPX, y AIOHTTP. Cada una tiene sus puntos fuertes y débiles. He aquí una comparación para ayudarte a elegir la herramienta adecuada para tus necesidades:

Característica PycURL Requests HTTPX AIOHTTP
Facilidad de uso Moderado Muy fácil Fácil Moderado
Rendimiento Alta Moderado Alta Alta
Soporte asíncrono No No
Streaming Limitado
Soporte de protocolos Amplio (admite muchos protocolos) HTTP/HTTPS HTTP/HTTPS, HTTP/2, WebSockets HTTP/HTTPS, WebSockets

El análisis comparativo indica que PycURL ofrece un alto rendimiento y flexibilidad, lo que lo hace adecuado para usuarios avanzados que requieren una gestión detallada de las peticiones HTTP. Por otro lado, Requests y HTTPX se adaptan mejor a escenarios más sencillos e intuitivos. AIOHTTP destaca en el manejo de tareas asíncronas, proporcionando herramientas eficaces para la gestión de peticiones asíncronas.

La elección de la biblioteca adecuada depende de las necesidades y requisitos específicos de su proyecto, siendo PycURL una excelente opción para quienes necesitan velocidad y capacidades avanzadas.

Comentarios:

0 Comentarios