Antes de empezar, hay que aclarar qué es en VBA el data scraping si usamos Selenium. Primero, Selenium puede ser clasificado como una herramienta de automatización que facilita el scraping desde páginas web HTML para realizar un scraping web (o bien, web scraping) utilizando Google Chrome. Si no la tienes instalada, la puedes encontrar aquí
Hoy lo que vamos a ver es cómo preparar un macro de Excel antes de hacer un data scraping usando Selenium, cómo abrir Google Chrome por medio de VBA, así como abrir un sitio web en Chrome por medio de VBA y cómo hacer un scraping de información, igual por medio de VBA.
Antes de iniciar.
Hay un error muy común a la hora de querer ejecutar Selenium en Windows 10, y esto se debe a un driver que no viene en la versión necesaria. Si al correr lo que viene abajo te presenta el error “automation error” debes hacer lo siguiente:
- Encuentra tu carpeta de Selenium: Regularmente en “C:\Users\tu_usuario\AppData\Local\SeleniumBasic\Scripts”.
- En los scripts, ejecuta el que se llama “StartChrome.vbs”. Si abre sin problema, continua con las macros; en caso contrario, instala el driver que solicita el script.
¿Cómo prearar un macro de Excel antes de hacer data scraping usando Selenium?
Para poder hacer un data scraping tenemos que cumplir con ciertos pre-requisitos en el macro del archivo antes de empezar en Excel. Estos requisitos son:
Abrir VBA Excel, acceder a la pestaña de «Desarrollador» de Excel y buscar la opción de «Visual Basic»:
Insertaremos un nuevo módulo:
Ahora vamos a iniciar una nueva subrutina y la nombraremos (en este caso se llamará «test2»):
Sub data_scrapping()
End sub
Lo siguiente serán los resultados en el módulo:
Accederemos a la opción de referencia bajo la barra de herramientas y lo referenciaremos como una librería de tipo Selenium. Estas librerías serán referenciadas al módulo ya que ayuda al abrir Google Chrome y facilita el desarrollo para escribir macros.
Con esto el archivo de Excel estará listo para interactuar con el navegador de internet. Los siguientes pasos serán para incorporar un script de macro que facilitará el raspado de datos en HTML.
Cómo abrir Microsoft Chrome usando VBA
Primero vamos a declarar e iniciar las variables en esta subrutina:
Sub data_scrapping()
Dim wb As Workbook, sh As Worksheet
Dim driver As New WebDriver
Dim rTable As Integer, cTable As Integer, i As Integer
Dim tr As Variant, th As Variant, t As Variant
'Variables de libro y hoja
Set wb = ThisWorkbook
Set ws = wb.Sheets(1)
' Variables de fila y columna definidas
rTable = 2
cTable = 1
i = 1
Set ws = Nothing
Set wb = Nothing
End Sub
Para abrir Edge Chrome por medio de Selenium y VBA, escribiremos «write driver.start «chrome»» y presionaremos F5. Este vendría a ser el código que necesitaremos:
Sub data_scrapping()
Dim wb As Workbook, sh As Worksheet
Dim driver As New WebDriver
Dim rTable As Integer, cTable As Integer, i As Integer
Dim tr As Variant, th As Variant, t As Variant
'Variables de libro y hoja
Set wb = ThisWorkbook
Set ws = wb.Sheets(1)
' Variables de fila y columna definidas
rTable = 2
cTable = 1
i = 1
'Iniciamos selenium
driver.Start "Chrome"
Application.Wait Now + TimeValue("00:00:05")
Set ws = Nothing
Set wb = Nothing
driver.Close
End Sub
El módulo dará este resultado:
Cómo abrir un sitio web en Google Chrome usando VBA
Una vez podamos acceder a Google Chrome usando VBA podremos empezar a incorporar el acceder a un sitio web por medio de VBA. Esto facilitará la función get, mientras que la URL debe pasar con doble comillas en el atributo. Para entender esto mejor, el módulo debe verse de esta manera:
Sub data_scrapping()
Dim wb As Workbook, sh As Worksheet
Dim driver As New WebDriver
Dim rTable As Integer, cTable As Integer, i As Integer
Dim tr As Variant, th As Variant, t As Variant
'Variables de libro y hoja
Set wb = ThisWorkbook
Set ws = wb.Sheets(1)
' Variables de fila y columna definidas
rTable = 2
cTable = 1
i = 1
'Iniciamos selenium
driver.Start "Chrome"
driver.Get "https://excelcute.com/table-demo/"
Application.Wait Now + TimeValue("00:00:05")
Set ws = Nothing
Set wb = Nothing
driver.Close
End Sub
Presionaremos F5 para ejecutar el macro. La siguiente página web se abrirá en Google Chrome tal y como se muestra:
Con esto el macro de Excel está listo para empezar a realizar tareas de scraping. El siguiente paso nos mostraría cómo podemos extraer la información si aplicamos Selenium y VBA.
Cómo hacer data scraping de un sitio web usando VBA
Supongamos que el day trader quiere acceder a la información del sitio web a diario. Cada vez que presione el botón, se extraerán los datos de mercado automáticamente a Excel. Del sitio web de arriba, sería necesario inspeccionar un elemento y observar cómo es que los datos están estructurados. Para acceder al código fuente de HTML habrá que presionar CTRL + Shift + I.
<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>a</th>
<th>b</th>
<th>c</th>
</tr>
</thead>
<tbody>
<tr>
<td>a1</td>
<td>b1</td>
<td>c1</td>
</tr>
<tr>
<td>a2</td>
<td>b2</td>
<td>c2</td>
</tr>
<tr>
<td>a3</td>
<td>b3</td>
<td>c3</td>
</tr>
</tbody>
</table>
</figure>
Tal y como se puede ver, los datos están estructurados como una sola tabla HTML. Por lo tanto, para extraer todos los datos de la tabla HTML, se necesitaría diseñar un macro que extraiga la información de encabezado de la tabla HTML y la información correspondiente asociada con la tabla. Ahora habrá que seguir estos pasos:
- Formular un ciclo «for» que se ejecute a través de la información de encabezado HTML como una colección. El driver selenium tiene que encontrar la información de encabezado de la tabla HTML. Para hacer esto, vamos a utilizar los métodos FindElementByClass() y FindElementByTag() para hacer la función tal y como se muestra. El módulo VBA se vería de la siguiente forma:
' Data scrapping de encabezados
For Each th In driver.FindElementByClass("wp-block-table").FindElementByTag("thead").FindElementsByTag("tr")
i = 1
For Each t In th.FindElementsByTag("th")
ws.Cells(1, i).Value = t.Text
i = i + 1
Next t
Next th
Después, el driver selenium localizará la tabla de datos usando un acercamiento similar, por lo que habrá que escribir el siguiente código:
' Data scrapping de filas
For Each tr In driver.FindElementByClass("wp-block-table").FindElementByTag("tbody").FindElementsByTag("tr")
cTable = 1
For Each td In tr.FindElementsByTag("td")
ws.Cells(rTable, cTable).Value = td.Text
cTable = cTable + 1
Next td
rTable = rTable + 1
Next tr
Excel puede iniciarse mediante el atributo de rango de la hoja de Excel o a través de los atributos de las celdas de la hoja de Excel. Para reducir la complejidad del script de VBA, la colección de datos es iniciada a los atributos de las celdas de Excel de la hoja 1 presentes en el libro de trabajo. El atributo de texto ayuda a obtener la información del texto puesta bajo la etiqueta HTML.
Sub data_scrapping()
Dim wb As Workbook, sh As Worksheet
Dim driver As New WebDriver
Dim rTable As Integer, cTable As Integer, i As Integer
Dim tr As Variant, th As Variant, t As Variant
'Variables de libro y hoja
Set wb = ThisWorkbook
Set ws = wb.Sheets(1)
' Variables de fila y columna definidas
rTable = 2
cTable = 1
i = 1
'Iniciamos selenium
driver.Start "Chrome"
driver.Get "https://excelcute.com/table-demo/"
Application.Wait Now + TimeValue("00:00:05")
' Data scrapping de encabezados
For Each th In driver.FindElementByClass("wp-block-table").FindElementByTag("thead").FindElementsByTag("tr")
i = 1
For Each t In th.FindElementsByTag("th")
ws.Cells(1, i).Value = t.Text
i = i + 1
Next t
Next th
' Data scrapping de encabezados
For Each tr In driver.FindElementByClass("wp-block-table").FindElementByTag("tbody").FindElementsByTag("tr")
cTable = 1
For Each td In tr.FindElementsByTag("td")
ws.Cells(rTable, cTable).Value = td.Text
cTable = cTable + 1
Next td
rTable = rTable + 1
Next tr
Set ws = Nothing
Set wb = Nothing
driver.Close
End Sub
Con lo cual el módulo de VBA se vería de la siguiente forma:
Una vez el macro script esté listo, pasa y asigna la subrutina al botón de Excel y sal del módulo de VBA. Cambiaremos el nombre del botón a «Actualizar» o cualquier nombre que sea adecuado. Para este ejemplo quedará como Actualizar:
Con click derecho, asignaremos la macro al botón con la opcion «Asignar Macro»
Presionaremos el botón para obtener los datos de salida.
Ahora solo quedará comparar los resultados en Excel con los resultados de Google Chrome para saber que todo ha salido bien.
Cualquier duda nos leemos abajo.