Condividi:        

Download dati metodo XMLHttp

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

Download dati metodo XMLHttp

Postdi Gianca532011 » 21/06/22 17:01

Ciao, vorrei scaricare i dati da n.pagine (152) da questo sito :
https://www.borsaitaliana.it/borsa/obbl ... zata.html#

Vorrei evitare di usare Selenium perchè più lento, quindi ho copiato pari pari una macro che già funziona su B.Italiana con lo scopo di adattarla . Ma mi sono impantanato qui con errore di debug 091: " variabile oggetto o variabile del blocco with non impostata ????

Dove sbaglio ?


Codice: Seleziona tutto
Sub Scarica_EURTLX() ' tutte
    Dim html As HTMLDocument
    Dim mytable As Object
    Dim Tr As Object
    Dim Td As Object
    Dim r As Long
    Dim c As Integer
    Dim j As Integer
    Dim Pag As Integer
    Dim intest As Variant
    Dim inizio As Double
    Set html = New HTMLDocument
    Cells.ClearContents
    Dim sh1 As Worksheet
Set sh1 = Sheets("EURTLX")
sh1.Activate

    Pag = 101 ' qui le pagine da estrarre
   
    Application.ScreenUpdating = False
    intest = Array("Isin", "Descrizione", "Ultimo", "Cedola", "Scadenza", "Acquisto", "Vendita")
    Range("A1:G1") = intest
    r = 2: c = 1
    For j = 1 To Pag
        With CreateObject("MSXML2.XMLHTTP")
            .Open "GET", "https://www.borsaitaliana.it/borsa/obbligazioni/eurotlx/ricerca-avanzata.html#" & j, False
            .send
            html.body.innerHTML = .responseText
        End With
        Set mytable = html.querySelector("[class='m-table -firstlevel']")
                                                   [color=#FFFF00]  For Each Tr In mytable.getElementsByTagName("tr")                [/color]
            For Each Td In Tr.getElementsByTagName("td")
                If c = 1 Then
                    Cells(r, c) = Trim(Split(Td.innerText, Chr(10))(UBound(Split(Td.innerText, Chr(10)))))
                Else
                    Cells(r, c) = Td.innerText
                End If
                c = c + 1
            Next Td
            r = Cells(Rows.Count, 1).End(xlUp).Row + 1: c = 1
        Next Tr
        DoEvents
       
        r = Cells(Rows.Count, 1).End(xlUp).Row + 1
    Next j
    Application.ScreenUpdating = True
   
    Cells(1, 8) = "Dati aggiornati al " & Now
 
End Sub
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 348
Iscritto il: 27/05/11 10:18

Sponsor
 

Re: Download dati metodo XMLHTTP

Postdi Anthony47 » 21/06/22 22:44

Se controlli lo status delle richiesta fatta troverai che esso e’ 404 che e’ il fatidico Non Trovato.
Da li in poi ovviamente non torna nulla

Purtroppo non so se il sito http://www.borsaitaliana.it accetta richieste xmlhttp e in che formato, ne’ il modo in cui tu crei l’url ("https://www.borsaitaliana.it/borsa/obbligazioni/eurotlx/ricerca-avanzata.html#" & j, False) mi ha suggerito alcunche’; a meno che sul foglio non debbano esserci codici di titoli la cui sigla debba poi essere combinata con l’url base per creare la Request, ad esempio usando non & j ma & Cells(j,1)

Ma secondo me la cosa piu’ probabile e’ che tu voglia leggere i contenuti che quell’url elabora dopo che si e’ premuto il tasto Cerca, cosa (premere un tasto) che non credo sia consentito tramite una request. Quindi al momento la risposta e’ che bisogna tornare a interagire con il sorgente (con Selenium)

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

Re: Download dati metodo XMLHttp

Postdi Gianca532011 » 22/06/22 15:50

Ma secondo me la cosa piu’ probabile e’ che tu voglia leggere i contenuti che quell’url elabora dopo che si e’ premuto il tasto Cerca, cosa (premere un tasto) che non credo sia consentito tramite una request. Quindi al momento la risposta e’ che bisogna tornare a interagire con il sorgente (con Selenium)


Purtroppo è quello che temevo.
Il punto è che dovrei scaricare 152 pagg quindi mi serve un sistema abbastanza veloce. Per altre esperienze con selenium si va a... minuti :undecided: , altre Idee ?? Secondo te è possibile modificare quanto mi avevi suggerito qui :
viewtopic.php?f=26&t=112311

in modo che non operi leggendo un isin ma scaricando tutto l'elenco, pagina per pagina pur codificandoli usando la riga 1 ?
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 348
Iscritto il: 27/05/11 10:18

Re: Download dati metodo XMLHttp

Postdi Anthony47 » 22/06/22 23:41

In realtà, guardando dentro gli script del sorgente si trova il modo di fare una xmlhttp request, che mi ha consentito di arrivare a questo codice:
Codice: Seleziona tutto
Sub Scarica_EURTLX() ' tutte
Dim Tr As Object, TRColl As Object
Dim TD As Object, TDColl As Object
Dim Pag As Integer
Dim Intest As Variant
Dim I As Long, J As Long, MaxL As Long
Dim TArr(), K As Long, L As Long, taInd As Long
Dim sh1 As Worksheet, bUrl As String, myTim As Single
'
Set HTML = New HTMLDocument
'
myTim = Timer
Set sh1 = Sheets("EURTLX")
sh1.Activate
Cells.ClearContents
'
'
Pag = 200 ' qui le pagine MAX da estrarre
'Application.ScreenUpdating = False
bUrl = "https://www.borsaitaliana.it//borsa/obbligazioni/eurotlx/ricerca-avanzata/risultati.html?lang=it&page="
    Application.ScreenUpdating = False
    Intest = Array("Isin", "Descrizione", "Ultimo", "Cedola", "Scadenza", "Acquisto", "Vendita")
    Range("B1:H1") = Intest
    For J = 1 To Pag
        Debug.Print "Request per Pagina " & J, Format(Timer - myTim, "0.00")
        With CreateObject("MSXML2.XMLHTTP")
            .Open "GET", bUrl & J, False
            .send
            If .Status <> 200 Then
                MsgBox (.Status & " - Errore nelle Get, Pagina: " & J & vbCrLf _
                    & "Processo abortito")
                Exit Sub
            End If
            HTML.body.outerHTML = .responseText
        End With
        Debug.Print "Response ready", Format(Timer - myTim, "0.00")
        Set TBColl = HTML.getElementsByTagName("table")
        If TBColl.Length > 0 Then
            For I = 0 To TBColl.Length - 1
                Set TRColl = TBColl(I).getElementsByTagName("TR")
                If TRColl.Length < 3 Then
                    MsgBox ("Pagina " & J & ", nessun elemento; ricerca Terminata")
                    Debug.Print "Pagina " & Pag & ", nessun elemento; ricerca Terminata", "Riga: " & NextR, Format(Timer - myTim, "0.00")
                    GoTo ExiTA
                End If
                NextR = 2
                On Error Resume Next
                    NextR = Range("A:Z").Find(What:="*", After:=Range("A1"), _
                          SearchOrder:=xlByRows, _
                          SearchDirection:=xlPrevious).Row + 1
                On Error GoTo 0
                Cells(NextR, 1) = "Pag." & J & " #" & I + 1
                ReDim TArr(0 To TRColl.Length - 1, 0 To 10)
                For K = 0 To TRColl.Length - 1
                    Set TDColl = TRColl(K).getElementsByTagName("td")
                    If TDColl.Length > MaxL Then MaxL = TDColl.Length
                    For L = 0 To TDColl.Length - 1
                        TArr(taInd, L) = TDColl(L).innerText
                    Next L
                    If L > 0 Then taInd = taInd + 1
                Next K
                If MaxL > 0 Then
                    Cells(NextR, 2).Resize(taInd, MaxL).Value = TArr
                End If
                Erase TArr: MaxL = 0: taInd = 0
            Next I
        Else
            MsgBox ("Nessuna tabella in Pagina " & Pag & " - Ricerca terminata")
            Debug.Print "Nessuna tabella in Pagina " & Pag & " - Ricerca terminata", Format(Timer - myTim, "0.00")
            GoTo ExiTA
        End If
        Debug.Print "Pag." & J & " #" & I, "Riga: " & NextR, Format(Timer - myTim, "0.00")
        DoEvents
    Next J
ExiTA:
    Application.ScreenUpdating = True
    Cells(1, 11) = "Dati aggiornati al " & Now
End Sub

Ci sono un paio di punti in cui il codice avrebbe potuto essere semplificato (ero partito per una strada che poi si e' rivelata un vicolo cieco), ma visto che non dovrebbe dare fastidio lo lascio così
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Download dati metodo XMLHttp

Postdi Gianca532011 » 23/06/22 06:39

Grazie Anthony,
provato ma mi dà errore qui >:
[code] HTML.body.outerHTML = .responseText[code]

errore 600 definito dall'applicazione o dall'oggetto.

Ho attivato le librerie Ms internet control e Html object library.
Tieni anche conto che qui dove sono (al fresco in montagna :D ) uso un portatile con win 8,1 e office 2013.
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 348
Iscritto il: 27/05/11 10:18

Re: Download dati metodo XMLHttp

Postdi Anthony47 » 23/06/22 07:22

Prova ad aggiungere la Dim prima di Set:
Codice: Seleziona tutto
Dim html As HTMLDocument
Set html = New HTMLDocument

E poi quell'istruzione c'era gia' nel tuo codice

Il mio demo file e' qui: https://www.dropbox.com/s/glqpdxbnokhsa ... .xlsm?dl=0
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Download dati metodo XMLHttp

Postdi Gianca532011 » 23/06/22 07:45

Ciao, niente da fare anche col tuo demo mi dà lo stesso errore. <>Che sia il mio Excel?
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 348
Iscritto il: 27/05/11 10:18

Re: Download dati metodo XMLHttp

Postdi Anthony47 » 23/06/22 09:54

Che sia l’aria di montagna?

Ho notato che ora quell’istruzione fa riferimento a outerHTML, il tuo codice originale invece diceva html.body.innerHTML = .responseText
Prova a rimettere innerHTML, nel mio pc non fa differenza.

Ho aggiornato il mio file con l’esito della macro, così tanto per dimostrare che stamattina funziona ancora...
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Download dati metodo XMLHttp

Postdi Gianca532011 » 23/06/22 12:08

Perfetto. Adesso funziona anche a me.
Anthony, quando hai un po' di tempo, senza alcuna fretta, se commenti il tuo codice. francamente non ho capito che percorso hai fatto. grazie
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 348
Iscritto il: 27/05/11 10:18

Re: Download dati metodo XMLHttp

Postdi Anthony47 » 23/06/22 13:19

L'url usabile per una query diretta l'ho trovato esaminando uno script che contavo di poter eseguire in Selenium; se ispezioni questo url si vede cosa si ottiene:
https://www.borsaitaliana.it//borsa/obb ... =it&page=1
poi "basta" modificare il numero finale e aspettare che non venga restituito piu' niente.

Per velocizzare la raccolta, ogni tabella non viene scritta cella per cella ma come tabella completa, previa la compilazione della matrice TArr.
Ho inserito qualche commento sul codice direttamente nel file pubblicato
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Download dati metodo XMLHttp":


Chi c’è in linea

Visitano il forum: Nessuno e 16 ospiti