Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

prelevare dati solo da URL multipli

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

prelevare dati solo da URL multipli

Postdi Gianca532011 » 31/10/22 11:25

Ciao, il problema che incontro è il seguente :

1) ho tre categorie (Mot-ExtraMot-TLX) cui corrispondono sei url, da cui potenzialmente devo scaricare una serie di dati a partire dall'Isin che è lelemento base della ricerca.
2) i dati sono presenti nella stessa categoria di appartenenza: MOT oppure ExtraMOT Oppure EuroTLX ; e per ogni categoria c'è una ulteriore suddivisione tra due schede diverse = 2 URL
3) Purtroppo l'appartenenza ad una categoria Non esclude la presenza anche nell'altra (Mot ed ExtraMot), ma questo non è un problema .
4) comunque una volta che l'isin cercato è stato trovato viene effettuato lo scarico dei dati.
5) a questo punto la macro deve saltare all'Isin successivo ed è qui la mia difficoltaà ovvero il ciclo si ripete n volte inutilmente con perdita di tempo

ho anche tentato un percorso alternativo (v. 4)ovvero di fare aprire in chrome tutti i links contemporaneamente per l'isin dato , poi dovrebbe scaricare i dati e procedere oltre ma anche qui ho fatto sicuramente pasticci . e non scarica nulla .

Allego esempio 2 e 4 con le due versioni . E ringrazio sin d'ora.

https://ufile.io/f/fvwb0
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 312
Iscritto il: 27/05/11 10:18

Sponsor
 

Re: prelevare dati solo da URL multipli

Postdi Anthony47 » 31/10/22 13:18

Ricordo che avevo gia' fatto qualcosa su questo argomento e mi pare di ricordare che una delle lentezze nasce dal fatto che la macro estrae in due passaggi diversi non solo le tabelle dal sito ma anche alcuni dati specifici.
Non ricordo assolutamente, invece, quale e' l'organizzazione dei tuoi fogli da lavoro.

Credo che dovremmo pensare a qualche semplificazione; ad esempio il codice vba che importa le tabelle dal sito ma poi lasciare alle formule Excel il compito di estrarre dal tutto quello che serve; credo che Cerca.Vert oppure Indice siano state inventate apposta per lo scopo

Questo ridurrebbe al minimo l'uso di Selenium (che e' meno flessibile della soluzione basata su InternetExplorer)

Se questo e' ragionevole per te allora io mi limiterei a lavorare sulle colonne A e C di DataColl, estraendo da borsaitaliana per ogni Isin le sue tabelle e mettendole a disposizione per le tue estrazioni

Mi pare di capire che i dati sono diversi a seconda che provengano da MOT, ExtraMOT o da ???
Quindi, per capirci, io importerei su foglio MOT i dati relativi al primo titolo di quel mercato, mettendoli diciamo da A10 in avanti. Le righe 1-10 le userai tu per estrarre dalle tabelle sottostanti ognuno dei valori che ti servono mettendole diciamo da A2 verso destra; a quel punto la macro (dopo aver importato le tabelle) si limitera' a copiare A2:XX2 (per xx intendo l'ultima colonna compilata) e incollare il risultato su foglio DataColl, prima di passare sul titolo successivo

Fai sapere se questa evoluzione e' gestibile
Avatar utente
Anthony47
Moderatore
 
Post: 18602
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: prelevare dati solo da URL multipli

Postdi Gianca532011 » 31/10/22 18:38

Ciao, quindi , ma non sono sicuro di aver capito bene , tu crei tre fogli dove vanno a finire i dati in funzione del mercato : Mot, Extramot ed Euro Tlx, poi li riporti nel foglio finale e quindi fai partire selenium per completare con i dati mancanti ?? Tieni però conto che stiamo parlando di un elenco di 400 titoli.

In alternativa ho già un foglio che scarica TUTTI i titoli per ciascuna delle tre macro categorie con metodo HTTP ed è velocissimo, da qui, sulla base dei miei 400 Isin , importerei i dati noti nel solito foglio finale di riepilogo, per poi completare l'opera con Selenium.

Cosa ne dici ?
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 312
Iscritto il: 27/05/11 10:18

Re: prelevare dati solo da URL multipli

Postdi Anthony47 » 01/11/22 12:03

No, probabilmente siamo disallineati...
Io dicevo:
1) per ogni titolo ti scarico in un foglio tutte le tabelle di quel titolo presenti sulla pagina borsaitaliana.it
2) con formule excel tu ti preoccupi di prelevare le informazioni che ti servono e portarle in una riga, nella stessa sequenza in cui sono presenti nel foglio DataColl
3) la macro copia questa riga e la incolla su DataColl; poi passa al titolo successivo

Mi pare (ma non ne sono certo) che al momento sui fogli AllTables - ExtraMot - TLX ci sia il formato dei dati disponibili. Devi quindi capire come estrarre da questa massa di informazioni le cose che ti servono, ma sono sicuro che le formule excel mettono a disposizione tutto quel che serve.

Ma tutto questo viene messo in discussione dal fatto che tu gia' hai la possibilita' di estrarre rapidamente i dati dal sito (col metodo della richiesta xmlhttp); allora non so a che cosa serve usare Selenium, che nel confronto con la xmlhttp request e' drasticamente piu' lento

Insomma ora ho le idee ben piu' confuse di prima su cosa stai chiedendo
Avatar utente
Anthony47
Moderatore
 
Post: 18602
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: prelevare dati solo da URL multipli

Postdi Gianca532011 » 01/11/22 17:47

Sapessi come le ho io, altro che confuse !!
"Ma tutto questo viene messo in discussione dal fatto che tu gia' hai la possibilita' di estrarre rapidamente i dati dal sito (col metodo della richiesta xmlhttp); allora non so a che cosa serve usare Selenium, che nel confronto con la xmlhttp request e' drasticamente piu' lento"
Si pero non mi scaricano a partire dagli isin ma prelevano tutto quanto . Poi divrei estrarre i dati sulaa base degli Isin , quindi diventa un giro tortuoso.
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 312
Iscritto il: 27/05/11 10:18

Re: prelevare dati solo da URL multipli

Postdi Anthony47 » 01/11/22 18:15

Allora facciamo finta di partire da zero... Esempio:
Io ho un Isin, es AT0000383864; vorrei ottenere, partendo dalla pagina web xyzabc.com, le seguenti informazioni:
1)..
2)..
3)..
Oggi faccio così:
.... ... ...
ma ottengo ... ... ...

Come si puo' fare in modo rapido e indolore?

Ovviamente spero che non si debba ripartire effettivamente da zero, ma seve a capire dove dobbiamo arrivare.
Avatar utente
Anthony47
Moderatore
 
Post: 18602
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: prelevare dati solo da URL multipli

Postdi Gianca532011 » 02/11/22 12:08

Riprovo con una immagine :
Immagine

Questo funziona bene MA su 400 titoli impiega 1ora e passa . Tutto con Selenium /tuo metodo .
Ora l'dea era di abbreviare i tempi di scarico . ??? La logia di scarico dati è quella del post 1 .
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 312
Iscritto il: 27/05/11 10:18

Re: prelevare dati solo da URL multipli

Postdi Gianca532011 » 02/11/22 12:44

La logica di scarico è quella del post 1 P.ti 1,2,3,4 Sempre apartire dagli Isin di colonna 1 .

Dove vorrei arrivare : usare selenium il meno possibile . Come ti dicevo ho un altro file che lavora con Xmlhttp ma scarica tutte le pagine, quindi l'idea potrebbe essere di utilizzatre la stessa tecnica ma a partire dagli isin . Anche se in questo caso avremmo un altro problema ovvero i siti sono strutturati per pagine quindi non so se c'è una barra di ricerca dove immettere gli Isin medesimi. Come vedi è un pasticcio.
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 312
Iscritto il: 27/05/11 10:18

Re: prelevare dati solo da URL multipli

Postdi Anthony47 » 02/11/22 12:50

Questo funziona bene MA su 400 titoli impiega 1ora e passa . Tutto con Selenium /tuo metodo .
Ora l'dea era di abbreviare i tempi di scarico . ??? La logia di scarico dati è quella del post 1 .

Ma io, sinceramente, di quel che feci in passato ho dimenticato tutto; e non sono in grado di capire la questione facendo il reverse engineering del tuo file e delle macro allegate
Avatar utente
Anthony47
Moderatore
 
Post: 18602
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: prelevare dati solo da URL multipli

Postdi Gianca532011 » 02/11/22 14:48

Allora questa è derivata dalla tua Caller nella quale con il gruppo degli IF vedi colorato tento di fare un azione selettiva , ovvero attivo due link , da qui scarico i dati e poi il loop dovrebbe ripartire da un altro Isin e via di seguito. se invece i primi due Url sono vuoti = senza dati= procedi con altri due links e cosi via. Lo scopo e di fare girare selenium il meno possibile , quindi con risparmio di tempo.

Ti allego file test, nel modulo tre troverai anche un altro tentativo di apertura chrome diretto , senza selenium, ma non funziona lo scarico dei dati via xmlhttp. Lo trovi qui. https://ufile.io/nbdat6mo

Codice: Seleziona tutto
Option Explicit
Dim WPage As Object

Sub Caller()
'http://www.pc-facile.com/forum/viewtopic.php?f=26&t=112311&p=660077#p660077
    Dim myIsin As String, myUrl As String, LastA As Long, i As Long, Last1 As Long
    Dim AllTabs, J As Long, K As Long, L As Long, myHead As String, P As Long, ur As Long
    Sheets("DataColl").Activate
    ur = Cells(Rows.Count, 1).End(xlUp).Row
   
    ' converti isin a maiuscolo
    Dim x As Object
    For Each x In Range("A2:A" & ur)
        x.Value = UCase(x.Value)
    Next
       
    'Crea Driver:
    If WPage Is Nothing Then
        Set WPage = CreateObject("Selenium.ChromeDriver")
        WPage.Start "Chrome"
   End If
   
 
    With WPage
   
    LastA = Cells(Rows.Count, "A").End(xlUp).Row            'Quanti Isin?
    Last1 = Cells(1, Columns.Count).End(xlToLeft).Column    'Quante colonne?
    '
    Range("B2:P" & LastA).ClearContents
         
    'For P = 1 To 6                              'Cerca in tutti gli URL
         
    For i = 2 To LastA                              ' per ogni Isin dato
        myIsin = Cells(i, 1)
           
        Dim url1 As String, url2 As String, url3 As String, url4 As String, url5 As String, url6 As String

       ' nota i links funzionano mettendoci -obbligatoriamente-  anche l'isin
       url1 = "https://www.borsaitaliana.it/borsa/obbligazioni/mot/obbligazioni-in-euro/scheda/" & myIsin & ".html?lang=it"
       url2 = "https://www.borsaitaliana.it/borsa/obbligazioni/mot/obbligazioni-in-euro/dati-completi.html?isin=" & myIsin & "&lang=it"
        url3 = "https://www.borsaitaliana.it/borsa/obbligazioni/extramot/scheda/" & myIsin & ".html?lang=it"
       url4 = "https://www.borsaitaliana.it/borsa/obbligazioni/extramot/dati-completi.html?isin=" & myIsin & "&lang=it"
       url5 = "https://www.borsaitaliana.it/borsa/obbligazioni/eurotlx/scheda/" & myIsin & ".html?lang=it"
       url6 = "https://www.borsaitaliana.it/borsa/obbligazioni/eurotlx/dati-completi.html?isin=" & myIsin & "&lang=it"
         
>>>>>????? >>>>>><<<   <
          [color=#FF0040]
          If Cells(i, 3) = "" Then
          .Get url1
           .Get url2
            GoTo 10
           WPage.Close
            Stop
           
            Else                       'If Cells(i, 3) = "" Then
            WPage.Get , url3
            WPage.Get url4
            GoTo 10
        WPage.Close
        End If
       If Cells(i, 3) = "" Then
            WPage.Get url5
            WPage.Get url6
            GoTo 10
         WPage.Close
        End If
        [/color]
10:
        AllTabs = GimmeTablesArr(WPage, myUrl)      'Ottieni la matrice delle tabelle
           
        For J = 2 To Last1                          'Cerca l'intestazione di ogni colonna...
            myHead = Cells(1, J).Value
            For K = 1 To UBound(AllTabs)            '... in tutte le tabelle della pagina...
                On Error Resume Next
                For L = 1 To UBound(AllTabs(K))     '.... in tutte le righe di ogni tabella
                    'Se "Trovato" allora scrivi il valore:
                    If InStr(1, AllTabs(K)(L, 1), myHead, vbTextCompare) = 1 Then
                        If Cells(i, J) = "" Then Cells(i, J) = AllTabs(K)(L, 2)
                    End If
                    On Error GoTo 0
                Next L
            Next K
        Next J
    Next i
   
   ' Next P
    End With
       'Quit Selenium
    WPage.Quit
   
    'allinea a dx e rendi numeri a stringa
    ur = Sheets("DataColl").Cells(Rows.Count, 1).End(xlUp).Row
    With Sheets("DataColl")
        .Range("D2:O" & ur).Select
           With Selection
            .HorizontalAlignment = xlRight
            .VerticalAlignment = xlBottom
            .WrapText = False
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With
           End With
   
    With Sheets("DataColl")
        .Range("B2:C" & ur).Select
        With Selection
            .NumberFormat = "@"
            .HorizontalAlignment = xlLeft
            .VerticalAlignment = xlTop
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With
    End With
   
    Set WPage = Nothing
    MsgBox ("Informazioni raccolte...")
End Sub
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 312
Iscritto il: 27/05/11 10:18


Torna a Applicazioni Office Windows


Topic correlati a "prelevare dati solo da URL multipli":


Chi c’è in linea

Visitano il forum: Nessuno e 13 ospiti