10 diciembre, 2023

EJEMPLO PRÁCTICO WEB SCRAPING. EXTRAER PRECIOS IBEX35

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.

Donate Button with Credit Cards

¡¡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

Comparte este post

4 comentarios en «EJEMPLO PRÁCTICO WEB SCRAPING. EXTRAER PRECIOS IBEX35»

  1. Hola, estupendo post, solo un comentario, parece que los valores salen multiplicados por 10, ¿Es posible? SI no vendo ya toda mi cartera , jejjee

    1. 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!

  2. Primero Enhorabuena por tu Web. En el momento de edición de esta macro-VBA , funcionaba correctamente …pero hoy Julio de 2023 YA NO funciona; Han cambiado el Link de la web de Bolsasymercados
    Y aunque lo cambies en la macro tampoco funciona, se para al seleccionar la tabla.
    Que tal un repaso al programa y ver que se puede hacer?? o intentarlo con otro Link. Lo agradecería mucho.
    Un saludo y gracias

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies