Volver al blog
Guías
Mihnea-Octavian ManolacheLast updated on Mar 31, 20269 min read

Cómo utilizar CURL con Python para el scraping web

Cómo utilizar CURL con Python para el scraping web

La acción más básica que debe realizar cualquier aplicación de web scraping es, en primer lugar, recopilar el archivo HTML y, solo después, centrarse en manipularlo. Por supuesto, hay diferentes formas de lograrlo. Sin embargo, en el artículo de hoy, descubriremos cómo utilizar cURL con Python para crear un web scraper. A continuación, te ofrecemos un avance de solo una pequeña parte de lo que aprenderás tras leer este artículo:

  • ¿Qué es cURL y cómo acceder a él desde la línea de comandos?
  • Cómo utilizar el comando cURL para recopilar información de cualquier sitio web
  • Cómo usar cURL en Python para crear un sencillo rastreador web

¿Cómo usar 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 mencionar 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ás una de las herramientas más fáciles que usarás como programador.

Para usar cURL desde la línea de comandos, simplemente abre una nueva ventana de terminal y escribe `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, solicitando información al servidor, tal y como lo haría un navegador tradicional. El resultado de este ejemplo será un objeto JSON que contiene tu dirección IP. Aunque no lo parezca, acabas de crear la infraestructura para un futuro rastreador web. Todo en una sola línea de código.

cURL es, en realidad, una herramienta más avanzada. Si quieres saber más sobre cómo usar curl, puedes consultar la documentación oficial. También puedes usar el modificador `--help` y leer sobre las distintas opciones disponibles. 

Cómo usar cURL para recuperar 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 enfoque no es la manipulación de datos, sino más bien la extracción de datos. Y sabemos que podemos usar cURL para extraer datos de sitios web, pero ¿cómo lo hacemos realmente? Bueno, si aún no has sentido curiosidad y lo has probado, simplemente pídele a cURL que acceda a cualquier URL genérica que sepas que es 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 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 usar cURL en Python

Como has visto, extraer datos con cURL es una solución sencilla y no requiere programación propiamente dicha. Se trata simplemente de enviar un comando y recibir cierta información. Si quieres crear un proyecto real de web scraping, necesitarás utilizar de alguna manera los datos que has recopilado. Y como somos programadores, queremos manipular los datos mediante programación. 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 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 te quedas atascado, no dudes en hacer una pregunta en Stackoverflow, por ejemplo, y seguro que alguien te ayudará. 

En lo que respecta al web scraping en particular, Python es una gran elección 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 puedas «extraer» los elementos y obtener solo la información que te interesa de esa página web concreta.

Web scraping con cURL y Python

Hasta ahora, hemos descubierto cómo usar cURL en la terminal, pero ¿cómo lo integramos realmente con Python? Bueno, en realidad hay varias formas de abordar esto. Por ejemplo, podrías usar el módulo `os` de Python y enviar comandos de terminal:

import os
curl = os.system(f'curl "https://httpbin.org/forms/post"')
print(curl)

O incluso puedes crear tu propia función en torno a él y utilizarla a lo largo de todo el proyecto:

import os
def curl(website):
return os.system(f'curl "{website}"')

print(curl('https://httpbin.org/forms/post'))

Sin embargo, como he dicho, uno de los mayores puntos fuertes de Python es la diversidad de sus paquetes. Dado que cURL es mucho más versátil, nuestra función tendría que ser mucho más compleja para dar cabida a todas sus características. Por lo tanto, en lugar de reinventar la rueda, recomiendo que utilicemos un paquete ya existente para la integración de 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 el medio por el que utilizaremos 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, simplemente añade 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 creado bastantes soluciones para el análisis de HTML. Uno de los paquetes de análisis de HTML más populares es BeautifulSoup. En WebScrapingAPI, de hecho, hemos dedicado una entrada de blog completa 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 beautifulsoup4

Cómo crear un rastreador web con Python y cURL

Ahora que hemos cubierto la parte teórica y sabemos cómo usar cURL tanto en la terminal como en Python, pasemos directamente a la programación. En esta sección, aprenderemos a usar cURL en Python creando un rastreador web real. Así que, sin más preámbulos, ¡que comience la programación!

1. Configuración del directorio

Como ingenieros de software, es importante estructurar nuestros proyectos de manera que sean fáciles de mantener y 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 con `cd` hasta el escritorio y crea una nueva carpeta llamada `py_scraper`:

~ » cd desktop && mkdir py_scraper && cd py_scraper

Permíteme explicar brevemente los comandos que hemos utilizado hasta ahora:

  • `cd`: cambia el directorio actual
  • `&&`: ejecuta el siguiente comando solo si el anterior se ha ejecutado correctamente
  • `mkdir`: crea 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

Tu terminal debería estar ahora dentro del 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 estén contenidos únicamente dentro del directorio `py_scraper` (y no tenerlos instalados 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 utilizando este comando:

~/desktop/py_scraper » source env/bin/activate

Ahora que has creado y activado tu entorno virtual, solo queda instalar los paquetes necesarios utilizando los comandos pip que hemos presentado anteriormente.

~/desktop/py_scraper » pip install pycurl beautifulsoup4 certify

3. Creación del rastreador web con Python y cURL

Ya tienes todo listo para usar PycURL y BeautifulSoup. Para utilizar estos paquetes, primero debemos importarlos a nuestro archivo `scraper.py`. Simplemente añade este fragmento de código al principio del archivo:

import pycurl
import certify
from io import BytesIO
from bs4 import BeautifulSoup

# All our logic will go underneath this line

Ahora que 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 manejo de datos. La primera parte la cubre PycURL y la segunda, BeautifulSoup. Para una mejor estructura, sugiero que tratemos cada parte por separado.

3.1. Scraping 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 usar curl en Python interactuando con la interfaz de PycURL, escribamos el código:

# Setting global variables
TARGET_URL = 'https://httpbin.org/forms/post'

# Using cURL and Python to gather data from a server via 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()

# Using BytesIO to retrieve the scraped data
body = buffer.getvalue()

# Saving the output and printing it in 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 utilizando `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 de cURL y cerramos la sesión después. 

Eso es todo, has utilizado con éxito Python para realizar una solicitud cURL e imprimir el archivo HTML en tu consola. Ahora solo nos queda ocuparnos de la segunda sección, es decir, el manejo de datos.

3.2. Análisis de HTML con Python y BeautifulSoup

Disponer de los datos sin procesar es redundante en el web scraping, a menos que realicemos algún tipo de acción sobre ellos. El objetivo más básico de cualquier web scraper es extraer datos del HTML. Para nuestro ejemplo, supongamos que queremos extraer todo el texto dentro de los elementos `<p>` de la variable `data` (que actualmente contiene todo el HTML extraído). Así es como lo hacemos utilizando BeautifulSoup:

# Parsing data using BeautifoulSoup
soup = BeautifulSoup(data, 'html.parser')
# Finding elements using BeautifoulSoup
paragraphs = soup.find_all("p")
for p in paragraphs:
   print(p.text)

Como puedes ver, con BeautifulSoup solo se necesitan 4 líneas de código para extraer el resultado deseado. Al ejecutar el script completo, ahora debería mostrarse el texto dentro de cada párrafo que se encuentre en el archivo HTML que hemos recopilado de nuestro sitio web de destino. 

Así pues, suponiendo que has seguido las instrucciones y que tu `scraper.py` incluye todo el código que hemos escrito en esta sección, volvamos al terminal y ejecutemos el script:

~/desktop/py_scraper » python3 scraper.py
Customer name: 
Telephone: 
E-mail address: 
  Small 
  Medium 
  Large 
  Bacon 
  Extra Cheese 
  Onion 
  Mushroom 
Preferred delivery time: 
Delivery instructions: 
Submit order

Conclusión

Crear un rastreador web con Python y cURL es un proyecto muy útil y puede ser el punto de partida para una aplicación de rastreo web más grande. El enfoque recomendado para integrar ambas tecnologías es utilizar PycURL. También puedes escribir tu propia interfaz o función para interactuar con cURL en Python. Solo requiere un poco más de tiempo y esfuerzo :).

Espero que este artículo haya sido un buen recurso para aprender a usar cURL, cómo utilizarlo con Python y crear un rastreador web básico. Además, te invito a modificar el código y adaptarlo a tu gusto, de modo que tengas otro proyecto más que añadir a tu portfolio.

Acerca del autor
Mihnea-Octavian Manolache, Desarrollador Full Stack @ WebScrapingAPI
Mihnea-Octavian ManolacheDesarrollador Full Stack

Mihnea-Octavian Manolache es ingeniero Full Stack y DevOps en WebScrapingAPI, donde se encarga de desarrollar funciones para los productos y de mantener la infraestructura que garantiza el buen funcionamiento de la plataforma.

Empieza a crear

¿Estás listo para ampliar tu recopilación de datos?

Únete a más de 2000 empresas que utilizan WebScrapingAPI para extraer datos de la web a escala empresarial sin ningún gasto de infraestructura.