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:
[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!
Alekz es un apasionado de la tecnología y los videojuegos. Además de ser locutor comercial, disfruta de la expresión artística más sastisfactoria y técnica que existe: programar (y pintar algo de pixel art). Fundó Tesel para ayudar a empoderar a las empresas a desarrollar su máximo potencial mediante la tecnología. Es un absoluto nerd de Star Trek.
Alekz es un apasionado de la tecnología y los videojuegos. Además de ser locutor comercial, disfruta de la expresión artística más sastisfactoria y técnica que existe: programar (y pintar algo de pixel art). Fundó Tesel para ayudar a empoderar a las empresas a desarrollar su máximo potencial mediante la tecnología. Es un absoluto nerd de Star Trek.
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
Justo lo que necesitaba!
Hola Me sirvió mucho, como lo hacemos cuando queremos extraer un tamaño de una ficha técnica por ejemplo:
https://simple.ripley.cl/cama-europea-cic-new-ortopedic-king-2000372222282p?s=o
En especificaciones, el tamaño king.
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?
Hola. Gracias por el artículo. Yo he probado estos métodos y no me han funcionado en la página de
https://www.barrons.com/market-data/stocks
para obner datos del Markets Diary. Imagino que será necesario otro método más elaborado. Alguna idea?
Gracias.
Sldos.
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
Muy bueno!! Quisiera consultar si es viable extraer de esta forma data de reportes de Data Studio por ejemplo.. he probado y no lo logro. Gracias!!
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