Necesitas datos de un sitio web. ¿Escribes un scraper en Python? ¿Levantas Playwright? ¿Usas una extensión de navegador? Después de extraer datos de cientos de sitios diferentes, desarrollé un framework para elegir la herramienta correcta.
Las Opciones
| Enfoque | Se ejecuta en | ¿Maneja JS? | Soporte de Login | Tiempo de Setup |
|---|---|---|---|---|
| Python + requests | Servidor | ❌ | Cookies manuales | 5 min |
| Python + BeautifulSoup | Servidor | ❌ | Cookies manuales | 5 min |
| Playwright/Puppeteer | Servidor | ✅ | Scripteable | 15 min |
| Extensión de navegador | Navegador del usuario | ✅ | Automático | 0 min |
| Copiar-pegar | Navegador del usuario | ✅ | Automático | 0 min |
Cada uno tiene tradeoffs. Veamos cada uno en detalle.
Opción 1: Python + Requests/BeautifulSoup
Mejor para: Páginas HTML estáticas, APIs, pipelines automatizados
import requests
from bs4 import BeautifulSoup
response = requests.get("https://example.com/data")
soup = BeautifulSoup(response.text, "html.parser")
table = soup.find("table")
rows = []
for tr in table.find_all("tr"):
row = [td.get_text(strip=True) for td in tr.find_all(["td", "th"])]
rows.append(row)
Ventajas:
- Ejecución rápida
- Fácil de programar (cron, Airflow)
- Sin overhead de navegador
Limitaciones:
- No ejecuta JavaScript
- Muchos sitios modernos renderizan tablas del lado del cliente
- La autenticación requiere manejo manual de cookies
Cuándo falla: Intenta scrapear un dashboard basado en React. El HTML que obtienes es un <div id="root"></div> vacío.
Opción 2: Navegadores Headless (Playwright/Puppeteer)
Mejor para: Páginas renderizadas con JavaScript, pipelines automatizados, sitios que requieren interacción
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://example.com/dashboard');
// Esperar a que la tabla se renderice
await page.waitForSelector('table');
const data = await page.evaluate(() => {
const table = document.querySelector('table');
return Array.from(table.rows).map(row =>
Array.from(row.cells).map(cell => cell.textContent.trim())
);
});
console.log(data);
await browser.close();
})();
Ventajas:
- Ejecuta JavaScript
- Puede interactuar con páginas (clicks, scrolls, llenado de formularios)
- Flujos de autenticación scripteables
Limitaciones:
- Más lento que HTTP directo
- Consume muchos recursos (memoria, CPU)
- Manejo de errores más complejo
- Los sitios pueden detectar navegadores headless
Cuándo falla: Muchos sitios detectan Puppeteer/Playwright mediante propiedades del navegador, fingerprinting de WebGL, o análisis de comportamiento. Los plugins de stealth ayudan pero no son infalibles.
Opción 3: Extensiones de Navegador
Mejor para: Extracción ad-hoc, sitios autenticados, flujos de trabajo iniciados por el usuario
Una extensión de navegador se ejecuta en la sesión real del navegador del usuario, con acceso completo a:
- Sesiones autenticadas
- Contenido renderizado por JavaScript
- El DOM exacto que el usuario ve
Para una comparación de las mejores opciones, mira Las 5 Mejores Extensiones de Chrome para Exportar Tablas.
// Content script en una extensión de Chrome
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
if (msg.type === "EXTRACT_TABLE") {
const table = document.querySelector("table");
const data = Array.from(table.rows).map(row =>
Array.from(row.cells).map(cell => cell.textContent.trim())
);
sendResponse({ data });
}
});
Ventajas:
- Cero manejo de autenticación — ya tienes la sesión iniciada
- Ve exactamente lo que tú ves (sin problemas de renderizado JS)
- Funciona en cualquier sitio (sin detección de bots)
- No necesita infraestructura de servidor
Limitaciones:
- Requiere trigger manual (el usuario hace click)
- No se puede ejecutar programáticamente
- Limitado al contexto del navegador
Cuándo falla: Necesitas extraer datos de 10,000 páginas automáticamente. Las extensiones son para flujos de trabajo iniciados por el usuario, no para procesamiento en batch.
Framework de Decisión
Usa Python + requests cuando:
- ✅ La página es HTML renderizado del servidor
- ✅ Necesitas extracción automatizada/programada
- ✅ Estás construyendo un pipeline de datos
- ✅ La autenticación es vía API keys o cookies simples
Usa Playwright/Puppeteer cuando:
- ✅ La página requiere renderizado JavaScript
- ✅ Necesitas extracción automatizada/programada
- ✅ Necesitas interactuar (scroll, click, paginar)
- ✅ Puedes manejar contramedidas de detección de bots
Usa una Extensión de Navegador cuando:
- ✅ Ya tienes la sesión iniciada en el sitio
- ✅ Necesitas datos ocasionalmente (no automatizado)
- ✅ El sitio tiene detección de bots fuerte
- ✅ Querés datos AHORA sin escribir código
Solo copiá y pegá cuando:
- ✅ Extracción de una sola vez
- ✅ Estructura de tabla simple
- ✅ No lo necesitas en un formato específico
Ejemplos del Mundo Real
Ejemplo 1: Tablas de Wikipedia
Mejor enfoque: Extensión de navegador o Python
Wikipedia es HTML renderizado del servidor sin autenticación. Python funciona perfectamente:
import pandas as pd
url = "https://es.wikipedia.org/wiki/Anexo:Pa%C3%ADses_por_poblaci%C3%B3n"
tables = pd.read_html(url)
df = tables[0]
Pero las tablas de Wikipedia suelen tener rowspans complejos y filas de navegación. Una extensión dedicada maneja estos automáticamente.
Ejemplo 2: Dashboard Financiero (Detrás de Login)
Mejor enfoque: Extensión de navegador
Tu broker muestra datos del portfolio después del login. Opciones:
Python: Hacer ingeniería inversa del flujo de autenticación, manejar 2FA, mantener cookies de sesión. Posible pero frágil.
Playwright: Scriptear el login, manejar prompts de 2FA, navegar hasta los datos. Funciona pero es complejo.
Extensión: Iniciar sesión normalmente, clic en "Exportar Tabla". Listo.
Para exportaciones ocasionales, la extensión gana en tiempo-hasta-los-datos.
Ejemplo 3: Monitoreo Diario de Precios (1000 Páginas)
Mejor enfoque: Playwright + cola
Necesitas verificar precios en 1000 páginas de productos diariamente. Esto requiere:
// Pseudocódigo para extracción en batch
const urls = loadUrlsFromDatabase();
for (const url of urls) {
const page = await browser.newPage();
await page.goto(url);
await page.waitForSelector('.price');
const price = await page.evaluate(() =>
document.querySelector('.price').textContent
);
await saveToDatabase(url, price);
await page.close();
// Rate limiting
await sleep(randomBetween(1000, 3000));
}
Las extensiones no pueden hacer esto — requieren interacción del usuario. Playwright es la herramienta correcta.
Ejemplo 4: Exportación Puntual de Estadísticas Deportivas
Mejor enfoque: Extensión de navegador
FBREF tiene headers complejos de dos niveles. Necesitas las estadísticas de esta temporada una sola vez.
Enfoque con Python: 30 minutos escribiendo un parser personalizado para su estructura de tabla.
Enfoque con extensión: Click en exportar. 10 segundos.
Para extracción puntual, no sobreingenieres la solución.
Enfoques Híbridos
A veces necesitas ambos:
-
Usar extensión para exportar cookies de autenticación
- Exportar cookies de una sesión logueada
- Importarlas en Python/Playwright para automatización
-
Usar extensión para inspeccionar estructura, Python para escalar
- Examinar manualmente el DOM con herramientas de la extensión
- Escribir un scraper dirigido una vez que entendés la estructura
-
Usar Playwright para navegación, extensión para extracción
- El script navega hasta la página
- Llama a la API de la extensión para parsing complejo de tablas
Mi Stack
Para el 80% de los casos donde necesito datos de tablas web:
- Puntual, autenticado: HTML Table Exporter (extensión de navegador que construí)
-
Puntual, datos públicos:
pd.read_html()o extensión - Pipeline automatizado: Playwright con parsers personalizados
- API disponible: Llamadas directas a la API (siempre preferido)
La mejor herramienta depende de la extracción específica. Ajusta la complejidad de tu solución a la complejidad de tu problema.
¿Cuál es tu enfoque preferido de extracción? Más info en gauchogrid.com/es/html-table-exporter o prueba la extensión gratis en la Chrome Web Store.
Top comments (0)