Google Sheets es más que una hoja de cálculo: combinada con Google Apps Script (un tiempo de ejecución de JavaScript), se convierte en una plataforma ligera de scraping para recopilar datos de la web pública, supervisar los cambios de precios, extraer tablas y alimentar cuadros de mando.
En esta guía se explica paso a paso cómo crear flujos de trabajo de raspado web de Google Sheets fiables con JavaScript, cómo automatizarlos, cómo evitar los bloqueos habituales y cómo integrar proxies (incluida una ruta práctica para utilizar proveedores como OkeyProxy) para reducir los 403 errores y mejorar el porcentaje de aciertos.
Nota rápidaSiempre respete el archivo robots.txt del sitio, las condiciones del servicio y la legislación local. Utilice el scraping para obtener datos públicos legítimos y con fines de investigación/seguimiento.
¿Qué es Google Sheets Web Scraping con Javascript?
Google Sheets web scraping JavaScript significa utilizar Google Sheets junto con Google Apps Script (un entorno JavaScript) para obtener páginas web mediante programación, extraer datos estructurados e insertar esos datos en una hoja. Apps Script expone UrlFetchApp para recuperar contenidos y el Aplicación de hoja de cálculo API para escribir los resultados. Para muchos casos de uso rápido, esto es rápido, sin servidor y gratuito (dentro de las cuotas de Apps Script).
¿Por qué utilizar Google Apps Script (Urlfetchapp)?
- Entorno familiar: Sintaxis de JavaScript, fácil de empezar.
- Ninguna infraestructura: se ejecuta en los servidores de Google: no hay que gestionar ningún servidor.
- Integración: escribe directamente en Google Sheets, envía correos electrónicos, disparadores, etc.
- Programación: los desencadenantes temporales automatizan el raspado periódico.
Limitaciones que hay que tener en cuenta: Apps Script se ejecuta desde la infraestructura de Google (por lo que las solicitudes se originan en los rangos de IP de Google), tiene cuotas de ejecución/tiempo, y carece de bibliotecas de análisis HTML integradas y robustas como Cheerio (puedes solucionar esto o utilizar un proxy/relé externo para tareas más pesadas).
- Más allá de IMPORTXML: Si alguna vez ha tratado de raspar datos en una hoja de cálculo, es probable que se haya encontrado con la
=IMPORTXMLfunción.
¿Qué es el IMPORTXML? Se trata de una fórmula integrada en Google Sheets que permite extraer datos de un sitio web específico proporcionando una URL y un XPath (un "mapa" a los datos). Por ejemplo =IMPORTXML("https://example.com", "//h1") sacaría el título principal de una página.
Aunque parece fácil, a menudo falla en el mundo real por razones principales. Por ejemplo, muchos sitios web modernos son "Single Page Applications" (construidos con React o Vue). IMPORTXML solo puede leer el código fuente inicial; no puede "esperar" a que JavaScript cargue los datos reales.
Ejemplo Simple de Scraping: Obtención de HTML y escritura en una hoja
Un Script de Apps mínimo que obtiene una página y escribe el título en una hoja:
function fetchPageTitle() {
const url = 'https://example.com';
const resp = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
const html = resp.getContentText();
const titleMatch = html.match(/([^<]*)/i);
const title = titleMatch ? titleMatch[1].trim() : 'No se ha encontrado título';
const hoja = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.appendRow([new Date(), url, title]);
}
Esto es adecuado para páginas estáticas sencillas. Para contenidos más estructurados (tablas, listas), necesitará una lógica de análisis.
Análisis de HTML: Estrategias y ejemplos
Opción A - Regex ligero / análisis sintáctico de cadenas
Útil para páginas pequeñas y predecibles. No es robusto para HTML malformado.
function parseTable(html) {
// ejemplo crudo - no confíe en regex para HTML complejo
const rows = html.match(/]*>([\s\S]*?)/gi) || [];
return filas.map(r => {
const cols = (r.match(/]*>([\s\S]*?)/gi) || [])
.map(c => c.replace(/]+>/g, '').trim());
return cols;
});
}
Opción B - XmlService para HTML/XML bien formado
XmlService puede analizar XHTML o HTML ordenado convertido a XML, pero muchas páginas no son XML válidas.
Opción C - Descargar el análisis a un servicio externo
Para páginas complejas, lo mejor es ejecutar un pequeño microservicio de análisis sintáctico (Node.js + Cheerio/Puppeteer) en Cloud Run o Cloud Functions. Su Apps Script llama a ese servicio (que devuelve JSON), y el servicio se encarga del análisis HTML y del trabajo anti-bot.
Gestión de contenidos dinámicos (renderizados en JS)
Muchos sitios modernos presentan el contenido del lado del cliente a través de JavaScript (AJAX). UrlFetchApp sólo recupera HTML del servidor, no ejecuta JavaScript de la página.
Opciones:
- Encontrar el punto final JSON/XHR utilizado por la página y llamarlo directamente (inspeccione la pestaña Red en DevTools).
- Utilizar un navegador headless (Puppeteer o Playwright) alojado en Cloud Run/Cloud Functions para renderizar la página y devolver HTML o JSON. Llame a este renderizador desde Apps Script.
- Utilizar servicios de renderizado de terceros (pagados) que devuelvan el HTML íntegramente rendido; velar por su cumplimiento.
Automatización del scraping con disparadores y gestión de errores
- Activadores en función del tiempo: programar el raspado diario/hora a hora.
- Backoff exponencial: en HTTP 429/5xx, retroceder y reintentar.
- Registro y notificaciones: registro de fallos y correo electrónico en caso de errores persistentes.
Ejemplo: crear un desencadenante diario:
function createDailyTrigger() {
ScriptApp.newTrigger('fetchPageTitle')
.timeBased()
.everyDays(1)
.atHour(6)
.create();
}
Problemas comunes de bloqueo: Reputación IP, límites de velocidad, captchas
Los sitios web bloquean activamente el scraping vía:
- Reputación IPMuchas solicitudes de IP de proveedores de nube conocidos (como las IP de Google Apps Script) pueden estar limitadas o bloqueadas.
- Límites de tarifaDemasiadas solicitudes en poco tiempo activan los estranguladores.
- CAPTCHAs: se presentan cuando el comportamiento parece automatizado o sospechoso.
Medidas defensivas clave:
- Respetar
robots.txt y las limitaciones legales y de seguridad de la información.
- Añade retrasos similares a los humanos entre las solicitudes.
- Mantener la legitimidad de las cabeceras de las peticiones (
Usuario-Agente, Acepte).
- Utilice proxies para diversificar el origen de las solicitudes (más información a continuación).
- Evite tratar de eludir los CAPTCHA; en su lugar, utilice las API oficiales o la resolución humana cuando sea compatible.
Superar los bloqueos con proxies - Diseño y limitaciones
Los proxies cambian la IP de origen de tus peticiones para que los sitios de destino vean las peticiones procedentes de direcciones diferentes. Para Google Sheets:
- Restricción importante:
UrlFetchApp se ejecuta en los servidores de Google y no expone la configuración nativa de proxy host:port. No es posible configurar directamente un host proxy SOCKS5 o HTTP en las opciones de UrlFetchApp.
Soluciones:
- Proxy relé / fetcher: Despliegue un pequeño servicio proxy/relay (Cloud Run / Cloud Function / VPS) que acepte una petición de su Apps Script y la reenvíe a través de un proxy configurado (como por ejemplo OkeyProxy). Apps Script llama al punto final de retransmisión (
https://your-relay.example.com/fetch?url=...), y el relé realiza la obtención proxy y devuelve el HTML/JSON. Este es el enfoque más fiable y flexible.
- API de reenvío HTTP del proveedor: Algunos proveedores de proxy exponen un punto final de API HTTP que puede obtener URL arbitrarias en su nombre. Si OkeyProxy u otro proveedor ofrece una API de reenvío autenticada, puede llamarla directamente desde Apps Script (sin necesidad de retransmisión). Consulte la documentación del proveedor.
Nota de seguridad: Cuando utilice un relé, asegúrelo (clave API, HTTPS) para que sólo su Apps Script pueda utilizarlo.
Captchas: Qué hacer cuando se encuentre con ellos
No intente saltarse los captchas mediante programación a menos que tenga permiso explícito. Saltar captchas para evadir protecciones puede ser ilegal e infringe las condiciones de muchos sitios.
Si te encuentras con captchas con frecuencia:
- Reducir el ritmo de solicitudes.
- Mejorar la confianza en la propiedad intelectual (utilizar apoderados residenciales rotatorios o proxies ISP estáticos como el que proporciona OkeyProxy).
- Para investigaciones legítimas a gran escala, póngase en contacto con el propietario del sitio para obtener acceso o puntos finales de la API.
- Para los CAPTCHA inevitables en un flujo de trabajo empresarial, utilice servicios de interacción humana o asociaciones oficiales, y garantice su cumplimiento.
Buenas prácticas (velocidad, cabeceras, cuotas, ética)
Construir un scraper que funcione es una cosa, pero asegurarse de que se mantiene fiable, respetuoso y desbloqueado requiere un enfoque más disciplinado y "humano" de la automatización.
📜 Respetar robots.txt y Site ToS
Antes de extraer un solo byte de datos, compruebe siempre las normas del sitio de destino: cumplirlas es la única forma de garantizar la sostenibilidad de su proyecto a largo plazo.
🎭 Utiliza cabeceras realistas
Incorpore cabeceras estándar User-Agent, Accept-Language y Referer en sus opciones UrlFetchApp para que sus peticiones parezcan las de un navegador estándar en lugar de un script.
⏳ Implementación de limitación de velocidad y fluctuación de fase
No machaques a un servidor con mil peticiones por segundo. Implementa "jitter" (intervalos de espera aleatorios) entre las peticiones para mantener unos patrones de tráfico naturales.
🚦 Respuestas del monitor y retroceso
Configure la lógica para detectar respuestas 429 (Demasiadas solicitudes) o 5xx (Error del servidor). Si el sitio le dice que reduzca la velocidad, escuche inmediatamente.
⚖️ Evitar la infracción de los derechos de autor
Utilice los datos extraídos para análisis internos, investigación o control de precios, pero nunca extraiga material protegido por derechos de autor para su redistribución o uso comercial público.
📝 Registra y audita tus disparadores
Dado que Google Apps Script se ejecuta en segundo plano, mantén un registro sencillo de los tiempos de ejecución y de los códigos de error para poder depurar rápidamente los fallos "silenciosos".
Conclusión
El raspado web de Google Sheets con JavaScript (Apps Script + UrlFetchApp) es una solución pragmática para muchas tareas ligeras de raspado y supervisión.
Para las páginas que bloquean las IP del centro de datos o activan captchas con frecuencia, la introducción de una estrategia de proxy controlada -idealmente a través de un relé seguro que utilice proxies ISP residenciales/estáticos de un proveedor de confianza como OkeyProxy- aumenta drásticamente el éxito a la vez que mantiene su flujo de trabajo sin servidor e integrado con Sheets.
Preguntas frecuentes
P: ¿Puede Apps Script utilizar proxies directamente?
R: No - UrlFetchApp no proporciona configuraciones de host/puerto proxy integradas. Utiliza un relé o la API del servidor del proveedor.
P: ¿Es legal raspar sitios web?
R: Depende. A menudo se pueden extraer datos públicos con fines de investigación y seguimiento, pero siempre respetando las condiciones de servicio y la legislación del sitio (derechos de autor, privacidad, normas anti-scraping). En caso de duda, ponte en contacto con el propietario del sitio.
P: ¿Qué pasa con los captchas?
R: Utilice métodos legítimos: ralentice las solicitudes, mejore la reputación de la IP (proxies residenciales) u obtenga acceso a la API. Evita intentar anular captchas mediante programación sin permiso explícito.
Volver arriba






