** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Extaer datos de HML web
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoExtaer datos de HML web

 Responder Responder
Autor
Mensaje
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 1258
Enlace directo a este mensaje Tema: Extaer datos de HML web
    Enviado: 06/Diciembre/2021 a las 14:07
Hola
Estoy tratando de leer datos de la pagina web "https://www.oanda.com/fx-for-business/historical-rates"
De momento necesito ayuda para actualizar la divisa que "Quiero". Si podeis echar una mano para encontar el punto de partida, pues no soy capac de acceder esa tabla.
He conseguido actualizar la divisa que "Tengo" y encontrar el boton que accede a la tabla que guarda los cambios para un rango determinado de fechas. No se si es la forma mas correcta para un autodidacta como yo pero hasta aqui funcionaTongue
Sub importartblhtml()
Dim ie As InternetExplorer
Dim Doc As HTMLDocument
Dim htmTable As HTMLTable
Dim div As HTMLDivElement
Dim MyHTML_Element As IHTMLElement
Dim nFilas As Integer, nColumnas As Integer, x As Integer, y As Integer
Set ie = CreateObject("InternetExplorer.Application")
ie.Navigate "https://www.oanda.com/fx-for-business/historical-rates"
Do While ie.ReadyState = 4: DoEvents: Loop   'Do While
Do Until ie.ReadyState = 4: DoEvents: Loop   'Do Until
Set Doc = ie.Document
ie.visible = True
Set div = Doc.all.hcc
'Leemos la tabla de la divisa que tengo hasta encontrar la deseada y hacemos click para actualizar
 For Each MyHTML_Element In div.getElementsByTagName("div")
     If MyHTML_Element.ClassName = "value" And MyHTML_Element.innerText = "EUR" Then
        MyHTML_Element.Click
        Exit For
     End If
 Next
 Sleep 2000
 
 'Leemos la tabla de la divisa que quiero hasta encontrar la deseada y hacemos click para actualizar
 'PENDIENTE


 'Buscamos el elemento "button Table" y hacemos click para acceder a la tabla de cambios
For Each MyHTML_Element In div.getElementsByTagName("div")
    If MyHTML_Element.ClassName = "button table" Then MyHTML_Element.Click: Exit For
    Do While ie.Busy And Not ie.ReadyState = READYSTATE_COMPLETE
       DoEvents
    Loop
Next
End Sub
He visto que se pueden solictar cambios hasta de 180 dias aunque el predeterminado son 30 dias.Habria que acceder a ese combo(Table) para escoger el periodo.

Ahora estoy terminando una pequeña funcion para poner en formato de fecha standar las que extraigo de la tabla de cambios que viene como "Dec 5, 2021" y que me quede como 5/12/2021.

Saludos y feliz puente a todos


Editado por main - 06/Diciembre/2021 a las 14:16
Arriba
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 1258
Enlace directo a este mensaje Enviado: 11/Diciembre/2021 a las 14:33
Hola a todos
Introduzco aqui un problemilla que recientemente he detectado con respecto a la web de Oanda que es la que venia usando para convertir divisas.
Ahora es distinta y no sirve el codigo del que comenté hace unos dias.  Se puede ver en el Tema "Conversor Divisas" en "http://www.mvp-access.com/foro/conversor-divisas_topic86163.html"
El caso es que desde internet explorer no se ven ciertos elementos imprescindibles de la pagina que si se ven desde cualquier otro navegador.
Y mi pregunta es saber si se puede extraer el html de esos elementos interactuando con el navegador de internet explorer aunque no se vean o por el contrario son inacesibles.
Todo lo demás sigue igualmente pendiente, excepción hecha de la función de transformar las fechas de las tablas, que por fin la he terminado.

Saludos al grupo




Editado por main - 11/Diciembre/2021 a las 14:35
Arriba
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 1258
Enlace directo a este mensaje Enviado: 02/Enero/2022 a las 14:25
Buenos dias y Feliz 2022 para todos
Os dejo mi solución temporal ya que poco a poco se pueden obtener mejores filtros.
La solucion se basa en crear la url con las divisas y un periodo de duración, máximo, de 90 dias.
Accediendo a otros elementos del html se puede llegar hasta los 180 dias.
El procedimiento:

Public Sub webDivisaOanda()
Dim IE As InternetExplorer
Dim Doc As HTMLDocument
Dim htmTable As HTMLTable
Dim URL As String
Dim MyHTML_Element As IHTMLElement
Dim innerBox
Dim div
Dim rs  As Recordset
Dim x As Integer, y As Integer
On Error GoTo err_ie
Set IE = CreateObject("InternetExplorer.Application") 'New InternetExplorer '
IE.visible = True

IE.Navigate "https://www.oanda.com/fx-for-business/historical-rates?view=graph&base=EUR&quote=USD&duration=30"  'Se puede construir para otra duración con el limite, en principio, de 90 dias.
'Se puede llegar hasta 180 dias

Do While IE.ReadyState = 4: DoEvents: Loop   'Do While
Do Until IE.ReadyState = 4: DoEvents: Loop   'Do Until
Set Doc = IE.Document
Set div = Doc.all.hcc

'El cambio de hoy
Set innerBox = div.getElementsByClassName("amount")
 For Each MyHTML_Element In innerBox
   If IsNumeric(MyHTML_Element.innerText) Then Debug.Print "Cambio de hoy: " & Redondea(CDbl(Replace(MyHTML_Element.innerText, ".", ",")), 4)
 Next

 'Buscamos el elemento "button Table" y hacemos click para acceder a la tabla de cambios
    For Each MyHTML_Element In div.getElementsByTagName("div")
        If MyHTML_Element.ClassName = "button table" Then MyHTML_Element.Click: Exit For
            Do While IE.Busy And Not IE.ReadyState = READYSTATE_COMPLETE
                DoEvents
            Loop
    Next
Set div = Doc.all.ht2
Sleep 2000
'Cogemos la primera tabla que es la de los cambios del periodo
    Set htmTable = div.getElementsByTagName("Table")(0)
    For x = 3 To htmTable.Rows.Length - 2 'nFilas a extraer
         'rs.AddNew
        For y = 1 To htmTable.Rows(0).Cells.Length 'nColumnas
            If y = 1 Then
                Debug.Print "Fecha ", htmTable.Rows(x + 1).Cells(y - 1).innerText
                
                'rs!Fecambio = CDate(StrFecxDate(htmTable.Rows(x + 1).Cells(y - 1).innerText))
            Else
                Debug.Print "Cambio ", Replace(htmTable.Rows(x + 1).Cells(y - 1).innerText, ".", ",")
                
                'rs!valuni = CDbl(Replace(htmTable.Rows(x + 1).Cells(y - 1).innerText, ".", ","))
            End If
        Next y
        'rs!Change = Me.MoneOr & "-" & Me.MoneDes: rs!Op = Choose(Me.Ope, "V", "C")
        'rs.Update
    Next x
IE.Quit
exit_err:
Set IE = Nothing
DoCmd.Hourglass False
Exit Sub
err_ie:
MsgBox "Error " & Err & vbCrLf & Err.description
Resume exit_err
End Sub

Si aguno puede aportar como implementarlo para solicitar u rango de fechas, quedaria bastante completo.
Sinó se puede cerrar el tema
QUIEN no tenga la funcion "Redondea()" puede usar la estandar de access "Round()"
Saludos de nuevo



Editado por main - 03/Enero/2022 a las 10:19
Arriba
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 1258
Enlace directo a este mensaje Enviado: 13/Enero/2022 a las 10:54
Buenos dias
Este tema se puede cerrar
Saludos al grupo
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable