Saltar al contenido

Extracción de datos del sitio web usando vba

Solución:

Hay varias maneras de hacer esto. Esta es una respuesta que escribo con la esperanza de que todos los conceptos básicos de la automatización de Internet Explorer se encuentren al buscar las palabras clave “extraer datos del sitio web”, pero recuerde que nada vale como su propia investigación (si no quiere ceñirse a códigos preescritos que no puede personalizar).

Tenga en cuenta que esto es de una sola mano, eso no lo prefiero en términos de rendimiento (ya que depende de la velocidad del navegador) pero eso es bueno para entender la lógica detrás de la automatización de Internet.

1) Si necesito navegar por la web, ¡necesito un navegador! Entonces creo un navegador Internet Explorer:

Dim appIE As Object
Set appIE = CreateObject("internetexplorer.application")

2) Le pido al navegador que explore la página web de destino. Mediante el uso de la propiedad “.Visible”, decido si quiero que el navegador haga su trabajo o no. Al construir el código es bueno tener Visible = True, pero cuando el código funciona para extraer datos, es bueno no verlo todo el tiempo, así que Visible = False.

With appIE
    .Navigate "http://uk.investing.com/rates-bonds/financial-futures"
    .Visible = True
End With

3) La página web necesitará algo de tiempo para cargarse. Entonces, esperaré mientras esté ocupado …

Do While appIE.Busy
    DoEvents
Loop

4) Bueno, ahora la página está cargada. Digamos que quiero eliminar el cambio del US30Y T-Bond: lo que haré es simplemente hacer clic en F12 en Internet Explorer para ver el código de la página web y, por lo tanto, usando el puntero (en círculo rojo) haré clic en el elemento que Quiero raspar para ver cómo puedo alcanzar mi propósito.

ingrese la descripción de la imagen aquí

5) Lo que debo hacer es sencillo. En primer lugar, obtendré por la propiedad ID el tr elemento que contiene el valor:

Set allRowOfData = appIE.document.getElementById("pair_8907")

Aquí obtendré una colección de td elementos (específicamente, tr es una fila de datos, y el td son sus células. Estamos buscando el 8, así que escribiré:

Dim myValue As String: myValue = allRowOfData.Cells(7).innerHTML

¿Por qué escribí 7 en lugar de 8? Debido a que las colecciones de celdas comienzan desde 0, el índice del octavo elemento es 7 (8-1). Analizando brevemente esta línea de código:

  • .Cells() me hace acceder al td elementos;
  • innerHTML es la propiedad de la celda que contiene el valor que buscamos.

Una vez que tenemos nuestro valor, que ahora se almacena en el myValue variable, podemos cerrar el navegador IE y liberar la memoria configurándolo en Nothing:

appIE.Quit
Set appIE = Nothing

Bueno, ahora tienes tu valor y puedes hacer lo que quieras con él: ponlo en una celda (Range("A1").Value = myValue), o en la etiqueta de un formulario (Me.label1.Text = myValue).

Solo me gustaría señalarle que no es así como funciona StackOverflow: aquí publica preguntas sobre problemas de codificación específicos, pero primero debe hacer su propia búsqueda. La razón por la que estoy respondiendo una pregunta que no muestra demasiado esfuerzo de investigación es solo que la veo formulada varias veces y, volviendo a la época en que aprendí a hacer esto, recuerdo que me hubiera gustado tener una mejor apoyo para empezar. Así que espero que esta respuesta, que es solo una “entrada de estudio” y no la mejor / más completa solución, pueda ser de ayuda para el próximo usuario que tenga el mismo problema. Porque he aprendido a programar gracias a esta comunidad, y me gusta pensar que tú y otros principiantes podrían usar mi información para descubrir el hermoso mundo de la programación.

Disfruta tu práctica;)

Se mencionaron otros métodos, así que reconozcamos que, en el momento de escribir este artículo, estamos en el siglo XXI. Estacionemos el autobús local apertura del navegador, y mosca con una solicitud XMLHTTP GET (XHR GET para abreviar).

Momento Wiki:

XHR es una API en forma de objeto cuyos métodos transfieren datos entre un navegador web y un servidor web. El objeto lo proporciona el entorno JavaScript del navegador.

Es un método rápido para recuperar datos que no requiere abrir un navegador. La respuesta del servidor se puede leer en un HTMLDocument y el proceso de tomar la tabla continúa desde allí.

Tenga en cuenta que el contenido javascript renderizado / agregado dinámicamente no se recuperará ya que no hay un motor javascript en ejecución (que sí existe en un navegador).

En el siguiente código, la tabla se toma por su id. cr1.

mesa

En el auxiliar auxiliar, WriteTable, hacemos un bucle en las columnas (td etiquetas) y luego las filas de la tabla (tr etiquetas) y, finalmente, recorra la longitud de cada fila de la tabla, celda de tabla por celda de tabla. Como solo queremos datos de las columnas 1 y 8, una Select Case se utiliza la declaración especificar lo que se escribe en la hoja.


Vista de página web de muestra:

Vista de página de muestra


Salida de código de muestra:

Salida de código


VBA:

Option Explicit
Public Sub GetRates()
    Dim html As HTMLDocument, hTable As HTMLTable '<== Tools > References > Microsoft HTML Object Library
    
    Set html = New HTMLDocument
      
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://uk.investing.com/rates-bonds/financial-futures", False
        .setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT" 'to deal with potential caching
        .send
        html.body.innerHTML = .responseText
    End With
    
    Application.ScreenUpdating = False
    
    Set hTable = html.getElementById("cr1")
    WriteTable hTable, 1, ThisWorkbook.Worksheets("Sheet1")
    
    Application.ScreenUpdating = True
End Sub

Public Sub WriteTable(ByVal hTable As HTMLTable, Optional ByVal startRow As Long = 1, Optional ByVal ws As Worksheet)
    Dim tSection As Object, tRow As Object, tCell As Object, tr As Object, td As Object, r As Long, C As Long, tBody As Object
    r = startRow: If ws Is Nothing Then Set ws = ActiveSheet
    With ws
        Dim headers As Object, header As Object, columnCounter As Long
        Set headers = hTable.getElementsByTagName("th")
        For Each header In headers
            columnCounter = columnCounter + 1
            Select Case columnCounter
            Case 2
                .Cells(startRow, 1) = header.innerText
            Case 8
                .Cells(startRow, 2) = header.innerText
            End Select
        Next header
        startRow = startRow + 1
        Set tBody = hTable.getElementsByTagName("tbody")
        For Each tSection In tBody
            Set tRow = tSection.getElementsByTagName("tr")
            For Each tr In tRow
                r = r + 1
                Set tCell = tr.getElementsByTagName("td")
                C = 1
                For Each td In tCell
                    Select Case C
                    Case 2
                        .Cells(r, 1).Value = td.innerText
                    Case 8
                        .Cells(r, 2).Value = td.innerText
                    End Select
                    C = C + 1
                Next td
            Next tr
        Next tSection
    End With
End Sub
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *