Cómo construir un rastreador web en Python desde cero para extraer información de sitios web.
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:
crawl depth
), es decir, hasta qué nivel de enlaces seguirá explorando.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.
Antes de comenzar, asegurémonos de tener instaladas las bibliotecas necesarias:
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.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 requestsfrom 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:
AndorraUnited Arab EmiratesAfghanistanAntigua and BarbudaAnguilla...
Aquí:
GET
a la URL de interés.BeautifulSoup
.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.
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.
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.
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.