Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Importazione 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

Importazione dati da web

Postdi mlux81 » 06/09/17 11:50

Un saluto a tutti. Sono nuovo del forum e non ho molta dimistichezza con excel ed access, se non per le funzioni di base e non ho nessuna conoscenza di programmazione ma avrei necessità di importare dei dati da web in maniera +/- automatizzata.
Avrei bisogno di importare i dati da questa pagina web https://www.pcgs.com/auctionPrices/details/1879-s-reverse-1878-ms/7092/97095, ma anche da altri link dello stesso sito con la stessa struttura, creando per ogni link un foglio nella stessa cartella.

Attualmente faccio la copiatura manuale in questo modo:
1)apro il link
2)visualizzo tutti i risultati tramite il menù a tendina in basso a sinistra (a volte questo dà un errore del database "DataTables warning: table id=auction-detail - Ajax error" e mi tocca copiarli a gruppi di 500)
3)ordino in base al PCGS # (prima colonna) in modo che li ordina per tipologia
4)copio e incollo in excel solo i PCGS # di mio interesse

Dovendolo fare per un solo link (tipologia di moneta), si può fare anche manualmente ma per tutti i link è impossibile.

In più i dati su questa pagina web sono connessi ai prezzi realizzati in aste numismatiche, pertanto potrebbero esserci degli aggiornamenti che vorrei altrettanto aggiornare sull'importazione.

Quindi avrei bisogno perciò di una macro che prelevi i dati dal sito e che si aggiorni ogni settimana utilizzando excel o access.

Ho provato a fare importa dati da web ed ho anche provato qualche macro trovato in qualche altro post di questo forum ma la tabella con i dati contenuti in quella pagina non li fa scaricare in quanto sembrano "protetti" oppure fa scaricare solo i primi 50, ma probabilmente dipende dalla struttura della pagina web o della tabella.

Inoltre, come già specificato, nella stessa pagina per quella tipologia potrebbero esserci migliaia di risultati mentre nella pagina c'è un menù a tendina in basso a sinistra dove ti fa scegliere il numero di righe da visualizzare tipo 50, 100, 500 o tutte (il link non varia al variare di tale scelta). Io avrei necessità di scaricare tutti i risultati per ogni singolo link mentre di default il link apre solo i primi 50 risultati.

Spero che abbiate capito il mio problema e ciò che avrei necessità di fare e sopratutto spero che qualcuno possa darmi una mano.

Grazie
mlux81
Utente Junior
 
Post: 14
Iscritto il: 06/09/17 10:48

Sponsor
 

Re: Importazione dati da web

Postdi Anthony47 » 07/09/17 00:46

Questi siti hanno una struttura dinamica, i dati da visualizzare vengono creati sul momento tramite script java che interpretano i comandi e creano un sorgente pagina su misura. E non esistono "siti con la stessa struttura".
Quindi questi lavori sono solo un gioco di tempo e di pazienza, caratteristiche che per quello che mi riguarda sono sempre piu' rare. Inoltre sono dei lavori "a termine", nel senso che la corretta importazione di dati si ottiene esaminando il codice sorgente della pagina e agganciando su questo le nostre elaborazioni; ma nulla garantisce che domani, la prossima settimana, il prossimo mese la struttura del codice sorgente non venga modificata, vanificando il lavoro fatto.

Cio' premesso, attingendo alle ultime riserve di tempo e di pazienza ho realizzato essenzialmente a scopo ludico questa macro che estrae sul foglio corrente la tabella delle aste presenti sul sito.
Codice: Seleziona tutto
Sub AuctionCaller()
Dim myURL As String, IE As Object, myITM As Object, tRtR, tDtD
Dim I As Long, myStart As Single, hmTD As Long, tI As Long, J As Long
Dim Paginate As Long, cPag As Long
'
If ActiveSheet.Name <> "FoglioZC" Then
    MsgBox ("Il foglio corrente non e' corretto, il processo viene pertanto abortito")
    Exit Sub
End If
'
myURL = "https://www.pcgs.com/auctionPrices/details/1879-s-reverse-1878-ms/7092/97095"
Set IE = CreateObject("InternetExplorer.Application")
Cells.ClearContents
With IE
    .navigate myURL
    .Visible = True
'Stop                '*** VEDI Testo
    Do While .Busy: DoEvents: Loop    'Attesa not busy
    Do While .readyState <> 4: DoEvents: Loop 'Attesa documento
End With
'
myStart = Timer  'attesa addizionale
Do
    DoEvents
    If Timer > myStart + 1 Or Timer < myStart Then Exit Do
Loop

hmTD = 50

Do
'    Set myITM = IE.document.getElementsByTagName("TD")
    myStart = Timer  'attesa addizionale
    Do
        DoEvents
        If Timer > myStart + 20 Or Timer < myStart Then Exit Do
        Set myITM = IE.document.getElementsByTagName("TD")
        If myITM.Length >= (hmTD - 2) Then Exit Do
    Loop
'dati probabilmente pronti
'    Set myColl = IE.document.getElementsByTagName("TABLE")
    Set myITM = IE.document.getElementsByTagName("TABLE")(1)
        Cells(I + 1, 1) = "Table# " & tI + 1
        tI = tI + 1: I = I + 1
        For Each tRtR In myITM.Rows
            For Each tDtD In tRtR.Cells
                Cells(I + 1, J + 1) = tDtD.innerText
                J = J + 1
            Next tDtD
            I = I + 1: J = 0
    DoEvents
    Cells(I, 1).Select
        Next tRtR
   
    I = I + 1
'    Next myITM
       
    Set myITM = IE.document.getElementById("auction-detail_length")
    hmTD = CLng(myITM.getElementsByTagName("select")(0).Value)
   
    Set myITM = IE.document.getElementById("auction-detail_paginate")
    Paginate = CLng(Replace(myITM.getElementsByTagName("span")(1).innerText, "/", "", , , vbTextCompare))
    cPag = CLng(myITM.getElementsByTagName("select")(0).Value)
    If cPag < Paginate Then
        IE.document.getElementById("auction-detail_next").Click
        Do While IE.Busy: DoEvents: Loop    'Attesa not busy
        Do While IE.readyState <> 4: DoEvents: Loop 'Attesa documento
'
        myStart = Timer  'attesa addizionale
        Do
            DoEvents
            If Timer > myStart + 1 Or Timer < myStart Then Exit Do
        Loop
    Else
        Exit Do
    End If
Loop
Set myITM = Nothing
IE.Quit
Set IE = Nothing
End Sub

Essa apre una sessione di InternetExplorer e usando il suo engine estrae i dati e li copia sul "foglio corrente", previo AZZERAMENTO DEL FOGLIO senza preavviso.

Essa e' disponibile anche sul file scaricabile qui:
https://www.dropbox.com/s/fwht9v0piap25 ... .xlsm?dl=0
Il foglio preposto all'importazione e' FoglioZC, dove la macro puo' essere avviata tramite il pulsante ImportaDati

Fatene buon uso...
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 14821
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importazione dati da web

Postdi mlux81 » 07/09/17 09:29

Ringraziarti è il minimo che io possa fare.
Ho scaricato il file e mentre dopo un primo tentativo mi estrapolava i dati correttamente come avevi già fatto tu ora invece mi importa solo pochissime righe e non so per quale motivo. Visto che ho solo premuto importa dati e la prima volta era ok ora dopo circa 30 minuti ho riprovato e mi importa solo poche righe potrei desumere come dici tu che c'è stato un cambiamento nel sorgente della pagina e che forse non va più bene la tua macro, ma non ne sono sicuro.

Come avrai capito purtroppo non ho conoscenze, nemmeno basilari di VBA e programmazione, e mi viene difficile interpretare per modificare a mio piacimento il codice che mi hai incollato. Per esempio avrei necessità di importare la colonna "SALE" con il formato link in modo che nell'excel mi riporti anche il link cliccabile.

Da dove potrei iniziare a studiare qualcosa, partendo da zero? Mi indicate qualche guida online?? Dovrei prima iniziare con VB e poi VBA??
mlux81
Utente Junior
 
Post: 14
Iscritto il: 06/09/17 10:48

Re: Importazione dati da web

Postdi poldo98 » 07/09/17 09:49

Anthony, per piacere, mi puoi dire che linguaggio hai usato per la macro ??
Mi ricorda molto il DBase dei vecchi tempi DOS.
poldo98
Utente Junior
 
Post: 69
Iscritto il: 26/03/07 15:12

Re: Importazione dati da web

Postdi mlux81 » 07/09/17 14:42

Probabilmente era un problema del sito perchè adesso ho riprovato e funziona perfettamente.
Ho provato anche con un altro link dello stesso sito cambiando l'indirizzo nella tua macro ed inserendo la stessa in un foglio di un'altra cartella ed è tutto ok.

L'ultima cosa che ti chiedo se per favore mi puoi dire se è possibile altresì importare solo ed esclusivamente il formato link nella colonna "SALE" in modo che nel mio excel ci sia il link cliccabile che ti rimanda all'asta specifica.

Grazie
mlux81
Utente Junior
 
Post: 14
Iscritto il: 06/09/17 10:48

Re: Importazione dati da web

Postdi Anthony47 » 07/09/17 15:44

E' possibile che per ottenere risultati attendibili debba svuotare la cache di InternetExplorer; io l'avevo risolta tramite Menu /Strumenti /Opzioni internet, tab Generale; spuntare la voce "Elimina la cronologia al momento di uscire". Il cambiamento del "sorgente" fortunatamente non capita ogni 30 minuti...

La macro e' scritta in linguaggio vba, il linguaggio delle macro; si tratta di un "Visual Basic" specializzato per la gestione delle Applicazioni Office. In una buona libreria si trovano buoni libri che parlano del linguaggio macro di Excel, poi un po' di pratica ti dara' la padronanza del linguaggio.

Quanto al discorso "link su colonna Sale" vedro' come sono messo a tempo e pazienza, ma con calma...

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 14821
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importazione dati da web

Postdi mlux81 » 07/09/17 16:08

Ti ringrazio per la disponibilità Anthony47 e per il problema dell'importazione del link non ho alcuna fretta, ci mancherebbe altro....già mi hai dato un grande aiuto evitando di fare copia e incolla ...

Spero di riuscire a leggere qualcosa in merito al VBA...sono appassionato di informatica in genere ma non mi sono mai addentrato nei linguaggi di programmazione e credo sia il momento di iniziare almeno per le cose basilari

Grazie
mlux81
Utente Junior
 
Post: 14
Iscritto il: 06/09/17 10:48

Re: Importazione dati da web

Postdi mlux81 » 11/09/17 16:58

Ciao anthony47, spero tu non ti sia scordato di me
mlux81
Utente Junior
 
Post: 14
Iscritto il: 06/09/17 10:48

Re: Importazione dati da web

Postdi Anthony47 » 11/09/17 23:57

No, non mi ero dimenticato; avevo solo esaurito la dose settimanale di tempo e di pazienza e quindi ho dovuto attendere la ricarica...

Il file reso disponibile al link gia' pubblicato e' ora aggiornato per riportare il collegamento ipertestuale in tutte le celle che ne hanno uno.

La macro modificata:
Codice: Seleziona tutto
Sub AuctionCaller2()
'vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=108832
Dim myURL As String, IE As Object, myITM As Object, tRtR, tDtD
Dim I As Long, myStart As Single, hmTD As Long, tI As Long, J As Long
Dim Paginate As Long, cPag As Long, hhLink As Hyperlink
'
On Error Resume Next
Sheets("FoglioZC").Select
On Error GoTo 0
If ActiveSheet.Name <> "FoglioZC" Then
    MsgBox ("Il foglio di Destinazione (FoglioZC) non esiste, il processo viene pertanto abortito")
    Exit Sub
End If
'
myURL = "https://www.pcgs.com/auctionPrices/details/1879-s-reverse-1878-ms/7092/97095"
'
Set IE = CreateObject("InternetExplorer.Application")
Cells.ClearContents
Cells.Style = "Normal"
For Each hhLink In ActiveSheet.Hyperlinks
    hhLink.Delete
Next hhLink
With IE
    .navigate myURL
    .Visible = True
'Stop                '*** VEDI Testo
    Do While .Busy: DoEvents: Loop    'Attesa not busy
    Do While .readyState <> 4: DoEvents: Loop 'Attesa documento
End With
'
myStart = Timer  'attesa addizionale
Do
    DoEvents
    If Timer > myStart + 1 Or Timer < myStart Then Exit Do
Loop

hmTD = 50

Do
'    Set myITM = IE.document.getElementsByTagName("TD")
'Application.ScreenUpdating = False
    myStart = Timer  'attesa addizionale
    Do
        DoEvents
        If Timer > myStart + 20 Or Timer < myStart Then Exit Do
        Set myITM = IE.document.getElementsByTagName("TD")
        If myITM.Length >= (hmTD - 2) Then Exit Do
    Loop
'dati probabilmente pronti
    Set myITM = IE.document.getElementsByTagName("TABLE")(1)
        Cells(I + 1, 1) = "Table# " & tI + 1
        tI = tI + 1: I = I + 1
        For Each tRtR In myITM.Rows
            For Each tDtD In tRtR.Cells
                Cells(I + 1, J + 1) = tDtD.innerText
                If InStr(1, tDtD.innerHTML, "href", vbTextCompare) > 0 Then
                DoEvents: DoEvents
'                    myURL = tDtD.getElementsByTagName("a")(0).href
                    ActiveSheet.Hyperlinks.Add anchor:=Cells(I + 1, J + 1), _
                       Address:=tDtD.getElementsByTagName("a")(0).href
                End If
                J = J + 1
            Next tDtD
            I = I + 1: J = 0
            DoEvents
            Cells(I, 1).Select
        Next tRtR
    I = I + 1
'    Next myITM
    Set myITM = IE.document.getElementById("auction-detail_length")
    hmTD = CLng(myITM.getElementsByTagName("select")(0).Value)
   
    Set myITM = IE.document.getElementById("auction-detail_paginate")
    Paginate = CLng(Replace(myITM.getElementsByTagName("span")(1).innerText, "/", "", , , vbTextCompare))
    cPag = CLng(myITM.getElementsByTagName("select")(0).Value)
    If cPag < Paginate Then
        IE.document.getElementById("auction-detail_next").Click
        Do While IE.Busy: DoEvents: Loop    'Attesa not busy
        Do While IE.readyState <> 4: DoEvents: Loop 'Attesa documento
'
        myStart = Timer  'attesa addizionale
        Do
            DoEvents
            If Timer > myStart + 1 Or Timer < myStart Then Exit Do
        Loop
    Else
        Exit Do
    End If
'Application.ScreenUpdating = True
DoEvents
Loop

Set myITM = Nothing
IE.Quit
Set IE = Nothing

MsgBox ("Completata importazione...")
End Sub

Ciao a tutti
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 14821
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importazione dati da web

Postdi mlux81 » 12/09/17 08:48

Grazie mille Anthony47 e scusami se ti ho spazientito.
Mi sei stato di grande aiuto.
mlux81
Utente Junior
 
Post: 14
Iscritto il: 06/09/17 10:48

Re: Importazione dati da web

Postdi Anthony47 » 13/09/17 01:49

Se mi mancasse la pazienza non sarei sul forum... e' che questi esercizi (leggere il codice html delle pagine web e tradurlo in linguaggio macro) sono noiosi e poco eccitanti, quindi faccio pigramente il minimo sindacale.

Alla prossima...
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 14821
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Importazione dati da web":


Chi c’è in linea

Visitano il forum: Nessuno e 17 ospiti