Crear un web scraper con Python

Cómo construir un rastreador web en Python desde cero para extraer información de sitios web.

web-crawler-python

Un rastreador web, también conocido como web crawler o bot de rastreo, es un programa que navega automáticamente por internet siguiendo enlaces entre páginas. Su propósito principal es recopilar información y estructurarla para diferentes usos, como la indexación en motores de búsqueda o la extracción de datos específicos.

Uno de los ejemplos más conocidos es Googlebot, el rastreador de Google, que explora continuamente la web para indexar contenido en el buscador. Hay muchísimos otros bots como Archive.org’s Wayback Machine, que almacena versiones antiguas de sitios web o incluso bots de IA para entrenar modelos de datos.

A grandes rasgos podríamos decir que uno de estos bots suele seguir una serie de pasos básicos:

  • Comienza con una lista de URLs iniciales (seed URLs).
  • Accede a cada página y extrae su contenido.
  • Busca enlaces dentro de la página y los añade a la lista de URLs a visitar.
  • Controla la profundidad del rastreo (crawl depth), es decir, hasta qué nivel de enlaces seguirá explorando.
  • Puede aplicar reglas como evitar páginas duplicadas o respetar restricciones de robots.txt.

Ahora que tenemos una imagen básica de cómo funcionan los rastreadores web, veamos cómo podemos construir un scraper en Python para extraer información de un sitio web.

Instalando las herramientas necesarias

Antes de comenzar, asegurémonos de tener instaladas las bibliotecas necesarias:

Terminal
pip install requests beautifulsoup4
  • requests nos permite hacer solicitudes HTTP para obtener el contenido de una página.
  • BeautifulSoup facilita el análisis del HTML y la extracción de datos específicos.

Primeros pasos con requests y BeautifulSoup

El primer paso en cualquier scraper es obtener el código fuente de la página web que queremos analizar. Supongamos que queremos extraer los títulos de artículos de un blog.

import requests
from bs4 import BeautifulSoup
url = "https://www.scrapethissite.com/pages/simple/"
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, "html.parser")
for titulo in soup.find_all("h3"):
print(titulo.text.strip())
else:
print("Error al acceder a la página")

Cómo resultado obtendremos la lista de países:

Andorra
United Arab Emirates
Afghanistan
Antigua and Barbuda
Anguilla
...

Aquí:

  • Hacemos una solicitud GET a la URL de interés.
  • Analizamos el contenido HTML con BeautifulSoup.
  • Extraemos y mostramos los títulos de los países.

Evitando bloqueos con cabeceras HTTP

Algunos sitios web pueden bloquear scrapers si detectan muchas solicitudes automáticas. Para evitarlo, podemos añadir cabeceras personalizadas que simulen la navegación de un usuario real.

headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}
response = requests.get(url, headers=headers)

Esto ayuda a reducir el riesgo de ser bloqueados por medidas de seguridad.

Extrayendo información más compleja

A veces, los datos que necesitamos están dentro de etiquetas específicas con clases o atributos únicos. Podemos afinar nuestra búsqueda usando selectores CSS o atributos class. Con este HTML:

<div class="country-info">
<strong>Capital:</strong> <span class="country-capital">The Valley</span><br>
<strong>Population:</strong> <span class="country-population">13254</span><br>
<strong>Area (km<sup>2</sup>):</strong> <span class="country-area">102.0</span><br>
</div>

si queremos obtener la población podemos usar distintos selectores:

for country in soup.select("div.country-info"):
population_span = country.find('span', class_='country-population')
population = int(population_span.text)
print(f"Population: {population}")

Esto nos permite extraer información estructurada.

Consideraciones éticas y legales

Antes de hacer scraping, revisemos siempre los robots.txt de los sitios web para verificar si permiten este tipo de actividad. No debemos sobrecargar servidores con solicitudes masivas, y debemos usar la información extraída de forma responsable y legal.

Podemos revisar robots.txt así:

robots_url = "https://ejemplo.com/robots.txt"
print(requests.get(robots_url).text)

Si encontramos líneas como Disallow: /blog, significa que no deberíamos hacer scraping en esa sección del sitio.

Conclusión

Crear un web scraper en Python es relativamente sencillo, a partir del ejemplo expuesto las posibilidades son infinitas y nos abre muchas posibilidades para recopilar cualquier tipo de información. Hemos visto que con las librerías requests y BeautifulSoup, podemos obtener datos de manera rápida, pero siempre debemos hacerlo de forma ética y responsable.