¿Cómo se utiliza CURL con Python?
En resumen, cURL es principalmente una herramienta de línea de comandos que se utiliza para recuperar datos de un servidor. Sé que, al hablar de la línea de comandos, las cosas pueden parecer complicadas. Sin embargo, te puedo asegurar que, en la práctica, como descubrirás a lo largo de este artículo, cURL es quizá una de las herramientas más fáciles que llegarás a utilizar como programador.
Para utilizar cURL desde la línea de comandos, basta con abrir una nueva ventana de terminal y escribir «curl» seguido de la URL que quieras rastrear. Por ejemplo:
~ » curl 'https://api.ipify.org?format=json'
Este sencillo comando accede a la API de ipify y solicita información al servidor, tal y como lo haría un navegador convencional. El resultado de este ejemplo será un objeto JSON que contiene tu dirección IP. Aunque no lo parezca, acabas de crear la infraestructura necesaria para un futuro rastreador web. Todo ello en una sola línea de código.
En realidad, cURL es una herramienta más avanzada. Si quieres saber más sobre cómo usar cURL, puedes consultar la documentación oficial. También puedes utilizar el parámetro `--help` y leer sobre las distintas opciones disponibles.
Cómo utilizar cURL para descargar archivos HTML
En el ejemplo anterior, la respuesta que recibimos del servidor de ipify fue un archivo JSON. Esto se debe a que este punto final de API en concreto devuelve datos en formato JSON. En lo que respecta al web scraping, normalmente te encontrarás con sitios web tradicionales que sirven archivos HTML, de los que luego tendrás que analizar y extraer datos.
Sin embargo, por ahora, nuestro objetivo no es la manipulación de datos, sino más bien la extracción de datos. Sabemos que podemos usar cURL para extraer datos de sitios web, pero ¿cómo lo hacemos exactamente? Bueno, si aún no has sentido curiosidad y lo has probado, simplemente pide a cURL que acceda a cualquier URL genérica que sepas que corresponde a un sitio web tradicional basado en HTML. Tomemos como ejemplo httpbin.org:
curl 'https://httpbin.org/forms/post'
Escribe ese comando en tu terminal y recibirás el código HTML sin formato como respuesta:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<!-- Example form from HTML5 spec http://www.w3.org/TR/html5/forms.html#writing-a-form's-user-interface -->
<form method="post" action="/post">
<p><label>Customer name: <input name="custname"></label></p>
<p><label>Telephone: <input type=tel name="custtel"></label></p>
<p><label>E-mail address: <input type=email name="custemail"></label></p>
<fieldset>
<legend> Pizza Size </legend>
<p><label> <input type=radio name=size value="small"> Small </label></p>
<p><label> <input type=radio name=size value="medium"> Medium </label></p>
<p><label> <input type=radio name=size value="large"> Large </label></p>
</fieldset>
<fieldset>
<legend> Pizza Toppings </legend>
<p><label> <input type=checkbox name="topping" value="bacon"> Bacon </label></p>
<p><label> <input type=checkbox name="topping" value="cheese"> Extra Cheese </label></p>
<p><label> <input type=checkbox name="topping" value="onion"> Onion </label></p>
<p><label> <input type=checkbox name="topping" value="mushroom"> Mushroom </label></p>
</fieldset>
<p><label>Preferred delivery time: <input type=time min="11:00" max="21:00" step="900" name="delivery"></label></p>
<p><label>Delivery instructions: <textarea name="comments"></textarea></label></p>
<p><button>Submit order</button></p>
</form>
</body>
</html>Cómo utilizar cURL en Python
Como has visto, extraer datos con cURL es una solución sencilla y no requiere escribir código. Solo hay que enviar un comando y recibir la información. Si quieres desarrollar un proyecto real de web scraping, tendrás que utilizar de alguna manera los datos que hayas recopilado. Y como somos programadores, queremos manipular los datos mediante código. Aquí es donde entra en juego Python.
¿Por qué elegir Python para un proyecto de web scraping?
Sin duda, Python es uno de los lenguajes de programación más populares. No solo es muy potente, sino que su sintaxis sencilla lo hace perfecto para los programadores principiantes. Además, cuenta con una gran comunidad siempre dispuesta a echar una mano. Así que, si en algún momento te encuentras con un problema y no sabes cómo resolverlo, no dudes en plantear tu pregunta en Stack Overflow, por ejemplo, y seguro que alguien te ayudará.
En lo que respecta al web scraping en concreto, Python es una opción excelente gracias a todos los paquetes que incluye. Como verás más adelante en este artículo, la manipulación de datos requiere analizar los archivos HTML, de modo que luego puedas «extraer» los elementos y obtener únicamente la información que te interesa de esa página web en concreto.
Extracción de datos web con cURL y Python
Hasta ahora, hemos aprendido a utilizar curl en la terminal, pero ¿cómo lo integramos realmente con Python? Bueno, en realidad hay varias formas de hacerlo. Por ejemplo, podrías utilizar el módulo `os` de Python y enviar comandos a la terminal:
import os
curl = os.system(f'curl "https://httpbin.org/forms/post"')
print(curl)
O incluso puedes crear tu propia función a partir de ella y utilizarla en todo el proyecto:
import os
def curl(website):
return os.system(f'curl "{website}"')
print(curl('https://httpbin.org/forms/post'))
Sin embargo, como ya he dicho, uno de los mayores puntos fuertes de Python es la variedad de paquetes que ofrece. Dado que cURL es mucho más completo, nuestra función tendría que ser mucho más compleja para poder abarcar todas sus funciones. Por eso, en lugar de reinventar la rueda, recomiendo que utilicemos un paquete ya existente para integrar cURL en Python: PycURL.
¿Qué es PycURL y cómo se instala?
Según su página web, PycURL es una interfaz para la biblioteca cURL, por lo que hereda todas las capacidades de libcURL. En resumen, PycURL es la herramienta que utilizaremos para usar cURL en Python. A la hora de instalarlo, al igual que con cualquier otro paquete de Python, utilizaremos pip. Si no estás familiarizado con pip, se trata de un sistema de gestión de paquetes para Python que los desarrolladores de Python utilizan constantemente para instalar rápidamente las dependencias.
Dicho esto, para instalar PycURL, solo tienes que introducir el siguiente comando en tu terminal:
~ » pip install pycurl Análisis de HTML con BeautifulSoup
Ya que estamos hablando de dependencias y de pip, también vale la pena mencionar que la comunidad de Python ha desarrollado bastantes soluciones para el análisis de HTML. Uno de los paquetes más populares para el análisis de HTML es BeautifulSoup. En WebScrapingAPI, de hecho, hemos dedicado una entrada completa del blog a cómo extraer y analizar datos web con Python y BeautifulSoup.
Al igual que con PycURL, instalar BeautifulSoup solo requiere un comando:
~ » pip install beautifulsoup4Cómo crear un rastreador web con Python y cURL
Ahora que ya hemos visto la parte teórica y sabemos cómo utilizar cURL tanto en la terminal como en Python, pasemos directamente a la programación. En esta sección, aprenderemos a utilizar cURL en Python creando un rastreador web real. Así que, sin más preámbulos, ¡que empiece la programación!
1. Configuración del directorio
Como ingenieros de software, es importante estructurar nuestros proyectos de tal manera que sean fáciles de mantener y de leer, tanto para nosotros mismos como para otros desarrolladores. Para mantener todo organizado, empecemos por crear un nuevo directorio que albergue todos los archivos de nuestro proyecto. Abre una nueva ventana de terminal, navega hasta la carpeta «Desktop» con el comando `cd` y crea una nueva carpeta llamada `py_scraper`:
~ » cd escritorio && mkdir py_scraper && cd py_scraper
Permíteme explicar brevemente los comandos que hemos utilizado hasta ahora:
- `cd`: cambia al directorio actual
- `&&` - ejecuta el siguiente comando solo si el anterior se ha ejecutado correctamente
- `mkdir`: crear un nuevo directorio
Abre tu proyecto en tu IDE favorito y crea un nuevo archivo llamado «scraper.py» dentro del directorio `py_scraper`. Sugerencia: también puedes hacerlo desde la línea de comandos utilizando este comando:
~/desktop/py_scraper » touch scraper.py && code .
Si utilizas VSCode (como yo), ahora te aparecerá una ventana que debería tener este aspecto:

2. Instalación de paquetes
Ahora deberías estar en el directorio `py_scraper`. Lo último que debemos hacer antes de programar el scraper propiamente dicho es instalar los paquetes que hemos presentado anteriormente y uno más. Sin embargo, queremos que se encuentren únicamente dentro del directorio `py_scraper` (y no que se instalen globalmente). Para ello, tendremos que utilizar los entornos virtuales de Python. Estos nos permiten aislar el intérprete de Python, las bibliotecas y los scripts instalados.
Para configurar un nuevo entorno virtual dentro del directorio `py_scraper`, utiliza el siguiente comando:
~/desktop/py_scraper » python3 -m venv env
Esto creará una nueva carpeta «env» que debemos activar antes de instalar los paquetes deseados. Actívala con este comando:
~/desktop/py_scraper » source env/bin/activate
Ahora que ya has creado y activado tu entorno virtual, solo te queda instalar los paquetes necesarios utilizando los comandos pip que hemos presentado anteriormente.
~/desktop/py_scraper » pip install pycurl beautifulsoup4 certify3. Creación del rastreador web con Python y cURL
Ya tienes todo listo para usar PycURL y BeautifulSoup. Para poder utilizar estos paquetes, primero debemos importarlos a nuestro archivo `scraper.py`. Solo tienes que añadir este fragmento de código al principio del archivo:
import pycurl
import certify
from io import BytesIO
from bs4 import BeautifulSoup
# Toda nuestra lógica irá debajo de esta línea
Ahora que ya has importado los paquetes, vamos a ocuparnos de la lógica de nuestro rastreador web. Por lo que hemos visto hasta ahora, sabemos que debemos abordar dos aspectos: la extracción de datos y el tratamiento de datos. La primera parte la cubre PycURL y la segunda, BeautifulSoup. Para que la estructura quede más clara, te sugiero que tratemos cada parte por separado.
3.1. Extracción de datos con cURL y Python
Cuando hablo de «scraping», me refiero a la parte de extracción del rastreador web. Teniendo esto en cuenta y sabiendo cómo utilizar curl en Python a través de la interfaz PycURL, vamos a escribir el código:
# Definición de variables globales
TARGET_URL = 'https://httpbin.org/forms/post'
# Uso de cURL y Python para recopilar datos de un servidor a través de PycURL
buffer = BytesIO()
curl = pycurl.Curl()
curl.setopt(curl.URL, TARGET_URL)
curl.setopt(curl.WRITEDATA, buffer)
curl.setopt(curl.CAINFO, certifi.where())
curl.perform()
curl.close()
# Uso de BytesIO para recuperar los datos extraídos
body = buffer.getvalue()
# Guardar la salida e imprimirla en la terminal
data = body.decode('iso-8859-1')
print(data)
En el código anterior, comenzamos declarando la variable global `TARGET_URL`, que contiene la URL del sitio web del que queremos extraer datos. A continuación, creamos un búfer con `BufferIO`, inicializamos PycURL y configuramos dos opciones: una para la transferencia de datos y otra para el nombre del archivo que contiene los certificados. Por último, pero no menos importante, ejecutamos la acción curl y cerramos la sesión a continuación.
Ya está, has utilizado Python con éxito para realizar una solicitud cURL y has mostrado el archivo HTML en la consola. Ahora solo nos queda ocuparnos de la segunda parte: el tratamiento de datos.
3.2. Análisis sintáctico de HTML con Python y BeautifulSoup
Having the raw data is redundant in web scraping, unless we perform some sort of action on it. As the most basic scope of any web scraper is to extract data from HTML. For our example, let us assume that we want to scrape all text inside the `<p>` elements from the `data` variable (that is currently holding all the scraped HTML). Here is how we do this using BeautifulSoup:
# Análisis de datos con BeautifulSoup
soup = BeautifulSoup(data, 'html.parser')
# Búsqueda de elementos con BeautifulSoup
paragraphs = soup.find_all("p")
for p in paragraphs:
print(p.text)
Como puedes ver, con BeautifulSoup solo se necesitan cuatro líneas de código para obtener el resultado deseado. Al ejecutar el script completo, ahora debería mostrarse el texto de cada párrafo que se encuentre en el archivo HTML que hemos recopilado de nuestro sitio web de destino.
Por lo tanto, suponiendo que hayas seguido las instrucciones y que tu archivo `scraper.py` incluya todo el código que hemos escrito en esta sección, volvamos al terminal y ejecutemos el script:
~/desktop/py_scraper » python3 scraper.py
Nombre del cliente:
Teléfono:
Dirección de correo electrónico:
Pequeña
Mediana
Grande
Con beicon
Con queso extra
Con cebolla
Con champiñones
Hora de entrega preferida:
Instrucciones de entrega:
Enviar pedidoConclusión
Crear un rastreador web con Python y cURL es un proyecto muy útil y puede servir como punto de partida para una aplicación de rastreo web más compleja. La forma recomendada de integrar ambas tecnologías es utilizando PycURL. También puedes escribir tu propia interfaz o función para interactuar con cURL en Python. Solo que requiere un poco más de tiempo y esfuerzo :).
Espero que este artículo te haya servido de ayuda para aprender a usar curl, cómo utilizarlo con Python y cómo crear un rastreador web básico. Además, te invito a que modifiques el código y lo adaptes a tu gusto, de modo que tengas un proyecto más que añadir a tu portfolio.




