Descubra cómo utilizar cURL en Python
Andrei Ogiolan el 12 dic 2022
¿Qué es cURL?
Para llegar al objetivo de este artículo que es aprender a usar cURL en Python, primero necesitamos introducir cURL. Client URL(cURL) es, para abreviar, una línea de comandos fácil de usar diseñada para que los desarrolladores obtengan datos de un servidor.
¿Cómo utilizar cURL?
Como ya he mencionado anteriormente, el uso de cURL es bastante sencillo y puede extraer información con sólo un comando de una línea. Lo primero que hay que hacer es abrir un terminal y escribir curl seguido de un enlace a un sitio web, por ejemplo:
$ curl 'https://www.webscrapingapi.com/'
Enhorabuena, has realizado tu primera petición utilizando cURL. Este sencillo comando solicita información al servidor como lo hace un navegador tradicional y devuelve el HTML de la página. No todos los sitios web te devolverán HTML, hay endpoints que devuelven los datos como un objeto JSON. Mira este ejemplo:
$ curl 'https://jsonplaceholder.typicode.com/todos/1'
Escriba este comando en su terminal y debería obtener esta respuesta:
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
}
La mayoría de las API le devolverán HTML o JSON cuando ejecute comandos cURL contra ellas. Bueno, esto no es todo lo que cURL puede hacer por nosotros. En realidad es una herramienta muy sofisticada. Si quieres aprender más sobre cURL, te recomiendo encarecidamente que eches un vistazo a la documentación de cURL para una mejor comprensión de sus parámetros. Alternativamente puedes ejecutar el siguiente comando:
$ curl --help
Esto le mostrará algunas opciones que puede configurar en cURL:
Usage: curl [options...] <url>
-d, --data <data> HTTP POST data
-f, --fail Fail silently (no output at all) on HTTP errors
-h, --help <category> Get help for commands
-i, --include Include protocol response headers in the output
-o, --output <file> Write to file instead of stdout
-O, --remote-name Write output to a file named as the remote file
-s, --silent Silent mode
-T, --upload-file <file> Transfer local FILE to destination
-u, --user <user:password> Server user and password
-A, --user-agent <name> Send User-Agent <name> to server
-v, --verbose Make the operation more talkative
-V, --version Show version number and quit
This is not the full help, this menu is stripped into categories.
Use "--help category" to get an overview of all categories.
For all options use the manual or "--help all".
Como probablemente puedes ver estas ni siquiera son todas las opciones que puedes configurar en cURL, es un menú dividido en categorías. Usted probablemente adivinado que con el fin de obtener todas las opciones que le gustaría ejecutar:
$ curl --help all
¿Cómo utilizar cURL en Python?
Para este paso, hay 2 requisitos previos. El primero es bastante obvio, debes instalar Python en tu máquina. Puedes hacerlo navegando a la página oficial de Python e instalar la versión adecuada para tu sistema operativo. Asegúrate de que sea una versión nueva, ya que las más antiguas probablemente no incluirán pip, que es necesario para la mayoría de los paquetes que querremos utilizar. A continuación, ejecute el siguiente comando:
$ pip --version
Si la instalación se realiza correctamente, esto debería devolverle la versión de pip que ha instalado.
De lo contrario, lo más probable es que aparezca este mensaje:
"pip" no se considera un comando externo o interno. Un archivo por lotes es un programa para operar.
Es muy importante que tengas pip instalado para poder proceder ya que lo necesitarás para instalar paquetes.
El segundo requisito previo es estar familiarizado con la sintaxis de Python o, al menos, tener un nivel de experiencia de principiante con cualquier otro lenguaje de programación.
¿Por qué utilizar cURL en Python?
Probablemente te estés preguntando: ¿no es suficiente con utilizar cURL desde la línea de comandos? Esto es correcto, pero en el mundo real vamos a querer procesar de alguna manera los datos que estamos recibiendo del servidor y es por eso que necesitamos un lenguaje de programación. Este es el momento en que Python entra en juego.
¿Por qué utilizar Python?
Python es un lenguaje de programación de alto nivel que se utiliza para muchos propósitos y cuya sintaxis y simplicidad hacen que sea muy fácil de aprender para los principiantes. Además, cuenta con una gran comunidad dispuesta a ayudarte, así que si tienes algún problema no dudes en preguntar. StackOverflow es un gran sitio donde puedes hacer preguntas y seguro que alguien se pondrá en contacto contigo.
Cómo integrar cURL en Python
Al igual que antes cURL en Python también es muy sencillo. Recuerda cuando escribimos un comando de una línea para obtener los datos del servidor. La diferencia es que ahora necesitas escribir 2 líneas de código para esta simple llamada, por ejemplo:
import os
os.system(f'curl "https://www.webscrapingapi.com/product/"')
Ahora veamos la verdadera ventaja de usar un lenguaje de programación. Podemos construir una función que pueda tomar una URL personalizada y ejecutar el comando curl contra ella:
import os
def cURL(url):
return os.system(f'curl "{url}"')
cURL('https://www.webscrapingapi.com/blog/')
Puedes sustituir https://www.webscrapingapi.com/blog/ por cualquier otro sitio web del que quieras obtener datos. Enhorabuena, en este punto has creado un script que toma una url , ejecuta el comando cURL y muestra el resultado en la consola. Puedes ejecutar Python directamente en tu terminal, pero para una mejor experiencia de programación te recomiendo encarecidamente que utilices un Entorno de Desarrollo Integrado. Hay muchas opciones que puedes elegir, pero para Python te recomiendo PyCharm que puedes descargar desde aquí
Como ya he mencionado anteriormente cURL no se limita a eso, puede hacer una gran cantidad de cosas aparte de enviar peticiones GET. También puede descargar archivos o enviar POST, PUT o DELETE requests.Here es un ejemplo de una función de Python que envía una solicitud POST a https://httpbin.org/post:
import os
def cURL(method,url,data):
return os.system(f'curl -X "{method}" --url "{url}" --data {data} ')
data = '{"foo":"bar"}'
cURL('POST', 'https://httpbin.org/post', data)
Como probablemente haya visto, el comando es un poco diferente cuando se envía una petición POST. En la petición anterior no tuvo que usar los parámetros -X y -data porque el método por defecto de cURL es GET. Después de ejecutar este comando deberías obtener de la API httpbin una respuesta que contenga tu petición, la dirección IP, los parámetros y el cuerpo que has enviado, que sería algo así.
{
"args": {},
"data": "",
"files": {},
"form": {
"{foo:bar}": ""
},
"headers": {
"Accept": "*/*",
"Content-Length": "9",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "curl/X.XX.X",
"X-Amzn-Trace-Id": "Root=X-XXXXX-XXXXXX"
},
"json": null,
"origin": "0.0.0.0",
"url": "https://httpbin.org/post"
}
En este punto ya has construido una herramienta simple que puede enviar peticiones GET, POST, PUT, PATCH, DELETE etc.. para obtener algunos datos de una API. Ahora podemos establecer la URL, el método y el cuerpo directamente desde nuestro script Python en lugar de escribirlo manualmente. Sin embargo, este es un beneficio menor que tenemos al usar cURL en Python. El mayor beneficio es que ahora podemos procesar los datos de la manera que queramos, incluso si la API no nos da una opción para obtenerlos de la manera que nos gustaría. Por ejemplo, digamos que se nos da una lista de todos los usuarios, pero queremos dividirlos en 2 grupos y obtener los usuarios del segundo grupo.
Podemos hacerlo gracias a Python almacenando la respuesta en una variable llamada users que podemos convertir en un array de objetos JSON usando el método json.loads() del que puedes encontrar más información aquí. Después de eso podemos iterar a través de la matriz de usuarios y mostrar sólo los usuarios en la segunda mitad de la lista o con sus números de identificación mayor que la mitad de la lista. Para una mejor comprensión, así es como se traduce en código:
import subprocess
import json
def cURL(url):
return subprocess.check_output(['curl',url])
users = json.loads(cURL('https://jsonplaceholder.typicode.com/users'))
for user in users:
if(user['id'] > len(users) / 2): print(user)
Probablemente hayas notado que en lugar de os, ahora estamos usando las librerías subprocess y json. Estamos usando la librería subprocess porque queremos ser capaces de guardar la salida del comando, a diferencia del módulo os que simplemente ejecuta el comando sin almacenarlo. El código es una simple petición get a una API que nos devuelve una lista de usuarios bajo la forma de objetos JSON.. La salida debe ser:
{'id': 6, 'name': 'Mrs. Dennis Schulist', 'username': 'Leopoldo_Corkery', 'email': 'Karley_Dach@jasper.info', 'address': {'street': 'Norberto Crossing', 'suite': 'Apt. 950', 'city': 'South Christy', 'zipcode': '23505-1337', 'geo': {'lat': '-71.4197', 'lng': '71.7478'}}, 'phone': '1-477-935-8478 x6430', 'website': 'ola.org', 'company': {'name': 'Considine-Lockman', 'catchPhrase': 'Synchronised bottom-line interface', 'bs': 'e-enable innovative applications'}}
{'id': 7, 'name': 'Kurtis Weissnat', 'username': 'Elwyn.Skiles', 'email': 'Telly.Hoeger@billy.biz', 'address': {'street': 'Rex Trail', 'suite': 'Suite 280', 'city': 'Howemouth', 'zipcode': '58804-1099', 'geo': {'lat': '24.8918', 'lng': '21.8984'}}, 'phone': '210.067.6132', 'website': 'elvis.io', 'company': {'name': 'Johns Group', 'catchPhrase': 'Configurable multimedia task-force', 'bs': 'generate enterprise e-tailers'}}
{'id': 8, 'name': 'Nicholas Runolfsdottir V', 'username': 'Maxime_Nienow', 'email': 'Sherwood@rosamond.me', 'address': {'street': 'Ellsworth Summit', 'suite': 'Suite 729', 'city': 'Aliyaview', 'zipcode': '45169', 'geo': {'lat': '-14.3990', 'lng': '-120.7677'}}, 'phone': '586.493.6943 x140', 'website': 'jacynthe.com', 'company': {'name': 'Abernathy Group', 'catchPhrase': 'Implemented secondary concept', 'bs': 'e-enable extensible e-tailers'}}
{'id': 9, 'name': 'Glenna Reichert', 'username': 'Delphine', 'email': 'Chaim_McDermott@dana.io', 'address': {'street': 'Dayna Park', 'suite': 'Suite 449', 'city': 'Bartholomebury', 'zipcode': '76495-3109', 'geo': {'lat': '24.6463', 'lng': '-168.8889'}}, 'phone': '(775)976-6794 x41206', 'website': 'conrad.com', 'company': {'name': 'Yost and Sons', 'catchPhrase': 'Switchable contextually-based project', 'bs': 'aggregate real-time technologies'}}
{'id': 10, 'name': 'Clementina DuBuque', 'username': 'Moriah.Stanton', 'email': 'Rey.Padberg@karina.biz', 'address': {'street': 'Kattie Turnpike', 'suite': 'Suite 198', 'city': 'Lebsackbury', 'zipcode': '31428-2261', 'geo': {'lat': '-38.2386', 'lng': '57.2232'}}, 'phone': '024-648-3804', 'website': 'ambrose.net', 'company': {'name': 'Hoeger LLC', 'catchPhrase': 'Centralized empowering task-force', 'bs': 'target end-to-end models'}}
Este es sólo uno de los usos de cURL en Python. Ya no dependemos de la API para enviar datos de vuelta de la manera que queremos, podemos procesarlos de muchas maneras diferentes, tales como mostrar si una persona está en una lista de respuesta basada en su nombre , correo electrónico , número de teléfono o cualquier otra propiedad única de una persona.
Por ejemplo, digamos que nos gustaría comprobar si existe o no un nombre con un nombre específico en una lista. Para ello podemos crear una función que puede tomar la respuesta que convertimos en una matriz JSON listo para Python para analizar.
import subprocess
import json
def cURL(url):
return subprocess.check_output(['curl',url])
users = json.loads(cURL('https://jsonplaceholder.typicode.com/users'))
def check_if_user_exists(users,name):
for user in users:
if(user['name'] == name): print(f'An user called {name} exists in the list and has the id of {user["id"]}')
check_if_user_exists(users,'Clementina DuBuque')
Este bloque de código nos devolverá esta salida:
Un usuario llamado Clementina DuBuque existe en la lista y tiene el id de 10
Felicidades. Has hecho un script que obtiene datos de un servidor, los almacena y los analiza después. Las ventajas de usar Python no terminan aquí, Python incluso tiene una interfaz especial diseñada para usar cURL que se llama PycURL y de la que vamos a hablar ahora.
¿Qué es PycURL?
Como hemos mencionado antes, PycURL es, para abreviar, una herramienta de Python que nos ayuda a utilizar cURL de forma más natural. Una gran ventaja es que PycURL está fuertemente optimizado y soporta concurrencia, lo que significa que es muy rápido (más rápido que la popular librería request de Python). Por otro lado, usar PycURL no es tan fácil de usar como lo que hemos visto antes, siendo una herramienta dirigida a un desarrollador avanzado.Sin embargo no deberías sentirte intimidado por eso porque al final ganarás un entendimiento más profundo de redes y te sentirás más cómodo con Python.
¿Cómo se instala?
Como cualquier otro paquete, puede instalarlo con pip:
$ pip install pycurl
También le gustaría instalar certifi esta vez por razones de seguridad cuando se utiliza pycurl. Certifi es una herramienta que valida certificados SSL mientras verifica la identidad del host TLS. Para saber más sobre certifi, te sugiero encarecidamente que consultes su documentación. Puedes instalarlo de la misma manera:
$ pip install certifi
Puede comprobar que la instalación se ha realizado correctamente ejecutando el siguiente script:
import certifi
print(certifi.where())
La salida debería ser la ubicación donde se instaló el paquete:
/usr/local/lib/python3.10/site-packages/certifi/cacert.pem
¿Cómo utilizar pycURL?
La diferencia con lo que hacíamos antes es que ahora solo escribimos código sin ejecutar comandos directamente. Para resumir, creamos una instancia de la clase pycurl.Curl() , obtenemos los datos y los escribimos en un buffer que posteriormente vamos a decodificar para poder leer los datos que recibes:
import pycurl
import certifi
from io import BytesIO
buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.URL, 'https://docs.webscrapingapi.com/')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())
c.perform()
c.close()
body = buffer.getvalue()
print(body.decode('iso-8859-1'))
Lo has adivinado, al igual que nuestros ejemplos anteriores, esto obtener el contenido HTML de la página web WebScrapingAPI e imprimirlo en la línea de comandos.
Una petición POST no es muy diferente, excepto que necesitas decirle a tu instancia de la clase pycurl.Curl() que vas a usar un método post, establecer tu cuerpo y cabeceras, si es el caso.Así es como se ve:
import pycurl
import certifi
import json
from io import BytesIO
buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.URL, 'https://httpbin.org/post')
c.setopt(pycurl.HTTPHEADER, [ 'Content-Type: application/json' , 'Accept: application/json'])
data = json.dumps({"foo": "bar"})
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())
c.perform()
c.close()
body = buffer.getvalue()
print(body.decode('iso-8859-1'))
Y deberíamos obtener de vuelta, al igual que antes una respuesta que contenga su solicitud, dirección IP, params y cuerpo:
{
"args": {},
"data": "",
"files": {},
"form": {
"{foo:bar}": ""
},
"headers": {
"Accept": "*/*",
"Content-Length": "9",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "curl/X.XX.X",
"X-Amzn-Trace-Id": "Root=X-XXXXX-XXXXXX"
},
"json": null,
"origin": "0.0.0.0",
"url": "https://httpbin.org/post"
}
Como ya he mencionado, hay sólo algunas cosas básicas que pycURL puede hacer por nosotros.es una herramienta muy compleja y sofisticada sobre la que podemos escribir muchos artículos. Si quieres explorar más cosas que puedes hacer con ella, te recomiendo encarecidamente que consultes su documentación.
Resumen
En conclusión, usar cURL en Python es muy efectivo y ahorra mucho tiempo y además puede ser un punto de partida para algunos proyectos interesantes en temas como análisis de datos o web scraping.El enfoque que recomiendo es primero sentirse cómodo con cURL y Python para luego pasar a usar pycURL. Espero que hayas encontrado este recurso útil para aprender a usar cURL en Python y que juegues con él y construyas algunos scripts.
Noticias y actualidad
Manténgase al día de las últimas guías y noticias sobre raspado web suscribiéndose a nuestro boletín.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Artículos relacionados

Aprenda a scrapear sitios web dinámicos con JavaScript utilizando Scrapy y Splash. Desde la instalación hasta la escritura de una araña, el manejo de la paginación y la gestión de las respuestas de Splash, esta completa guía ofrece instrucciones paso a paso tanto para principiantes como para expertos.


Explore el poder transformador del web scraping en el sector financiero. Desde datos de productos hasta análisis de opiniones, esta guía ofrece información sobre los distintos tipos de datos web disponibles para tomar decisiones de inversión.


Empiece con WebScrapingAPI, la solución definitiva para el web scraping. Recopile datos en tiempo real, evite los sistemas anti-bot y disfrute de soporte profesional.
