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:
- La URL (ya la tenemos)
- 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
- La URL que ya tenemos
- Especificar si queremos un elemento de list o table. (Está limitada a estos dos elementos de HTML nada más,
<ul>
o<table>
.) - 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:

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

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!
Alekz es un apasionado de la tecnología y los videojuegos. Disfruta de la expresión artística más sastisfactoria y técnica que existe, programar. Fundó Tesel en 2017 para ayudar a empoderar a las empresas a desarrollar su máximo potencial mediante la tecnología. Sus libros favoritos incluyen Dune, Ender’s Game y la saga de la Torre Obscura de Stephen King. Tiene un canal de YouTube en el que habla de videojuegos.
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 😉
Hola Matías,
Te aconsejo echar un vistazo a la versión más avanzada IMPORTFROMWEB
https://chrome.google.com/webstore/detail/mnaonjbjllejbllmijlgcjhcgdpdgmln
Ha cambiado el enlace: Ahora se puede instalar el add-on aquí:
https://gsuite.google.com/marketplace/app/importfromweb_easy_web_scraping/278587576794
genio genio genio!
tal cual lo que necesitaba!
¡Qué bueno que te sirvió! 🙂 Síguenos en Twitter y Facebook para más contenido como este.
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.
Este método lee directamente de un formato XML (HTML puede interpretarse como XML), entonces ese dato lo deberías tener en un archivo xml que se generara en el backend (con código de servidor, como PHP, Java o Python, por ejemplo). Eso es para leer el dato. Si lo que quieres es exportar el dato desde tu hoja de cálculo, te recomiendo este otro artículo nuestro: https://tesel.mx/exportar-datos-de-google-sheets-a-json-en-tiempo-real-4230/
Justo acabo de comentarte esta duda en otro artículo tuyo y voalá!! me topo con esto!… Eres un Genio y lo que le sigue.
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!
Hola Aleksz,
Si notas que ImportXML es demasiado limitada, puedes probar ImportFromWeb…
Puede scrapear hasta miles de resultados en Google, paginas con Javascript, etc… ¡lo que con ImportXML es imposible!
https://nodatanobusiness.com/importfromweb/
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!! Tenes algún explicativo de como implementar esta función?
Hola Jeremías. Sí, en este video explico paso a paso este mismo proceso: https://youtu.be/tB-LyxAhWSo
Espero que te sea de ayuda. También puedes suscribirte a nuestro canal de YouTube ahí mismo para aprender más.
Hola, quiero raspar los datos de una tabla. son 3 datos pero no lo consigo ni siquiera con el complemento importfromweb. La web es
http://finra-markets.morningstar.com/BondCenter/TRACEMarketAggregateStats.jsp
los datos de la tabla son
All Issues
Advances 3438
Declines 5415
Unchanged 113
Dollar Volume* 37837
Es posible? .
Pueden ayudarme?
Saludos