Categorías
Google Spreadsheets

Extraer datos de sitios web con Google Sheets (web scraping)

Seguido pasa que tenemos una página abierta y la pestaña anclada todo el tiempo al navegador, porque tiene información cambiante que estamos revisando constantemente. Puede ser el precio de un artículo de una tienda en línea, o el precio de compra o venta del dólar americano publicado por un banco específico. ¿Y si pudiéramos traer esa información concreta a una hoja de cálculo de Google? ¡Sí que podemos!

En posts anteriores vimos cómo obtener el precio del dólar en tiempo real con la función =GOOGLEFINANCE(), y como referencia general está bien, pero pongamos el ejemplo de requerir el precio del dólar específicamente del banco HSBC o Citibanamex para usarlo en algún cálculo. Hay páginas que los publican todos juntos, por ejemplo esta:

https://www.eldolar.info/es-MX-x-noacento/mexico/dia/hoy

Para lograr esto usaremos una técnica que se llama scraping, que en español se traduce a algo así como rascar. Lo que haremos es usar una técnica muy sencilla de  scraping (lo que nos permite Google Sheets con dos fórmulas que veremos a continuación) para rascar solo los datos que queremos de esa página y nada más esos datos. Ten en cuenta que dependemos al 100% de cómo esté publicada esa página, nosotros nos tenemos que adaptar al código que ya exista.

Web scraping con IMPORTXML en Google Sheets

Vamos a utilizar primero la fórmula =IMPORTXML(), la cual importa y procesa datos estructurados en XML, CSV o HTML. Necesitamos dos cosas:

  1. La URL (ya la tenemos)
  2. La ruta XPath. Esta se refiere a la ruta del elemento que queremos. Si vemos el código fuente de la página, no nos sirve todo, porque solo queremos el precio.

Vamos a probar obteniendo la ruta XPath del precio de venta del dólar. En la página damos click derecho sobre el precio y damos click en la opción de Inspeccionar.

Esto nos debe abrir la consola de desarrollo de Google Chrome, con el elemento que elegimos seleccionado. Una vez ahí, damos click derecho sobre ese elemento/nodo de HTML y elegimos la opción del menú Copiar – Copiar XPath:

Nos devolverá algo así:

//*[@id="dllsTable"]/tbody/tr[1]/td[5]

Ahora probémoslo en nuestra fórmula de =IMPORTXML(). Antes de pegarlo así como está, fíjate que seas congruente con las comillas y las dobles comillas, yo tuve que cambiar las dobles comillas a comillas simples en id='dllsTable' para que no diera error la fórmula:

=IMPORTXML(A1, "//*[@id='dllsTable']/tbody/tr[1]/td[5]")

NOTA: Si el contenido de la página es dinámico, es decir, se genera después de cargada la página con JavaScript, este método no funcionará. Esto me pasó con las páginas de Banamex y de Bancomer.

Web scraping con IMPORTHTML en Google Sheets

Existe otra función alternativa, que aunque es más limitada por ser más específica, también nos puede ayudar, se llama =IMPORTHTML(). Podemos usarla para obtener la tabla completa si así lo deseamos. Para esta función necesitamos

  1. La URL que ya tenemos
  2. Especificar si queremos un elemento de listtable. (Está limitada a estos dos elementos de HTML nada más, <ul><table>.)
  3. El número de tabla o lista que queramos, en orden. Ej. 1 es la primera que aparezca siempre.

Entonces, con esta fórmula y la misma URL, podemos tener la tabla completa de divisas de todos los bancos:

=IMPORTHTML(A2,"table",1)

Un ejemplo más

Vamos a probar con un artículo de una página de e-commerce, por ejemplo una pantalla en Best Buy:

  1. La URL: https://www.bestbuy.com.mx/p/samsung-pantalla-de-43-tv-4k-ultra-hd-smart-hdr-plana-negro/1000214731
  2. XPath: "//*[@id='widget-667a5176-6029-414e-8c0c-b8f6f87c0f07']/div/div/div[3]"

Este es el resultado:

[followall link=”http://bit.ly/2DJsdG8″]

Guía en video

Si tienes dudas, puedes ver esta misma guía publicada en video:

¡Espero que te haya sido útil esta guía! No olvides seguirnos en Twitter y Facebook para más tips, trucos y guías de productividad.

Si tienes dudas, deja un comentario y con gusto te ayudaremos a resolverlas.

¿Quieres tener las herramientas de oficina de Google (G Suite) en tu empresa? ¡Contáctanos!

Aprende Sheets: Curso práctico de Hojas de cálculo de Google

30 respuestas a «Extraer datos de sitios web con Google Sheets (web scraping)»

Hola! Muy interesante! Una consulta: que método debería utilizar si deseo hacer el scraping en una dinámica? Gracias!

¡Hola Matías! Este método funciona solamente para contenido estático, ya que estamos directamente procesando lo que el servidor nos da al pedir la página por HTTP. Para hacer scraping en información dinámica puedes usar una herramienta que tal cual emula el comportamiento del navegador, como Selenium, y tendrás mucho más control sobre lo que procesas, pero no es tan directo como en este caso 😉

Muy interesante! Pero planteo una duda, quiero exportar en un txt un dato (imaginemos un precio), que se actualiza automáticamente en la web. ¿Cómo lo hago? Es decir, que el txt me muestre sólo la cifra “130” y si esta cambia el txt también, como a “150” por ejemplo.

Gracias, un saludo.

bien ahi. no conocía la función XML… es muy práctica y complementaria de la HTML, especialmente cuando esta ultima no funciona. Gracias!

Tienes razón, IMPORTXML está muy limitada, pero para muchos casos es suficiente dada su facilidad de uso e implementación. En un futuro trataré temas más avanzados de scraping, gracias por el link!

Hola José Manuel, qué bueno que te haya servido. Para eso parece que tendrías que primero extraer la descripción ej. si pones en A1: =IMPORTXML("https://simple.ripley.cl/cama-europea-cic-new-ortopedic-king-2000372222282p","//*[@id='panel-Descripción']/div") y después usar algún método para extraer el dato que quieres desde el texto, usando fórmulas como REGEXTRACT así =REGEXEXTRACT(A1,"Tamaño:(.*)Tipo"). Se puede complicar un poco si la descripción varía, si requieres ayuda directamente por favor contáctanos en contacto@tesel.tech . ¡Un saludo! 😀

Hola como estás? Excelente aporte!! Mi problema es que ahora quiero utilizar el resultado traido de la web en una operación y me lo toma como texto… probe varias cosas pero no hay caso, lo sigue tomando como texto. Algun consejo ?? Gracias !

Hola Nicolás, con mucho gusto, gracias por tu comentario. Respecto a la pregunta, lo podrías arreglar usando la fórmula VALUE() para obtener el valor como número en vez de texto. Espero que te sirva 😀

Genial tu explicación! He intentado hacerlo en webs como Booking.com o Expedia para hacer seguimiento de un hotel específico, pero no funciona. Será que esas webs están protegidas de alguna manera? alguna idea?

Hola Adrián, con gusto, gracias por tu comentario. Así es, esas páginas caen dentro de la categoría de dinámicas, es decir, el contenido se genera al momento de la consulta y no es posible usar IMPORTXML con ellas porque se espera una página estática.

Genial, muy buenas la solución. Sin embargo, si necesito extraer datos de una búsqueda de Google, ¿cuáles son los pasos que debo seguir?

Hola, muy buen video! pero he estado intentando conectar las estadisticas (monthly incomes) de Youtube Studio a Google Sheets pero parece no ser posible. Hay alguna forma?

Mi problema es que ahora quiero utilizar el resultado traido de la web en una operación y me lo toma como texto y no me funciona la función Value() ME PUEDES AYUDAR POR FAVOR!

Hola! me encantó esta función y estoy queriendo darle un pequeño ajuste sin suerte, lo que quiero hacer es mostrar el valor del Dolar Blue de esta pagina “https://dolarhoy.com/cotizaciondolarblue”, el xpath es “//[@id=”sitio”]/section/div/div[2]/div[2]/div[1]/div[2]/div[1]/div[2]” y la formula debería ser <<=IMPORTFROMWEB(https://dolarhoy.com/cotizaciondolarblue://[@id=”sitio”]/section/div/div[2]/div[2]/div[1]/div[2]/div[1]/div[2])>> es correcto? porque me da error 🙁

Muy interesnate tu artículo, inteté ponerlo en uso pero me da el siguiente erro cuando intento conseguir el título de la página web: el contenido de la url supera el tamaño máximo

Hola, quiero ver si me pueden apoyar, tengo que consultar el estatus de los vuelos de un aeropuerto en una pagina de internet, para ello, entro a la siguiente pagina de internet https://flightaware.com/live/flight/ y en el buscador pongo el numero de vuelo por ejemplo AMX512 y la informacion que me arroje la comparto en diversos grupos de whatsapp, quiero hacer un scraping con esto pero no me aparece un error, supongo que esto es por que la pagina es dinamica,¿ me pueden ayudar en revisar y decirme que opciones tengo para lograr hacer lo que deseo?
saludos

Deja un comentarioCancelar respuesta

Salir de la versión móvil