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:

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:

Terminal
pip install requests beautifulsoup4 pandas openpyxl

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.

scraper.py
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:

Por ejemplo, si el precio está en <span class="precio-actual">$299</span>, tu código sería:

Python
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:

Python
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