El Web Scraping o Data Scraping es una técnica en los lenguajes de programación usada para obtener información de interés de una página web de forma automática. El VBA nos ofrece también la posibilidad de navegar, leer e ingresar datos en una página o aplicación web de forma automatizada, lo cual permitiría completar en pocas horas un trabajo manual de extracción de información que podía demorar varios días. La herramienta principal del VBA para navegar en la web es el Internet Explorer, aunque recientemente se han popularizado algunas aplicaciones externas que permiten controlar desde VBA la experiencia en la web con navegadores como el Chrome y Mozila Firefox. Sin embargo, en este tutorial hablaremos sobre cómo realizar el web scraping con VBA e Internet Explorer a través de la manipulación de los elementos HTML de la página web.
1. Acciones llevadas a cabo durante la extracción automática de datos Web
La interacción con la web a través del VBA se consigue principalmente con 3 acciones que se ejecutan sobre el código HTML de la página o aplicación web:
1.1. Lectura de la página:
Una vez que nos disponemos a realizar una extracción automática de datos web, en primer lugar debemos definir cuáles son los datos que necesitamos extraer y cuáles son los botones, opciones o campos de entrada que debemos manipular para obtener estos datos. Los datos y botones están almacenados dentro de unas etiquetas o “Tags” dentro del código HTML de la página web. Estas etiquetas deben ser identificada empleando una técnica que te explicaremos más adelante.
1.2. Ingreso de información:
En similitud con la experiencia del usuario al navegar en la web, en la mayoría de las ocasiones será necesario que escribamos textos en los campos de entrada de datos de la página o aplicación web. Estos campos de entrada ya deben estar previamente identificados durante el proceso de lectura de los elementos HTML de la página.
1.3. “Click”:
Esta actividad simula el acceso a vínculos o botones de las páginas web a través del Clic del mouse.
A lo largo del tutorial iras aprendiendo los códigos de programación para ejecutar estas acciones.
Así como cuando al navegar en la web, haces una revisión de la página para saber dónde está la información que necesitas, también el VBA debe hacerlo, por lo tanto debemos ser bien explícitos y sistemáticos en nuestra navegación automática para asegurarnos de estar obteniendo la información adecuada. ¡Esto es clave para lograr un exitoso Web Scraping!.
2. Ejemplo de Web Scraping con VBA
Ok, luego de tantas explicaciones es momento de la acción. Hagamos el ejercicio de buscar y escribir en una celda la temperatura de una ciudad cada vez que ejecutemos una macro.
Existen varias páginas web asociadas con el clima y puedes seleccionar cualquiera de ellas; nosotros escogimos para este ejercicio la página https://weather.com/es-VE/ para extraer la temperatura de la ciudad Maracaibo, Venezuela.
Lo primero que debemos hacer es declarar en VBA el explorador web a usar y colocar la url de la página web tu interés, siguiendo la estructura que te mostramos a continuación:
Set Variable Asignada Al Explorador = CreateObject(«InternetExplorer.Application») With Variable Asignada Al Explorador .MenuBar = 0 o 1(*) .Toolbar = 0 o 1(*) .StatusBar = 0 o 1(*) .Visible = 0 o 1(*) (**) End With |
(**)Si deseas que explorador se ejecute como no visible selecciona 0, de lo contrario selecciona 1.
Ejemplo de llamado de url mediante VBA:
'---> Declara explorador <---
Set ie = CreateObject("InternetExplorer.Application")
With ie
.MenuBar = 1
.Toolbar = 1
.StatusBar = 1
.navigate “https://weather.com/es-VE/tiempo/hoy/l/fab4b8bb005020eb0f895a19b541c80a8e00641f7f550cf15c74273446aea5b8”
.Visible = 0
End With
Cuando navegas normalmente en la web y escribes una url en la barra de navegación, usualmente debes esperar unos segundos para que cargue completamente la página; el VBA también debe asegurarse de que la página este cargada previo a ejecutar cualquier acción, por eso no debes olvidar incluir el procedimiento que te mostramos a continuación cada vez que se carga o actualiza una página:
Do While Variable Asignada Al Explorador.Busy Or Variable Asignada Al Explorador.readyState <> 4 DoEvents Loop Application.Wait Now + Tiempo |
Ejemplo de inclusión de tiempo de espera al cargar una página web en VBA:
Do While ie.Busy Or ie.readyState <> 4 DoEvents Loop Application.Wait Now + #12:00:01 AM# 'Espera 1 segundo
Al final de este paso a paso podrás ver todo el código completo para que puedas usarlo como base en tus propios proyectos de Automatic Web Scraping.
3. ¿Cómo leer la página web?
Ubicar correctamente los campos de la página web con los que deseamos interactuar es el punto clave en el Web Scraping, ya que si hacemos un clic o ingresamos la información en el lugar equivocado, estaríamos corriendo el riesgo de extraer información errada o simplemente obtendríamos un error en nuestro programa.
Una página web es la interfaz de la información contenida en un servidor; esta vista es lo que se conoce como “Front End”. Es aquí donde aparece el lenguaje HTML (en combinación con otros lenguajes como CCS y javascript) que agrupa y clasifica la información en diferentes clases, identificadores o etiquetas. Para encontrar cualquier elemento de la página web debemos conocer cuál es la denominación de éste dentro del código.
La mejor forma de ubicar la denominación de los elementos en la página web es indagando en su código fuente mediante la ventana de «Herramientas de desarrollo» del Internet Explorer, que se muestra a través del menú de configuración. Para ello puedes abrir la página web de tu interés y presionar F12, luego dirígete a la pestaña “Explorador DOM”.
En nuestro ejemplo, el elemento de interés dentro de la página web es el que contiene la información de la temperatura. En el código HTML podríamos tratar de identificar manualmente el Tag de este elemento, pero eso podría llevarnos mucho tiempo, es por ello que la mejor forma de identificar el elemento de interés es emplear el seleccionador de elementos de las herramientas de desarrolladores (flecha ubicada en la parte superior izquierda del explorador DOM). Luego de presionar esa flecha o puntero solo tendrás que seleccionar tu variable de interés directamente en la página web.
Verás que en la ventana del Explorador DOM se resaltará la línea de código con el identificador del elemento que necesitamos.
En este ejemplo los elementos de interés están almacenados en una Clase (“Class”). Cada clase tiene un nombre, así que sólo restaría acceder a las clases cuyos nombres se correspondan con los parámetros de ubicación, temperatura y la hora de actualización de la página. Esta información la almacenaremos en unas celdas de la hoja de Excel, siguiendo la estructura que te mostramos a continuación:
With Variable Asignada Al Explorador Set Variable para Tipo de elemento = Obtener elemento según denominación For Each Variable de búsqueda In Variable para Tipo de elemento(*) Celda de Excel = Texto de Variable de búsqueda Next End With |
Ejemplo para extraer la información contenida en elementos de una web:
With ie.document 'Ubicación Set elemsLocation = .getElementsByClassName("h4 today_nowcard-location") For Each e In elemsLocation Ws.Cells(2, 2) = e.innertext Next 'Temperatura Set elemsTemp = .getElementsByClassName("today_nowcard-temp") For Each e In elemsTemp Ws.Cells(3, 2) = e.innertext Next 'Hora de actualización Set elemsUpdateTime = .getElementsByClassName("today_nowcard-timestamp") For Each e In elemsUpdateTime Ws.Cells(4, 2) = e.innertext Next End With
Listo, ya que logramos obtener la información que deseábamos, ahora no debemos olvidar cerrar el explorador, sobre todo si lo hemos colocado en modo oculto. Para ello debes seguir este código:
Variable Asignada Al Explorador.Quit |
Ejemplo de código para cerrar el Internet Explorer con VBA:
ie.Quit
4. Ejemplo de código VBA para extraer datos web de forma automática
A continuación de mostramos el ejemplo del código completo para extraer datos de una pagina web a Excel:
Sub WebScrapingExample() Dim Ws As Worksheet Dim ie As Object Set Ws = ActiveSheet Ws.Range(Ws.Cells(2, 2), Ws.Cells(4, 2)).ClearContents '--------------------------------------------------------------- '---> Declara explorador <--- Set ie = CreateObject("InternetExplorer.Application") With ie .MenuBar = 1 .Toolbar = 1 .StatusBar = 1 '---> Pagina web <--- .navigate " https://weather.com/es-VE/tiempo/hoy/l/fab4b8bb005020eb0f895a19b541c80a8e00641f7f550cf15c74273446aea5b8" .Visible = 1 '---> Seleccione 1 para Visible, 0 para Oculto End With '--->Esperar hasta que la página este cargada <--- Do While ie.Busy Or ie.readyState <> 4 DoEvents 'Para no congelar la pantalla Loop Application.Wait Now + #12:00:01 AM# 'Espera 1 segundo que cargue la página '--------------------------------------------------------------- '--- Iniciar el Data Scrape --- With ie.document 'Ubicación Set elemsLocation = .getElementsByClassName("h4 today_nowcard-location") For Each e In elemsLocation Ws.Cells(2, 2) = e.innertext Next 'Temperatura Set elemsTemp = .getElementsByClassName("today_nowcard-temp") For Each e In elemsTemp Ws.Cells(3, 2) = e.innertext Next 'Hora de actualización Set elemsUpdateTime = .getElementsByClassName("today_nowcard-timestamp") For Each e In elemsUpdateTime Ws.Cells(4, 2) = e.innertext Next End With '--------------------------------------------------------------- ie.Quit '---> Cierra Explorador MsgBox "Done!" End Sub
5. Tipos de identificación de elementos de página web
Aprendimos que para poder interactuar con los elementos HTML dentro de la página web debemos obtener su denominación única para que no haya ambigüedades. En el ejemplo que vimos los elementos estaban identificados por clases.
Es importante que conozcas otros identificadores que existen y la manera de interactuar con ellos, ya que te podrías encontrar con uno o varios de éstos en tu proyecto de extracción automática de datos web. Aquí te listamos algunos:
Denominación | Código en página web | Para acceder al elemento |
Clase | Class | Explorador.getElementsByClassName(“Nombre de la clase”) |
Identificación | Id | Explorador.getelementbyid(«Nombre identificación«) |
Etiqueta | Tag | Explorador.getElementsByTagName(«Nombre de la etiqueta«) |
Atributo | Nombre del atributo | Explorador.Elemento.getattribute(«Nombre del atributo«) |
Para llegar a nuestro elemento de interés en una página web también es válida una combinación de opciones como esta:
With Variable Asignada Al Explorador Valor=.getElementsByClassName(“Nombre de la clase”).getElementsByTagName(«Nombre de la etiqueta«) End With |
6. Ingreso de datos y Clic en elementos de una página web usando VBA.
La navegación automática en la web con VBA tiene dos formas de interacción con los elementos de la página: el ingreso de información en campos de entrada y a través de los Clics.
6.1. Ingreso de información en los elementos de una página web con VBA.
La estructura se basa en ubicar el elemento y luego escribir en él la información que deseamos ingresar.
Debes tener en cuenta que si escribes información sobre un elemento que no permita el ingreso de datos podrías tener errores en la rutina o una lectura de datos no adecuada. Por ello es que resaltamos como factor clave la ubicación correcta del elemento de interés en la página.
With Variable Asignada Al Explorador Set Variable para Tipo de elemento = Obtener elemento según denominación For Each Variable de búsqueda In Variable para Tipo de elemento Variable de búsqueda = Valor de información ingresada Next End With |
Ejemplo de escritura en elementos web usando VBA:
With ie.document 'Buscar ubicacion Set SearchLocation = .getElementsByClassName("theme__inputElement__4bZUj input__inputElement__1GjGE") For Each SL In SearchLocation SL.Value = “Maracaibo" '---> Ingreso de información Next End With
6.2. Clic sobre los elementos de una página web usando VBA
Este caso es similar al anterior, con la diferencia de que la acción sobre el elemento seleccionado es el equivalente a hacer un clic con el mouse.
With Variable Asignada Al Explorador Set Variable para Tipo de elemento = Obtener elemento según denominación For Each Variable de búsqueda In Variable para Tipo de elemento Variable de búsqueda.Click Next End With |
Ejemplo de código VBA para hacer clic en un elemento web:
With ie.document 'Buscar ubicacion Set SearchLocationButton = .getElementsByClassName( "styles__item__sCSPm")input__inputElement__1GjGE") For Each SLB In SearchLocationButton SLB.Click '---> Hace click sobre el elemento Next End With
7. Las API’s y VBA
Así como algunas páginas web tienen restricciones para el Automatic Data Scraping, otras ofrecen un servicio para facilitar el proceso a través de las denominadas Interfaces de programación, mejor conocidas como API, por sus siglas en inglés (Application Programming Interface). Algunas veces las API’s son gratuitas y otras no.
Según el tipo de información que necesites extraer es recomendable en primera instancia realizar una breve búsqueda de una API gratuita y estable (en el tiempo y en diseño), ya que esto te permitirá realizar el Web Scraping con mayor facilidad.