Imagina que necesitas los precios de 200 productos de un sitio de la competencia, o que quieres monitorear las vacantes de empleo en tu sector cada día. Hacerlo manualmente tomaría horas. Con un script de Python bien estructurado, lo haces en segundos.
Antes de entrar al código, hay dos reglas que siempre aplico:
- Revisa el archivo robots.txt del sitio (agrega /robots.txt a la URL) para ver qué páginas no quieren que se extraigan
- No hagas peticiones tan rápido que sobrecargues el servidor. Un delay de 1-2 segundos entre requests es suficiente para ser respetuoso
El scraping de datos personales o contenido protegido por derechos de autor puede tener implicaciones legales. Usa esta técnica solo sobre información pública y para fines de análisis propios.
Las herramientas que vamos a usar
Solo necesitas dos librerías instaladas con pip:
pip install requests beautifulsoup4 pandas openpyxl
- requests — hace las peticiones HTTP al sitio web y trae el HTML
- beautifulsoup4 — parsea el HTML y te permite navegar su estructura con Python
- pandas — organiza los datos en una tabla y los exporta a Excel o CSV
Estructura base de un script de scraping
Todo script de scraping bien estructurado tiene estas tres partes: obtener el HTML, extraer los datos y guardarlos.
import requests from bs4 import BeautifulSoup import pandas as pd import time # 1. Definir la URL objetivo URL = "https://ejemplo.com/productos" HEADERS = {"User-Agent": "Mozilla/5.0 (compatible; MiBot/1.0)"} # 2. Obtener el HTML def obtener_pagina(url): respuesta = requests.get(url, headers=HEADERS, timeout=10) respuesta.raise_for_status() # error si el sitio falla return BeautifulSoup(respuesta.text, "html.parser") # 3. Extraer los datos def extraer_productos(soup): productos = [] for tarjeta in soup.find_all("div", class_="producto-card"): nombre = tarjeta.find("h2") precio = tarjeta.find("span", class_="precio") productos.append({ "nombre": nombre.text.strip() if nombre else "", "precio": precio.text.strip() if precio else "", }) return productos # 4. Guardar en Excel def guardar_datos(datos, archivo): df = pd.DataFrame(datos) df.to_excel(archivo, index=False) print(f"Guardados {len(df)} registros en {archivo}") # Ejecución principal if __name__ == "__main__": soup = obtener_pagina(URL) datos = extraer_productos(soup) guardar_datos(datos, "productos.xlsx")
Cómo identificar los selectores correctos
La parte que más confunde a los principiantes es encontrar los selectores CSS correctos para extraer los datos. El proceso es simple:
- Abre el sitio en Chrome o Firefox
- Haz clic derecho sobre el elemento que quieres extraer → "Inspeccionar"
- Observa la clase o etiqueta HTML del elemento en el panel de DevTools
- Usa esa clase en tu
find_all()
Por ejemplo, si el precio está en <span class="precio-actual">$299</span>, tu código sería:
precio = tarjeta.find("span", class_="precio-actual") valor = precio.text.strip() if precio else "Sin precio"
Scraping de múltiples páginas
La mayoría de los sitios pagina sus resultados. Para recorrer varias páginas, modifica la URL con el número de página y repite el proceso:
todos_los_datos = [] for pagina in range(1, 11): # páginas 1 a 10 url = f"https://ejemplo.com/productos?page={pagina}" soup = obtener_pagina(url) datos = extraer_productos(soup) todos_los_datos.extend(datos) time.sleep(1.5) # espera entre peticiones print(f"Página {pagina} completada — {len(datos)} productos") guardar_datos(todos_los_datos, "todos_productos.xlsx")
Si el sitio usa JavaScript para renderizar su contenido (lo que verás como una página en blanco si haces Ctrl+U en el navegador), BeautifulSoup no será suficiente. En ese caso, necesitas Playwright o Selenium para controlar un navegador real.
¿Tienes datos que extraer de forma recurrente?
Puedo ayudarte a construir el scraper y automatizarlo para que se ejecute solo a la hora que necesites.
Hablemos de tu proyecto