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:
- Se conecten a una página web en un navegador.
- Analicen el contenido HTML de la página web.
- Extraigan datos de dicha página.
- 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:
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:
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:
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\
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:
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:
Después, pulsa «Opciones» como se muestra a continuación:
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»:
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»:
Se abrirá la siguiente ventana:
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:
Esto es lo que deberías estar viendo ahora mismo:
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…»
En la ventana emergente, busca «Selenium Type Library» y échale un vistazo:
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»:
Se abrirá la siguiente ventana de Edge:
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»:
Aquí puedes ver que cada elemento HTML de país es
.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:
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»:
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!
No se requiere tarjeta de crédito