es
English
中國人
Tiếng Việt
Deutsch
Українська
Português
Français
भारतीय
Türkçe
한국인
Italiano
Gaeilge
اردو
Indonesia
Polski El web scraping consiste en extraer datos de sitios web para su análisis, investigación o automatización. En este tutorial de Python sobre cURL, aprenderás a realizar peticiones web utilizando PycURL con ejemplos prácticos. También mostraremos cómo convertir una petición curl típica a Python y compararla con librerías como Requests, HTTPX y AIOHTTP.
Entender este concepto es crucial para la integración con Python, así que empecemos por lo básico. Puedes usar comandos cURL de Python directamente en la terminal para realizar tareas como hacer 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"
Para utilizar cURL, instale la biblioteca Python PycURL.
Instalando:
pip install pycurl
Usar curl en Python ofrece un control detallado sobre las peticiones HTTP. A continuación se muestra un ejemplo de cómo realizar 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'))
Enviar datos con POST - curl a peticiones Python - es común. Con la librería, usa la opción POSTFIELDS. Aquí hay un ejemplo de 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'))
A menudo, las solicitudes HTTP requieren cabeceras personalizadas o autenticación. Gestión de cabeceras personalizadas: Las peticiones HTTP a menudo requieren tokens de autenticación o cabeceras personalizadas. El manejo de cabeceras personalizadas se puede hacer de manera eficiente cuando se sabe cómo utilizar las técnicas de Python curl json parse:
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'))
Manejo de respuestas XML Mientras se trabaja con el análisis sintáctico de XML y se trata con varias APIs, es esencial manejar las respuestas XML. 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)
El manejo de errores en peticiones HTTP es un aspecto importante del trabajo con integraciones externas. Aquí hay un ejemplo de manejo de errores usando 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
El código corregido ajusta la URL a https://example.com, resolviendo el problema del protocolo. A continuación, el autor repite los mismos pasos de configuración de la solicitud, ejecución y gestión de errores que en el primer fragmento. Una vez ejecutada con éxito, el cuerpo de la respuesta se decodifica e imprime de nuevo. Esto enfatiza la importancia de construir URLs correctamente, mantener un flujo de peticiones adecuado y, sobre todo, implementar un manejo de errores robusto cuando se realizan 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
Cuando se trabaja con conversiones cURL request Python, es útil saber que cURL ofrece muchas opciones avanzadas para controlar el comportamiento HTTP, como el manejo de cookies y timeouts. A continuación se muestra un ejemplo que demuestra las opciones avanzadas para ejecutar comandos curl en Python.
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'))
Cuatro bibliotecas son populares cuando se trabaja en Python con peticiones HTTP: PyCurl, Requests, HTTPX, y AIOHTTP. Cada una tiene sus puntos fuertes y débiles. He aquí una comparación para ayudarle a elegir la herramienta adecuada para sus necesidades:
| Característica | PycURL | Solicitudes | HTTPX | AIOHTTP |
|---|---|---|---|---|
| Facilidad de uso | Moderado | Muy fácil | Fácil | Moderado |
| Rendimiento | Alta | Moderado | Alta | Alta |
| Soporte asíncrono | No | No | Sí | Sí |
| Streaming | Sí | Limitado | Sí | Sí |
| Soporte de protocolos | Amplio (admite muchos protocolos) | HTTP/HTTPS | HTTP/HTTPS, HTTP/2, WebSockets | HTTP/HTTPS, WebSockets |
Los usuarios avanzados apreciarán los controles personalizados que ofrecen los comandos HTTP; encontrarán que PycURL supera las expectativas en rendimiento. Por otro lado, Requests y HTTPX son más adecuados para 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.
Como puede ver, su elección puede variar en función del alcance del proyecto: flexibilidad frente a velocidad. En contextos avanzados, PycURL destaca como la opción preferida, si no la única.
Si el rendimiento y el control de bajo nivel son sus prioridades a la hora de realizar peticiones HTTP, PycURL es una opción sólida. Aprender a usar cURL en Python puede no ser el camino más fácil para los principiantes, pero desbloquea potentes capacidades que las bibliotecas más abstractas a menudo ocultan. Desde el web scraping y el manejo de XML hasta la gestión de cabeceras y cookies personalizadas, PycURL lo maneja todo con precisión. Sin embargo, para tareas más simples, flujos de trabajo asíncronos o facilidad de uso, bibliotecas como Requests, HTTPX y AIOHTTP pueden ser más apropiadas.
Comentarios: 0