Condividi:        

Recupero dati da web

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Recupero dati da web

Postdi BG66 » 26/03/21 17:11

Ciao a tutti.
Premesso che la testardaggine è uno dei miei tanti difetti....
Ho provato ad adattare un file trovato in rete ma senza riuscirci quindi...riparto da zero!!
Vorrei caricare alcuni dati prendendoli da borsa italiana.
In colonna B per singola riga, inserisco manualmente l'indirizzo specifica come faccio a "dirgli" quando sei in quella pagina mi vai a prendere questi dati?
https://www.dropbox.com/scl/fi/uog0c0nje5dbxljl1wz3f/Portafoglio_Fondi-forum.xlsm?dl=0&rlkey=j80k3xmvx8mnhbvr4dqwqio3y

Grazie per la pazienza e l'eventuale aiuto.

Gene
BG66
Excel2010
Avatar utente
BG66
Utente Senior
 
Post: 320
Iscritto il: 20/08/16 07:44

Sponsor
 

Re: Recupero dati da web

Postdi Anthony47 » 27/03/21 13:54

Come detto in passato, questi sono giochi di tempo e di pazienza...

Il vba, tramite la libreria mshtml.tlb, consente di accedere a InternetExplorer e ai suoi oggetti.
Quindi il gioco di pazienza e' esaminare il codice sorgente di una pagina web, identificare gli elementi di interesse, trovare il giusto "appiglio" per puntarli e finalmente leggerne il valore; partendo dal livello piu' alto accessibile, il "document" della pagina.
Elementi tipici per indirizzare gli elementi sono i Tag (getElementsByTagName) e i suoi attributi, quali ID (getElementById) nei casi fortunati e Class (getElementsByClassName).

Riprendo quanto pubblicato in un messaggio precedente:
a) creiamo l'oggetto IE
b) andiamo all'url richiesto
c) cerchiamo un aggancio al nome del titolo esaminando l'oggetto; l'html relativo:
Codice: Seleziona tutto
<article class="l-grid__cell">
      <div class="w-999 | l-box">
         <div class="l-box">
              <div class="l-box">
               <h1 class="t-text -flola-bold -size-xlg -inherit">   Carmignac Patrimoine E Eur Acc
</h1>
            </div>
            <div class="l-box">
               <span class="t-text -size-lg -black-warm-60"><strong>176,06</strong></span>&nbsp;
               <span class="t-text -size-lg -cbalanced"><strong>+0,16%</strong></span>
            </div>
            <div class="w-999__bcol | l-box | l-screen -sm-9 -md-9">
               <span class="t-text -block -size-xs">Valuta: <strong>EUR</strong></span>
               <span class="t-text -block -size-xs | -xs">Data: <strong>25/03/21</strong></span>
            </div>

            <div class="w-999__bcol -last | l-box | l-screen -sm-6 -md-6">
               <!-- PORTFOLIO -->
               <span class="t-text -flola-bold -uppercase -inherit"><a title="Portafoglio" href="/borsa/user/borsa-virtuale/portafoglio-aggiungi-strumento.html?code=2CARPATE"><span class="m-icon -portfolio-xs"></span> Portafoglio</a></span>
               <!-- ALERT -->
               <span class="t-text -flola-bold -uppercase -inherit"><a title="Email Alert" href="/borsa/pagina-personale/alerts/imposta-alert.html?id=2CARPATE&amp;lang=it"><span class="m-icon -alert-xs"></span> Email Alert</a></span>             
            </div>
          </div>
      </div>
   </article>


La "class=w-999" ci consente un aggancio al nome del Titolo, alla sua (ultima?) quotazione, alla data, alla Variazione

Per i rendimenti, essi sono riportati nella <table> n° 3; 1-mese, 12-mesi, 36-mesi e 60-mesi corrispondono ai suoi <td> n° 2, 6, 8 e 10

Per la societa' di gestione, essa si trova nell'elemento con "class=l-grid__row" n° 7 (non ho trovato altri agganci meno precari).

d) ripetiamo per ulteriori url



Cio' detto, un codice che mastica queste cose:
Codice: Seleziona tutto
#If VBA7 Then       '!!! ON  TOP  OF  THE  VBA  MODULE   !!!!
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If


Sub ScanTitoli()
Dim IE As Object, myF As Object, I As Long
'
For I = 2 To Cells(Rows.Count, 2).End(xlUp).Row
    myUrl = Cells(I, 2)             'L'url della pagina da accedere
    If InStr(1, myUrl, "http", vbTextCompare) = 1 Then
        'Se url valido, apre tramite InternetExplorer...
        If IE Is Nothing Then Set IE = CreateObject("InternetExplorer.Application")
        With IE
            .Visible = True         '... rendi visibile IE
            .navigate myUrl         '....vai all'url
            Sleep 100               '
            Do While .Busy: DoEvents: Sleep (20): Loop              'Attesa not busy
            Do While .readyState <> 4: DoEvents: Sleep (20): Loop   'Attesa document
        End With
        Sleep (100)                 'Stabilizza
        'Cerca le voci di interesse
        On Error Resume Next
            Set myF = IE.document.getElementsByClassName("w-999")
            Cells(I, "C").Value = myF(0).getElementsByTagName("h1")(0).innerText         'Descrizione
            Cells(I, "E").Value = (myF(0).getElementsByTagName("strong")(0).innerText)     'quotazione
            Cells(I, "G").Value = (myF(0).getElementsByTagName("strong")(1).innerText)     'variazione
            Set myF = IE.document.getElementsByClassName("w-999__bcol")
            Cells(I, "F").Value = myF(0).getElementsByTagName("strong")(1).innerText     'data
            Set myF = IE.document.getElementsByTagName("table")
            Cells(I, "H").Value = (myF(2).getElementsByTagName("td")(1).innerText)     'Rendimenti
            Cells(I, "I").Value = (myF(2).getElementsByTagName("td")(5).innerText)     'Rendimenti
            Cells(I, "J").Value = (myF(2).getElementsByTagName("td")(7).innerText)     'Rendimenti
            Cells(I, "K").Value = (myF(2).getElementsByTagName("td")(9).innerText)     'Rendimenti
            Set myF = IE.document.getElementsByClassName("l-grid__row")
            gest = myF(6).innerText
            Cells(I, "L") = Application.WorksheetFunction.Clean(Split(gest, Chr(10), , vbTextCompare)(5))
        On Error GoTo 0
    End If
Next I
'Chiusura
On Error Resume Next
IE.Quit
Set IE = Nothing
End Sub

Garantito funzionante fino alle 14:00 (UTC+1) del 27-marzo-2021, con i titoli che hai indicato nel file allegato.

Dopo non si puo' sapere, perche' in qualsiasi momento il gestore del sito puo' cambiare la struttura interna della sua pagina senza chiedere il nostro permesso.
Inoltre cambiando titolo non e' detto che la presentazione rimanga la stessa: potrebbe cambiare perche' ad esempio BorsaItaliana.it potrebbe inglobare nel suo sito pagine provenienti da altri gestori, o semplicemente perche' la tipologia di titolo richiede una struttura diversa

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Recupero dati da web

Postdi BG66 » 27/03/21 18:02

Ciao Anthony,
sono competamente spiazzato....non trovo SUB, Private, Pubblic...
...in pratica quelle poche cose che pensavo di aver capito del VBA!!

Dove/come si piazza tutto questo ben di Dio??

Grazie
Gene
BG66
Excel2010
Avatar utente
BG66
Utente Senior
 
Post: 320
Iscritto il: 20/08/16 07:44

Re: Recupero dati da web

Postdi Anthony47 » 27/03/21 19:25

Cosa succede Gene?
E' una macro "comune", il codice va messo in un modulo standard del vba facendo in modo che le "Declare" iniziali siano in testa a tutto (prima di qualsiasi Sub o Function). Per creare un modulo standard, partendo dall'editor delle macro: Menu /Inserisci /Modulo

Ciao!
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Recupero dati da web

Postdi BG66 » 28/03/21 06:37

Ciao Anthony,
scusami :oops: ma come un pivello mi ero fermato a studiare il tuo primo codice e mi ero fatto prendere dallo sconforto perchè non ci avevo capito nulla!!

Ovviamente funziona alla grande e ora vado a fare altre prove!!

Grazie come al solito.
Gene
STAY SAFE
BG66
Excel2010
Avatar utente
BG66
Utente Senior
 
Post: 320
Iscritto il: 20/08/16 07:44

Re: Recupero dati da web

Postdi BG66 » 28/03/21 07:52

Ciao Anthony,
per capire se ci sono come ragionamento.
Provo a prelevare anche il numero di ISIN quindi la parte di codice interessata è:
Codice: Seleziona tutto
<!-- CARATTERISTICHE-BANNER:begin -->
      <article class="l-grid__cell | l-screen -md-8">      
         <div class="l-box | l-screen -sm-15 -md-15">
            <h3 class="t-text -flola-bold -size-lg -uppercase | l-box -pb">Caratteristiche</h3>
            <div class="l-box -prl | h-bg--gray | l-screen"><br>
               <table class="m-table -clear-mtop">
               <tr>
                  <td class="l-screen -xs-half">
                     <span class="t-text"><strong>Isin</strong></span>
                  </td>
                  <td>
                     <span class="t-text -right">FR0010306142</span>
                  </td>
               </tr>
               <tr>
                  <td>

Quindi siccome l'ISIN è: <strong>Isin</strong> aggiungo questa riga:
Codice: Seleziona tutto
Set myF = IE.document.getElementsByClassName("w-999__bcol")
            Cells(I, "A").Value = myF(0).getElementsByTagName("strong")(2).innerText         'IO ISIN
            Cells(I, "F").Value = myF(0).getElementsByTagName("strong")(1).innerText     'data

ho inserito il valore (2) -> "decidendo" che erano i </td> da contare!!
....ovviamente conseguenza di tante deduzioni e poca formazione didattica...non funziona!!

Gene
BG66
Excel2010
Avatar utente
BG66
Utente Senior
 
Post: 320
Iscritto il: 20/08/16 07:44

Re: Recupero dati da web

Postdi Anthony47 » 28/03/21 22:40

Sei sulla buona strada; pero'...
In quella pagina web ci sono (al momento di "andare in stampa") 156 occorrenze del tag <strong>, e quello dell'ISIN non e' "figlio" di un oggetto di Class="w-999__bcol"; insomma ci vuole un aggancio piu' azzeccato.
Ad esempio l'Isin fa parte della table #2, e nella tabella e' il <td> #2; quindi possiamo provare cosi'
Codice: Seleziona tutto
            Set myF = IE.document.getElementsByTagName("table")
            Cells(I, "H").Value = (myF(2).getElementsByTagName("td")(1).innerText)     'Rendimenti
            Cells(I, "I").Value = (myF(2).getElementsByTagName("td")(5).innerText)     'Rendimenti
            Cells(I, "J").Value = (myF(2).getElementsByTagName("td")(7).innerText)     'Rendimenti
            Cells(I, "K").Value = (myF(2).getElementsByTagName("td")(9).innerText)     'Rendimenti
            Cells(I, "A").Value = myF(1).getElementsByTagName("td")(1).innerText       'ISIN  +++++++
            Set myF = IE.document.getElementsByClassName("l-grid__row")

La riga aggiunta e' marcata +++; le righe precedenti servono per ricordare che in quel momento myF contiene la collezione dei tag "table", per cui con myF(1) punta alla tabella #2

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Recupero dati da web":


Chi c’è in linea

Visitano il forum: Nessuno e 22 ospiti