Hola a todos:
Hace varios años programé las API’s de Google Maps en esta web (hoy ya no disponibles). En esos trabajos utilicé técnicas de web scraping para obtener la información de las coordenadas o las distancias.
Debido a que Google cambió las condiciones de acceso a la información, obligando a utilizar una Key e ingresar una tarjeta de crédito, decidí retirar la programación por problemas de complejidad y privacidad que esto podría ocasionar a los lectores.
En el caso de hoy os voy a mostrar un código muy interesante para realizar web scraping pero rescatando una tabla, en concreto los datos del Ibex35 que se encuentran en la Bolsa.
La ruta hacia web es la siguiente: Precios Ibex35
Pues bien teniendo en cuenta el enlace anterior, os dejo el código que vamos a utilizar:
Option Explicit
Sub Descargar_tabla()
Dim MiDocument As MSHTML.HTMLDocument, MiTabla As Object, MiHoja As Worksheet, fin As Long
Dim columna As Object, fila As Object, titulo As Object, nFila As Long, nColumn As Long
Dim valores As Variant
Application.ScreenUpdating = False
With Sheets("Hoja1")
'Eliminamos datos previos
fin = Application.CountA(.Range("A:A"))
If fin > 1 Then
.Range("A1:I" & fin).Select
With Selection
.ClearContents
.HorizontalAlignment = xlRight
End With
End If
End With
'Iniciamos conexión
Set MiHoja = Worksheets("Hoja1")
Set MiDocument = New MSHTML.HTMLDocument
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.bolsamadrid.es/esp/aspx/Mercados/Precios.aspx?indice=ESI100000000", False
.send
MiDocument.body.innerHTML = .responseText
End With
Set MiTabla = MiDocument.querySelectorAll("Table")(4)
For Each fila In MiTabla.getElementsByTagName("tr") 'filas
'Inicializamos
nFila = nFila + 1
nColumn = 1
'Completamos titulos o encabezados
For Each titulo In fila.getElementsByTagName("th") 'encabezados
MiHoja.Cells(nFila, nColumn) = titulo.innerText
nColumn = nColumn + 1
Next
'copiamos celda de cada fila y resaltamos filas que nos interesan
For Each columna In fila.getElementsByTagName("td") 'columnas
If nColumn > 1 And nColumn < 8 Then
valores = columna.innerText * 1
Else
valores = columna.innerText
End If
MiHoja.Cells(nFila, nColumn) = valores
If MiHoja.Cells(nFila, nColumn) = "B.SANTANDER" Or _
MiHoja.Cells(nFila, nColumn) = "ALMIRALL" Or _
MiHoja.Cells(nFila, nColumn) = "ACCIONA" Or _
MiHoja.Cells(nFila, nColumn) = "GRIFOLS CL.A" Then
Range(MiHoja.Cells(nFila, nColumn), MiHoja.Cells(nFila, 9)).Select
Selection.Interior.Color = RGB(169, 208, 142)
End If
nColumn = nColumn + 1
Next
Next
End Sub
Como podéis observar debemos incluir en el código la ruta que nos lleva hasta la tabla con los precios del mercado:
"https://www.bolsamadrid.es/esp/aspx/Mercados/Precios.aspx?indice=ESI100000000"

Debemos detectar el número de la tabla que queremos descargar, en este caso es la tabla 4 e indicarlo en la linea de código:
Set MiTabla = MiDocument.querySelectorAll("Table")(4)
A diferencia de otras técnicas, vamos a utilizar el Método querySelectorAll ():
«El método querySelectorAll () devuelve todos los elementos del documento que coinciden con un selector o selectores CSS especificados, como un objeto NodeList estático.
El objeto NodeList representa una colección de nodos. Se puede acceder a los nodos mediante números de índice. El índice comienza en 0.»
Una vez que tenemos los datos de «MiTabla» accederemos a la información utilizando el método: getElementsByTagName().
Donde:
- getElementsByTagName(«tr»): hace referencia a las filas.
- getElementsByTagName(«th»): hace referencia a los títulos.
- getElementsByTagName(«td»): hace referencia a los columnas.
Utilizando una instrucción for-each anidada descargamos la tabla y la escribimos en nuestra hoja celda a celda.
Podéis ver que he aprovechado para resaltar una serie de compañías con un color determinado:
If MiHoja.Cells(nFila, nColumn) = "B.SANTANDER" Or _
MiHoja.Cells(nFila, nColumn) = "ALMIRALL" Or _
MiHoja.Cells(nFila, nColumn) = "ACCIONA" Or _
MiHoja.Cells(nFila, nColumn) = "GRIFOLS CL.A" Then
Range(MiHoja.Cells(nFila, nColumn), MiHoja.Cells(nFila, 9)).Select
Selection.Interior.Color = RGB(169, 208, 142)
End If
A diferencia de hacerlo con la herramienta de Datos de nuestra hoja que directamente descarga la información en formato tabla, de esta forma podemos interactuar directamente con el contenido de la descarga y resaltar o no mostrar un elemento específico.
Es muy útil utilizar F12 de nuestro teclado para explorar los elementos de la web con sus nombre y etiquetas.
Importante: Es necesario que activéis la referencia a la siguiente librería: Microsoft HTML Object Librery:

El resultado del código es el siguiente:

y como podéis ver, aparecen destacadas las compañías que he seleccionado.
Y esto es todo, espero que os haya resultado útil e interesante.
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies
Hola, estupendo post, solo un comentario, parece que los valores salen multiplicados por 10, ¿Es posible? SI no vendo ya toda mi cartera , jejjee
Hola Pepe:
Lamentablemente no podrás vender tu cartera … había olvidado multiplicar por 1 en las columnas numéricas para traer los datos. Las prisas … ahora ya está correcto.
Saludos y gracias por avisar!
Esperaremos mejores tiempos para vender 😉 , gracias a ti siempre. Un saludo