Web Scraping con VBA

Tienes que añadir un widget, una fila o un diseño preconstruido antes de que puedas ver algo aquí. 🙂

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
(*)Opcional
(**)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
(*)Repetir la estructura de este Loop por cada elemento de interés.

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:

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ónCódigo en página webPara acceder al elemento
ClaseClassExplorador.getElementsByClassName(“Nombre de la clase”)
IdentificaciónIdExplorador.getelementbyid(“Nombre identificación“)
EtiquetaTagExplorador.getElementsByTagName(“Nombre de la etiqueta“)
AtributoNombre del atributoExplorador.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.

Web Scraping con VBA

También te puede interesar

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *