Guía para el raspado web con VBA

Descubre el potencial de Excel para el raspado web con VBA, una forma eficaz de automatizar la recopilación de datos para que aparezca directamente en tus hojas de cálculo.
16 min read
Web Scraping with Excel VBA main blog image

En esta guía para el raspado web con Excel, aprenderás:

  • Qué es VBA.
  • Si puedes recuperar datos de sitios web con un módulo personalizado de VBA.
  • Cómo se hace el raspado web en Excel una vez que termina el soporte técnico de Internet Explorer.
  • Cómo se escribe el código VBA para raspado web con Selenium.
  • El método tradicional para recuperar datos en línea con Excel.

¡Vamos allá!

¿Qué es VBA?

VBA es la abreviatura de Visual Basic for Applications y es un lenguaje de programación que ha sido desarrollado por Microsoft. Su objetivo es permitir que los usuarios puedan automatizar las tareas y que puedan escribir funciones personalizadas en varias aplicaciones de Microsoft Office, como Excel, Word y Access.

En Excel, el lenguaje VBA se puede utilizar para definir macros complejas que interactúan con los datos de las celdas en las hojas de cálculo. Con VBA, puedes mejorar la productividad, simplificar los flujos de trabajo y aumentar las funcionalidades de Excel más allá de sus funciones integradas.

¿Es posible hacer un raspado web en Excel con VBA?

Sí, VBA ofrece la posibilidad de realizar el raspado web directamente en Excel. Gracias a VBA, puedes escribir módulos personalizados que:

  1. Se conecten a una página web en un navegador.
  2. Analicen el contenido HTML de la página web.
  3. Extraigan datos de dicha página.
  4. Escriban los datos extraídos directamente en las celdas de Excel.

Y en eso consiste el raspado web. Por este motivo, el raspado web con VBA no solo es posible, sino que también es práctico porque importa los datos directamente a Excel. Obtén más información sobre las ventajas y los inconvenientes del raspado web en Excel en el siguiente apartado.

Ventajas e inconvenientes del raspado web en Excel

Antes de adentrarnos en cómo se escribe el código VBA para el raspado web, vamos a ver algunas ventajas e inconvenientes del raspado web en Excel utilizando VBA.

Ventajas

  • Acceso a las funciones de Excel: los datos que se extraen de la web se importan directamente a Excel y esto te permite utilizar las potentes funciones de Excel para gestionar y analizar los datos.
  • Listo para usar: Microsoft Office es compatible con VBA y esta funcionalidad ya lista para usar. Al tener Microsoft Office 365 instalado en tu ordenador, ya dispones de todo lo que necesitas para hacer el raspado web.
  • Automatización integral: gracias a la secuencia de comandos de raspado web en VBA, puedes automatizar una tarea completa de recopilación de datos, desde la recuperación de datos hasta la representación de datos en Excel.

Inconvenientes

  • Algunas funciones solo están disponibles en Windows: los paquetes de VBA para los controles Active-X y la automatización COM solo están disponibles en Windows y no funcionan en Office para Mac.
  • VBA parece estar anticuado: Visual Basic no es el lenguaje de programación más moderno que existe. Si nunca has trabajado con él, es posible que te resulte difícil usarlo porque tanto su sintaxis como su enfoque de codificación son un poco antiguos.
  • Internet Explorer está en desuso: la automatización COM de VBA para controlar un navegador web está basada en Internet Explorer, un navegador que ahora está en desuso.

El último inconveniente es bastante importante, así que es mejor que lo analicemos con más detalle.

¿Cómo se lidia con la obsolescencia de Internet Explorer a la hora de hacer raspado web en VBA?

El método tradicional para escribir código VBA para el raspado web, normalmente, se basaba en la interfaz de automatización COM que viene con el objeto InternetExplorer. Este método aportaba todo lo necesario para visitar un sitio web en Internet Explorer, para analizar su contenido HTML y para extraer datos del sitio. El problema es que Internet Explorer no es compatible desde el 15 de junio de 2022.

En otras palabras: las versiones más recientes de Windows ni siquiera vienen con Internet Explorer. La consecuencia de esto es que el uso del objeto InternetExplorer en una secuencia de comandos de VBA va a generar un error. Como Edge es el sustituto de Internet Explorer, puede que estés pensando en utilizar el objeto equivalente en VBA. Sin embargo, Edge no incluye la interfaz de automatización COM. Por lo tanto, no puedes controlar Edge mediante programación como lo hacías con Internet Explorer.

En cambio, Edge admite procesos de automatización por medio de un controlador web que se puede manejar con tecnologías de automatización de navegadores como Selenium. Por lo tanto, en la actualidad, la forma compatible que hay de hacer el raspado web en Excel con VBA es utilizando el enlace de Selenium para VBA. Así podrás controlar navegadores como Chrome, Edge o Firefox.

En el siguiente apartado, aprenderás a crear una secuencia de comandos para el raspado web en Excel con Selenium y Edge. Más adelante, también conocerás el fragmento de código del método tradicional, para el cual no hay que depender de terceros.

Cómo se escribe el código VBA para el raspado web con Selenium

En este apartado del tutorial, vas a aprender a hacer el raspado web en Excel con VBA utilizando SeleniumBasic, el enlace de la API de Selenium para VBA.

El sitio de destino será el entorno aislado Country de Scrape This Site, que contiene un listado de todos los países del mundo:

Raspado de la página del entorno aislado country de scrape this site

El objetivo del raspado web en VBA es extraer estos datos de forma automática y escribirlos en una hoja de cálculo de Excel.

¡Ha llegado la hora de escribir código VBA!

Requisitos previos

Comprueba que tienes instalada la versión más reciente de Microsoft Office 365 en tu equipo. En este apartado, se hace referencia a Windows 11 y a la actualización de Office 2024. De igual modo, los pasos que se indican a continuación serán los mismos o parecidos para macOS y para otras versiones de Office.

Ten en cuenta que necesitas tener la versión de escritorio de Office para seguir el tutorial. La versión web gratuita de Microsoft 365 no es compatible con secuencias de comandos de VBA.

Paso 1: instalar y configurar SeleniumBasic

Descarga el instalador de SeleniumBasic desde la página de lanzamiento del repositorio de GitHub:

descargando seleniumbasic

Haz doble clic en el instalador .exe y espera a que termine el proceso de instalación.

Como ocurre con la mayoría de los paquetes VBA, SeleniumBasic lleva años sin tener ninguna actualización. Este es el motivo por el que viene con controladores web que ya no funcionan con los navegadores más nuevos. Para solucionarlo, tienes que desactivar de forma manual los archivos ejecutables de los controladores en la carpeta de instalación de SeleniumBasic.

Aquí puedes ver cómo desactivar el controlador web de Edge, pero puedes seguir los mismos pasos para Chrome y Firefox.

Primero, descarga la versión más reciente de Stable de Microsoft Edge WebDriver:

descargando de la última versión de stable del controlador web de edge

La versión que necesites, seguramente, sea la «x64».

Ahora tienes que tener un archivo edgedriver_win64.zip. Descomprímelo, entra en la carpeta descomprimida y comprueba que contiene un archivo ejecutable msedgedriver.exe. Este es el ejecutable de Edge WebDriver.

Cámbiale el nombre a «edgedriver.exe» y ahora vamos a colocarlo en la carpeta correcta.

Abre la carpeta de instalación de SeleniumBasic que encontrarás en:

C:\Users\\AppData\Local\SeleniumBasic

Coloca edgedriver.exe dentro de esta carpeta y desactiva el ejecutable de Edge WebDriver que hay.

¡Genial! Ahora SeleniumBasic podrá controlar la última versión de Edge en Excel.

Paso 2: abrir Excel

Abre el menú de inicio de Windows, escribe «Excel» y haz clic en la aplicación «Excel». Elige la opción «Libro en blanco» para crear una nueva hoja de cálculo:

Abrir una hoja nueva en Excel

Al final de este apartado, esta hoja contendrá los datos que hayas extraído.

Paso 3: habilitar la pestaña «Programador»

Si te fijas en las pestañas de la barra superior, verás que no hay ninguna opción de crear una secuencia de comandos en VBA. Esto es porque, primero, tienes que habilitarlo en la configuración de Excel.

Para ello, haz clic en «Archivo» en la esquina superior izquierda:

haciendo clic en archivo en la esquina superior

Después, pulsa «Opciones» como se muestra a continuación:

Pulsando «Opciones»

En la ventana emergente «Opciones», ve a la pestaña «Cinta personalizada» y marca la opción «Programador» en la sección «Pestañas principales»:

comprobando la opción programador en la cinta personalizada

Pulsa «Guardar» y aparecerá una nueva pestaña de «Programador»:

Paso 4: iniciar un módulo de raspado web con VBA

Haz clic en la pestaña «Programador» y pulsa el botón «Visual Basic»:

haciendo clic en visual basic en la pestaña programador

Se abrirá la siguiente ventana:

la ventana que se acaba de abrir con un fondo gris

En esta ventana, haz clic en «Insertar» en el menú de la barra superior y, después, pulsa «Módulo» para iniciar tu módulo de raspado web con VBA:

haciendo clic en módulo en la pestaña insertar

Esto es lo que deberías estar viendo ahora mismo:

el nuevo módulo que se acaba de abrir

La ventana interior «Libro1 – Módulo1 (Código)» es donde tienes que escribir tu código VBA para hacer el raspado web.

Paso 5: importar SeleniumBasic

En el menú de la barra superior, haz clic en «Herramientas» y, después, en «Referencias…»

haciendo clic en referencias dentro de herramientas

En la ventana emergente, busca «Selenium Type Library» y échale un vistazo:

comprobando el formulario selenium type library en opciones

Haz clic en el botón «Guardar» y ya podrás utilizar Selenium en Excel para hacer el raspado web.

Paso 6: automatizar Edge para abrir el sitio de destino

Pega el siguiente código en la ventana del módulo VBA:

Sub scrape_countries()

' initialize a Selenium WebDriver instance

Dim driver As New WebDriver

' open a new Edge window

driver.Start "Edge"

' navigate to the target page

driver.Get "https://www.scrapethissite.com/pages/simple/"

' wait 10 seconds before shutting down the application

Application.Wait Now + TimeValue("00:00:10")

' close the current driver window

driver.Quit

End Sub

Esto inicia una instancia de Selenium y la usa para darle indicaciones a Edge para que visite la página de destino. Prueba el código haciendo clic en el botón «Ejecutar»:

haciendo clic en el botón ejecutar para probar el código

Se abrirá la siguiente ventana de Edge:

la ventana de Edge que se ha abierto

Observa el mensaje que aparece que dice «Microsoft Edge está siendo controlado por un software automatizado de prueba» y que indica que has decidido que Selenium funcione en Edge.

Si no quieres que aparezca Edge, puedes habilitar el modo sin encabezado con esta línea de código:

driver.SetCapability "ms:edgeOptions", "{""args"":[""--headless""]}"

Paso 7: inspecciona el código HTML de la página

En el raspado web se seleccionan elementos HTML en una página y se recopilan datos de estos elementos. Los selectores CSS se encuentran entre los métodos más conocidos para seleccionar nodos de HTML. Si eres un desarrollador web, seguramente ya los conozcas. Si no es tu caso, echa un vistazo a la guía oficial.

Para definir selectores CSS eficaces, primero tienes que familiarizarte con el HTML de la página de destino. Así que tienes que abrir el entorno aislado Country de Scrape This Site en el navegador, hacer clic con el botón derecho en un elemento de país y elegir la opción «Inspeccionar»:

utilizando la opción inspeccionar

Aquí puedes ver que cada elemento HTML de país es

y puedes seleccionarlo con el siguiente selector CSS:

.country

Cuando hay un nodo .country en HTML, tienes que segmentar:

  • El nombre del país en el elemento .country-name.
  • El nombre de la capital en el elemento .country-capital.
  • Los datos de la población en el elemento .country-population.
  • El área en km² que ocupa el país en el elemento .country-area.

Estos son todos los selectores CSS que necesitas para seleccionar los nodos en HTML que quieres para extraer datos de ellos. Aprende a utilizarlos en el siguiente paso.

Paso 8: escribe la lógica de raspado web en VBA

Utiliza el método findElementsByCSS () que muestra el controlador para aplicar el selector CSS the.country y selecciona todos los nodos de HTML de países de la página:

Dim countryHTMLElements As WebElements

Set countryHTMLElements = driver.FindElementsByCss(".country")

Then, define an integer counter to keep track of the current Excel row to write data in:

Dim currentRow As Integer

currentRow = 1

A continuación, repite esto en los nodos de HTML del país, extrae los datos que quieras de estos nodos y trasládalos a las celdas de Excel con la función Cells ():

For Each countryHTMLElement In countryHTMLElements

' where to store the scraped data

Dim name, capital, population, area As String

' data retrieval logic

name = countryHTMLElement.FindElementByCss(".country-name").Text

capital = countryHTMLElement.FindElementByCss(".country-capital").Text

population = countryHTMLElement.FindElementByCss(".country-population").Text

area = countryHTMLElement.FindElementByCss(".country-area").Text

' write the scraped data in Excel cells

Cells(currentRow, 1).Value = name

Cells(currentRow, 2).Value = capital

Cells(currentRow, 3).Value = population

Cells(currentRow, 4).Value = area

' increment the row counter

currentRow = currentRow + 1

Next countryHTMLElement

¡Increíble! Ya solo te queda echarle un vistazo al código final de raspado web en Excel.

Paso 9: júntalo todo

Ahora, tu módulo de raspado web con VBA debería contener lo siguiente:

Sub scrape_countries()

' initialize a Selenium WebDriver instance

Dim driver As New WebDriver

' enable the "headless" mode

driver.SetCapability "ms:edgeOptions", "{""args"":[""--headless""]}"

' open a new Edge window

driver.Start "Edge"

' navigate to the target page

driver.Get "https://www.scrapethissite.com/pages/simple/"

' select all country HTML nodes on the page

Dim countryHTMLElements As WebElements

Set countryHTMLElements = driver.FindElementsByCss(".country")

' counter to the current row

Dim currentRow As Integer

currentRow = 1

' iterate over each country HTML node and

' apply the Excel scraping logic

For Each countryHTMLElement In countryHTMLElements

' where to store the scraped data

Dim name, capital, population, area As String

' data retrieval logic

name = countryHTMLElement.FindElementByCss(".country-name").Text

capital = countryHTMLElement.FindElementByCss(".country-capital").Text

population = countryHTMLElement.FindElementByCss(".country-population").Text

area = countryHTMLElement.FindElementByCss(".country-area").Text

' write the scraped data in Excel cells

Cells(currentRow, 1).Value = name

Cells(currentRow, 2).Value = capital

Cells(currentRow, 3).Value = population

Cells(currentRow, 4).Value = area

' increment the row counter

currentRow = currentRow + 1

Next countryHTMLElement

' close the current driver window

driver.Quit

End Sub

Ejecútalo y espera a que termine de ejecutarse el módulo. Al final de la secuencia de comandos de VBA, la hoja de cálculo de Excel incluirá la siguiente información:

hoja de Excel con los datos extraídos

Este archivo contiene los mismos datos que el sitio de destino, pero en un formato semiestructurado. Ahora podrás examinar y filtrar estos datos de forma mucho más fácil gracias a las funciones de Excel.

¡Ya está! Acabas de hacer un raspado web en Excel con menos de 100 líneas de código VBA.

Puedes obtener más información en nuestra guía sobre cómo funciona el raspado web en Excel.

Método tradicional del raspado web en VBA con Internet Explorer

Si estás utilizando una versión anterior de Windows, puedes hacer un raspado web en VBA con Internet Explorer.

Lo único que tienes que hacer es habilitar las referencias «Microsoft HTML Object Library» y «Microsoft Internet Controls»:

habilitando microsoft html object library y microsoft internet controls

Ten en cuenta que estos dos paquetes están integrados en Excel, así que, en esta ocasión, no hace falta que instales bibliotecas adicionales.

De este modo, puedes conseguir el mismo resultado que antes con el siguiente código VBA para el raspado web:

Sub scrape_countries()

' start Internet Explorer

Dim browser As InternetExplorer

Set browser = New InternetExplorer

' enable the "headless" mode

browser.Visible = False

'visit the target page

browser.navigate "https://www.scrapethissite.com/pages/simple/"

' wait for the browser to load the page

Do: DoEvents: Loop Until browser.readyState = 4

' get the current page

Dim page As HTMLDocument

Set page = browser.document

' retrieve all country HTML nodes on the page

Dim countryHTMLNodes As Object

Set countryHTMLElements = page.getElementsByClassName("country")

' counter to the current row

Dim currentRow As Integer

currentRow = 1

' iterate over each country HTML node and

' apply the Excel scraping logic

For Each countryHTMLElement In countryHTMLElements

' where to store the scraped data

Dim name, capital, population, area As String

' data retrieval logic

name = countryHTMLElement.getElementsByClassName("country-name")(0).innerText

capital = countryHTMLElement.getElementsByClassName("country-capital")(0).innerText

population = countryHTMLElement.getElementsByClassName("country-population")(0).innerText

area = countryHTMLElement.getElementsByClassName("country-area")(0).innerText

' write the scraped data in Excel cells

Cells(currentRow, 1).Value = name

Cells(currentRow, 2).Value = capital

Cells(currentRow, 3).Value = population

Cells(currentRow, 4).Value = area

' increment the row counter

currentRow = currentRow + 1

Next countryHTMLElement

' close the current Internext Explorer window

browser.Quit

End Sub

Ejecuta este módulo de VBA y tendrás el mismo resultado que antes. ¡Estupendo! Acabas de hacer el raspado web en Excel con Internet Explorer.

Conclusión

En esta guía, has aprendido qué es VBA y por qué te ayuda a hacer raspados web en Excel. El problema es que la biblioteca de automatización del navegador en VBA depende de Internet Explorer, un navegador que ya no es compatible. Sin embargo, has descubierto un método equivalente para automatizar la recuperación de datos en Excel con VBA utilizando Selenium. Además, has visto también el método tradicional para las versiones anteriores de Windows.

Tienes que tener en cuenta que hay muchos retos de los que hay que ser consciente a la hora de extraer datos de internet. Concretamente, la mayoría de los sitios adoptan tecnologías antiraspado y antibot que pueden detectar y bloquear tu secuencia de comandos para el raspado web con VBA. Puedes evitar estos obstáculos con nuestra solución Scraping Browser. Este navegador de última generación se integra con Selenium y te ayuda a gestionar de forma automática la resolución de CAPTCHA, la toma de huellas dactilares del navegador, los reintentos automáticos y mucho más.

¿No te interesa para nada el raspado web, pero sí los datos en Excel?Echa un vistazo a nuestros conjuntos de datos. ¿No tienes claro qué solución de datos elegir? ¡Ponte ya en contacto con nosotros!