Curl es una utilidad de línea de comandos utilizada como cliente HTTP. Es muy popular para hacer peticiones HTTP desde la línea de comandos. cURL puede utilizarse para escribir scripts para web scraping, comprobar la salud de un sitio y descargar archivos desde la línea de comandos.
Es increíblemente sencillo y puede utilizarse en muchos lenguajes de programación. Este artículo explica qué es cURL y cómo usarlo en Python.
¿Qué es cURL?
Según la sitio webcURL son las siglas de "client URL". Es una herramienta de línea de comandos y una biblioteca para transferir datos utilizando diferentes protocolos de red de capa de aplicación como HTTP, HTTPS, FTP e IMAP.
Es increíblemente popular y se utiliza en más de 10.000 millones de instalaciones en dispositivos como radios y televisores, routerscURL es totalmente gratuito y de código abierto. Su código fuente está disponible en GitHub.
Casos de uso de cURL
cURL es muy útil y versátil. A continuación se enumeran los casos de uso más populares de cURL. Aunque la lista no es exhaustiva, los siguientes son sólo algunos de los casos más populares:
- Pruebas de API: Puede comprobar si la API funciona correctamente, devolviendo los datos correctos para una solicitud determinada. Además, también se puede utilizar para comprobar la velocidad de la API, es decir, la rapidez con la que responde a las solicitudes. Puede escribir un script para comprobar la salud de la API periódicamente y enviar alertas cuando algo vaya mal.
- Raspado web: También puede extraer datos automáticamente de sitios web. cURL puede utilizarse junto con muchos lenguajes de programación y como comando Bash. Con cURL, puede obtener datos de sitios web de forma dinámica. A partir de la respuesta HTMLpodrás analizar y extraer los datos que necesites. Si está interesado en el web scraping, puede consultar la página API de raspado web de Geekflare que facilita el raspado de datos.
- Descarga de datos: Con cURL, puede guardar la respuesta de las peticiones en un archivo. Estas respuestas pueden ser datos de peticiones API o archivos de un servidor. Efectivamente, al escribir la respuesta en un archivo, has descargado el archivo. Como cURL es una herramienta de línea de comandos, puedes automatizar este proceso para descargar muchos archivos a la vez.
Cómo utilizar cURL en Python (PycURL)
Instalación de PycURL
Para utilizar cURL en Python, utilizamos la biblioteca PycURL. PycURL es una interfaz de Python para la biblioteca cURL. Crea una fina envoltura sobre la ya rápida librería cURL. Esto hace que PycURL sea más rápida que otras librerías para hacer peticiones como urllib y requests. Para usar PycURL, primero tienes que instalarlo. Hay instrucciones detalladas aquí, pero una forma fácil de instalarlo es usando pip.
pip install PycURL
En Ubuntu 22.04, tuve que instalar herramientas adicionales antes de instalar PycURL. Utilice este comando antes de intentar instalar PycURL con pip:
sudo apt install libcurl4-openssl-dev libssl-dev
Realizar una solicitud GET sencilla
Para realizar una solicitud, comience por crear un script Python en el que escribir el código. Abra el archivo con un editor de texto. Yo voy a usar Vim, pero puedes usar el que quieras. Para abrir el archivo con Vim, utilice el comando que se indica a continuación:
vim pycurl.py
Toma, pycurl.py
es el nombre del archivo en el que voy a escribir mi código, pero puedes nombrar tu archivo como quieras.
A continuación, importamos la clase cURL del módulo PycURL
from pycurl import Curl
Después de importar PycURL, importamos BytesIO de io. Necesitaremos esto para crear un buffer para escribir la respuesta de PycURL.
from io import BytesIO
A continuación, instanciamos una nueva instancia de Curl.
c = Curl()
A continuación, instanciamos BytesIO para crear un nuevo buffer. PycURL no tiene un mecanismo de almacenamiento integrado para guardar las respuestas. Así que tenemos que crear un buffer y decirle dónde escribir los datos.
buffer = BytesIO()
Con el buffer creado, podemos establecer opciones en nuestro objeto cliente. En este caso, queremos establecer dos opciones; la primera es la URL que solicitamos. La segunda es donde queremos escribir el cuerpo de la respuesta. Aquí está el código para hacerlo:
c.setopt(c.URL, 'http://pycurl.io/')
c.setopt(c.WRITEDATA, buffer)
Una vez hecho esto, podemos realizar la petición llamando al método perform del objeto cliente y luego cerrar la petición llamando al método close.
c.perform()
c.close()
Para obtener la respuesta, llamamos a la función getvalue()
del objeto buffer y decodificarlo. A continuación, podemos imprimirlo en la consola.
body = buffer.getvalue()
print(body.decode('iso-8859-1'))
Tu archivo debería tener este aspecto:
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'))
Después de ejecutar el script, debería obtener la siguiente salida:

Realizar una solicitud POST
Para realizar una solicitud POST, tendrá que establecer el parámetro POSTFIELDS
del objeto cliente cURL. Por ejemplo, aquí se muestra una solicitud que realiza una petición POST a la API de marcador de posición JSON.
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'))
En el código anterior, he creado un objeto diccionario con los datos que voy a enviar como parte de la petición. A continuación, codifiqué los datos en JSON y los envié adjuntos como carga útil a la solicitud estableciendo la opción POSTFIELDS en los datos codificados. También especifiqué cabeceras para especificar el tipo de contenido de la petición y el tipo de datos de la respuesta aceptada. Cuando ejecutes el código, deberías obtener una respuesta como esta.

Redacción de respuestas a expedientes
También puede pasar un búfer de archivo a la opción WRITEDATA de cURL. Esto escribirá los datos de respuesta en el archivo. El siguiente ejemplo ilustra el concepto:
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}')
Alternativas a PycURL
PycURL sólo proporciona una fina capa sobre la librería cURL. Esto hace que sea altamente personalizable ya que tienes más control sobre las características de nivel inferior.
Sin embargo, lo hace más difícil de usar y, por lo tanto, está más dirigido a los desarrolladores avanzados. A menudo, puedes querer una alternativa más simple a PycURL. En esta sección, discutiremos las alternativas.
#1. Otras bibliotecas
Además de PycURL, Python tiene otras librerías que se pueden usar para hacer peticiones. Estas incluyen la librería requests y la librería urllib. Ambas son alternativas populares y más sencillas que pycURL.
#2. Otras lenguas
cURL tiene interfaces implementadas en otros idiomas. Un sitio web popular para convertir sitios web cURL es Conversor de rizos. Con el Conversor cURL, escribes un comando cURL para la petición que quieras hacer, y automáticamente convierte tu comando a cualquier lenguaje de programación elegido. También puedes simplemente llamar al comando cURL directamente en tu terminal o escribir un script Bash.
Palabras finales
En este artículo, presenté cURL y expliqué cómo usarlo en Python usando el módulo PycURL. También discutimos alternativas a PycURL, como el módulo requests y el uso de lenguajes diferentes para tus programas.
A continuación, consulte Uso de comandos cURL con ejemplos en tiempo real.