Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    24

    [VB6] Errore Parsing pagina web html

    Ciao Ragazzi,
    ho un problema durante il parsing di una pagina web che eseguo col VB6, cosa che funzionava senza problema fino a poco tempo fa.
    In pratica scaricavo la seguente pagina web dalla quale (con parsing) prelevavo tutti i numeri estratti per alimentare alcune mie routine:

    https://www.lotto-italia.it/10-e-lot...=20221227.html

    La routine utilizzata da me è la seguente:

    codice:
    sLinkHtml = "https://www.lotto-italia.it/10-e-lotto/estrazioni/dettaglio-estrazione?data=" & Format(sNuovaData, "yyyymmdd")   
    sFileLocal = App.Path & "\Temp\" & Format(sNuovaData, "yyyymmdd") & ".html"   
    Call DownloadFromWeb(sLinkHtml, sFileLocal)    ' scarica il file
    Fin prima riuscivo a fare il parsing, ora al download non ho più modo di estrarre i numeri dal file html cioè all'interno del file scaricato non li vedo proprio...

    E' cambiato qualcosa a livello di https ? Oppure è la causa il nuovo html 5 ?

    Se qualcuno può illuminarmi sarei molto grato.

    Grazie

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Quote Originariamente inviata da Moro_80 Visualizza il messaggio
    E' cambiato qualcosa a livello di https?
    Il protocollo HTTPS non cambia, ed è una sovrastruttura: se scarichi qualcosa in HTTPS, i dati li leggi comunque "in chiaro" perché il pacchetto dei dati viene codificato e decodificato in un altro livello.

    Quote Originariamente inviata da Moro_80 Visualizza il messaggio
    Oppure è la causa il nuovo html 5?
    Come si può dire qual è la causa se non sappiamo come analizzavi i dati in precedenza?

    Non abbiamo codice che mostra come estrai i dati dalla pagina, quindi non sappiamo cosa ti aspetti, e non possiamo sapere cosa sia cambiato nell'implementazione attuale rispetto a quella su cui ti sei inizialmente basato.

    Quote Originariamente inviata da Moro_80 Visualizza il messaggio
    Se qualcuno può illuminarmi sarei molto grato.
    Da quello che si può vedere, la pagina contiene un'applicazione Web lato client creata con Angular, una Single Page Application, che preleva i dati dinamicamente al suo caricamento e li utilizza per generare l'interfaccia visibile nella pagina.

    Si direbbe che così risulta ancora più semplice ottenere i dati: basta interpretare la risposta della chiamata effettuata per scaricarli, ad esempio invocando questo endpoint e variando il parametro della data, intepretando il pacchetto in formato JSON che viene restituito con i dati delle estrazioni di quel giorno.

    Io verificherei comunque di avere i diritti di utilizzare quei dati e di poterli scaricare, pena la possibilità che il servizio venga negato da un momento all'altro senza preavviso.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    24
    Ciao alka,
    in primis volevo ringraziarti già solo del fatto di avermi risposto dandomi tutte le delucidazioni del caso, grazie davvero !

    Quote Originariamente inviata da alka Visualizza il messaggio
    Il protocollo HTTPS non cambia, ed è una sovrastruttura: se scarichi qualcosa in HTTPS, i dati li leggi comunque "in chiaro" perché il pacchetto dei dati viene codificato e decodificato in un altro livello.
    Perfetto, quindi non ha nulla a che fare con il protocollo sicuramente.

    Come si può dire qual è la causa se non sappiamo come analizzavi i dati in precedenza?
    Non abbiamo codice che mostra come estrai i dati dalla pagina, quindi non sappiamo cosa ti aspetti, e non possiamo sapere cosa sia cambiato nell'implementazione attuale rispetto a quella su cui ti sei inizialmente basato.
    Posso postare anche il codice al completo non è nulla di che, alla fine il progettino in vb6 andava semplicemente a prendere questi dati scrivendoli in un archivio testo, tutto qua.
    Se le regole non lo vietano, posso postarlo o metterlo qui in formato zip.
    Non l'ho fatto per evitare violazioni di regole

    Da quello che si può vedere, la pagina contiene un'applicazione Web lato client creata con Angular, una Single Page Application, che preleva i dati dinamicamente al suo caricamento e li utilizza per generare l'interfaccia visibile nella pagina.
    Si direbbe che così risulta ancora più semplice ottenere i dati: basta interpretare la risposta della chiamata effettuata per scaricarli, ad esempio invocando questo endpoint e variando il parametro della data,
    L'end point è comunque quello che già interpretavo in precedenza, poi non so come mai non riuscivo più a "lavorarci"

    interpretando il pacchetto in formato JSON che viene restituito con i dati delle estrazioni di quel giorno.
    Qui sono in leggerà difficoltà...in che senso interpretare il formato JSON?

    Io verificherei comunque di avere i diritti di utilizzare quei dati e di poterli scaricare, pena la possibilità che il servizio venga negato da un momento all'altro senza preavviso.
    Ciao!
    Certo, una verifica la faccio senza problemi e mi accerto di tutto, anche se mi sembra che alla fine non venga violato alcunchè, sono comunque dati prelevabili da qualsiasi sito web, alcuni addirittura già in formato zip mensile, giornaliero o altro, in ogni caso verifico.

    Ad ogni modo ancora,

    GRAZIE

  4. #4
    in effetti leggere un JSON è molto più comodo perché il dato è già fruibile
    controlla qui https://www.google.com/search?q=vb6+json

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    24
    Quote Originariamente inviata da optime Visualizza il messaggio
    in effetti leggere un JSON è molto più comodo perché il dato è già fruibile
    controlla qui https://www.google.com/search?q=vb6+json
    Grazie mille optime, ci studio subito sopra!

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    24
    Alka, optime datemi una mano almeno a capire come muovermi...

    Dunque, fin prima io agivo su un file html che aveva il seguente formato:

    codice:
    <th><div class="numeroEstrazione">001 - 22/07</div></th>
                                <td><div class="numeroEstratto">2</div></td>
                                <td><div class="numeroEstratto">7</div></td>
                                <td><div class="numeroEstratto">10</div></td>
                                <td><div class="numeroEstratto">11</div></td>
                                <td><div class="numeroEstratto">21</div></td>
                                <td><div class="numeroEstratto">23</div></td>
                                <td><div class="numeroEstratto">24</div></td>
                                <td><div class="numeroEstratto">25</div></td>
                                <td><div class="numeroEstratto">28</div></td>
                                <td><div class="numeroEstratto">43</div></td>
                                <td><div class="numeroEstratto">47</div></td>
                                <td><div class="numeroEstratto">49</div></td>
                                <td><div class="numeroEstratto">53</div></td>
                                <td><div class="numeroEstratto">59</div></td>
                                <td><div class="numeroEstratto">61</div></td>
                                <td><div class="numeroEstratto">65</div></td>
                                <td><div class="numeroEstratto">72</div></td>
                                <td><div class="numeroEstratto">77</div></td>
                                <td><div class="numeroEstratto">81</div></td>
                                <td><div class="numeroEstratto">89</div></td>
                                            <td><div class="numeroSpeciale">72</div></td>
    Qui con VB6 col seguente codice facevo il parsing:

    codice:
    Private Sub LeggiFileHtmlTornaEstrazioni(sFile As String, aRetEstr() As STRUCT_ESTRAZIONE_10LOTTO, nAnno As Integer)
        Dim nRiga As Long    'faccio il cicla sulle righe lette
        Dim nTrovate As Long  ' faccio il conteggio di tutte le estrazioni trovate
        Dim nNumTrovati As Integer  ' faccio il conteggio di tutti i num trovati
        ReDim aRetEstr(0) As STRUCT_ESTRAZIONE_10LOTTO
        ReDim aRighe(0) As String    ' ora con questa funzione preparo l'array che conterà tutte le righe del file
        Call LeggiFileTornaRighe(sFile, aRighe)    ' richiamo la funzione che effettua la lettura del file
        For nRiga = 0 To UBound(aRighe)
            If InStr(aRighe(nRiga), "numeroEstrazione") Then    'contiene la data, ed è quella che dice che abbiamo trovato una nuova estrazione
                nTrovate = nTrovate + 1 ' adesso faccio l'incremento delle estrazioni che ho trovato
                ReDim Preserve aRetEstr(nTrovate) As STRUCT_ESTRAZIONE_10LOTTO  ' ora ridimensiono l'array preservando i valori precedenti
                Call LeggiDataEId(aRetEstr(nTrovate), aRighe(nRiga), nAnno)    ' richiamo alla funzione di "supporto" denominata "LeggiDataEId"
                nNumTrovati = 0
            End If
            If InStr(aRighe(nRiga), "numeroEstratto") Then    ' è la riga che contiene uno dei numeri estratti
                nNumTrovati = nNumTrovati + 1    'variabile per conteggiare le righe lette
                Call LeggiNumeroEstratto(aRetEstr(nTrovate), aRighe(nRiga), nNumTrovati)    ' richiamo alla funzione di "supporto" denominata "LeggiNumeroEstratto"
            End If
            If InStr(aRighe(nRiga), "numeroSpeciale") Then    ' è la riga che contiene il numero oro estratto
                Call LeggiNumeroOro(aRetEstr(nTrovate), aRighe(nRiga))    ' richiamo alla funzione di "supporto" denominata "LeggiNumeroOro" per valorizzarlo
            End If
        Next
        DoEvents
        'Kill sFile
    End Sub
    'Con la procedura "LeggiDataEId" passo l'elemento dell'array e la stringa letta con i valori data e N° Estr e mi valorizza i membri dell' array che contiene l'estrazione da valorizzare
    Private Function LeggiDataEId(structEstr As STRUCT_ESTRAZIONE_10LOTTO, sRiga As String, nAnno As Integer)
        Dim i As Integer
        Dim sTemp As String
        ReDim av(0) As String
        'sRiga = Replace(sRiga, "<br>", "-")
        av() = Split(sRiga, "<")
        i = InStr(av(1), ">")
        sTemp = Left(av(1), i - 1)
        ReDim av(0) As String
        av() = Split(sTemp, "-")
        structEstr.strctData.nNumEstrazione = Val(av(0))
        ReDim avv(0) As String
        avv() = Split(av(1), "/")
        structEstr.strctData.AA = nAnno
        structEstr.strctData.Mm = Val(Trim$(avv(1)))
        structEstr.strctData.GG = Val(Trim$(avv(0)))
        
       ' Debug.Print Val(av(0))
       ' Debug.Print nAnno
       ' Debug.Print Val(Trim$(avv(1)))
       ' Debug.Print Val(Trim$(avv(0)))
        
    End Function
    ' Con la procedura "LeggiNumeroEstratto" passo l'elemento dell'array aRetEstr che ha bisogno anch'esso di essere valorizzato
    Private Sub LeggiNumeroEstratto(structEstr As STRUCT_ESTRAZIONE_10LOTTO, sRiga As String, nIdNumeroDaValorizzare As Integer)
        Dim i As Integer
        Dim sTemp As String
        ReDim av(0) As String
        av() = Split(sRiga, ">")
        i = InStr(av(1), "<")
        sTemp = Left(av(1), i - 1)
        structEstr.aNum(nIdNumeroDaValorizzare) = Val(sTemp)
    End Sub
    ' Con la procedura "LeggiNumeroOro" passo l'elemento dell'array aRetEstr che ha bisogno anch'esso di essere valorizzato
    Private Sub LeggiNumeroOro(structEstr As STRUCT_ESTRAZIONE_10LOTTO, sRiga As String)
        Dim o As Integer
        Dim sTemp1 As String
        ReDim av(0) As String
        av() = Split(sRiga, ">")
        o = InStr(av(4), "<")
        sTemp1 = Left(av(4), o - 1)
        structEstr.nNumOro = Val(sTemp1) 'Val(sTemp1) contiene i numeri oro trovati
    End Sub

    Ma ora con il file json da voi indicato come posso muovermi per il parsing in modo da avere sempre le mie variabili alimentate?

    E' possibile per voi darmi delle "dritte" ?

    Vi ringrazio

  7. #7
    Moro, ma non hai trovato nulla in tutta la documentazione presente on-line? Ci sono librerie apposite, ovvio che dovrai adattarle alla tua situazione

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    24
    Quote Originariamente inviata da optime Visualizza il messaggio
    Moro, ma non hai trovato nulla in tutta la documentazione presente on-line? Ci sono librerie apposite, ovvio che dovrai adattarle alla tua situazione
    Ciao optime,
    si si mi sto studiando la documentazione trovata online, il problema è proprio la seconda parte da te menzionata : "...dovrai adattarla alla tua situazione..." mi sa che che qui resto inceppato, purtroppo.

  9. #9
    posta qualcosa e vediamo di sistemarlo assieme

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    24
    Quote Originariamente inviata da optime Visualizza il messaggio
    posta qualcosa e vediamo di sistemarlo assieme
    Ti dico grazie fin da ora, che si arrivi al fine o meno

    Parto dall'inizio, così magari è più chiaro ciò che mi piacerebbe fare.
    Questo piccolo programmino non fa altro che interfacciarsi con un software che tratta il gioco del lotto, software completamente scritto da una persona privata e assolutamente libero a tutti, quindi nessuna violazione di nessun tipo.
    La stessa persona che scrisse il software mi aiutò all'epoca a scrivere il codice che ho adesso per eseguire l'aggiornamento dell'archivio estrazioni, nel mio caso mi interessava solo quello del 10elotto ogni 5 minuti.
    Purtroppo il progetto è stato abbandonato e la persona che lo seguiva non ne ha più alcun interesse, mi piacerebbe poter continuare ad utilizzarlo potendo aggiornare l'archivio, null'altro.
    Cosa che ho fatto fin poco fa scaricando il file in html come indicato qualche post sopra, ora come suggerito da alka sarebbe ottimo gestire il file json che è l'end point, ma ho difficoltà a gestirlo non avendolo mai fatto, come si evince non sono un programmatore, ma appassionato
    Il programmino non faceva altro che prendere quel file dal web e farlo diventare archivio consultabile per il software principale, tutto qua.
    La prima cosa che affrontammo all'epoca era il fatto di dover "ciclare" ogni volta il file per capire a che punto era fermo l'archivio delle estrazioni, essendo esse estratte ogni 5 minuti, cosa che con il VB6 io faccio così:

    codice:
     sDataUltimaEstr = av(2)
        ' iniziamo il ciclo di lettura delle pagine html
        sNuovaData = sDataUltimaEstr  ' partiamo dall'ultima data disponbile
        
        ValTot = DateDiff("d", sDataUltimaEstr, Now) + 1 ' calcola i giorni totali dall'ultima in archivio a oggi
        
        bFerma = False
        
        Do While Format(sNuovaData, "yyyymmdd") <= Format(Now, "yyyymmdd")
            sLinkHtml = "https://www.lotto-italia.it/del/estrazioni-e-vincite/popup-pdf/estrazioni-giorno.json?data=" & Format(sNuovaData, "yyyymmdd")    ' costruisce il link base
            sFileLocal = App.Path & "\Temp\" & Format(sNuovaData, "yyyymmdd") & ".html"    ' costruuisce il percorso per il file in locale
            Call DownloadFromWeb(sLinkHtml, sFileLocal)    ' scarica il file
            ReDim aEstr(0) As STRUCT_ESTRAZIONE_10LOTTO
            
            LblDataAggiunta.Caption = sNuovaData
            
            Call LeggiFileHtmlTornaEstrazioni(sFileLocal, aEstr, Year(sNuovaData))    ' richiamo la funzione "LeggiFileHtmlTornaEstrazioni"
            Call SalvaEstrazioni(aEstr, sDataUltimaEstr, sNuovaData, NumEstr, TotInserite)    ' richiamo la funzione "SalvaEstrazioni"
            sNuovaData = DateAdd("d", 1, sNuovaData)    ' aggiunge un giorno e ottiene una nuova data
    Poi con il codice che riporto qui andavamo ad alimentare le varie "variabili" che erano :
    data, numero estrazione, numeri estratti e all'epoca numero oro che era l'unica cosa in più che avevano aggiunto.

    La struttura dati era questa:

    codice:
    ' struttura per accesso al file base dati estrazioni
    Type STRUCT_DATA_EST
        nNumEstrazione As Integer
        GG As Integer
        Mm As Integer
        AA As Integer
    End Type
    Type STRUCT_ESTRAZIONE_10LOTTO
        idEstr As Long
        strctData As STRUCT_DATA_EST
        aNum(1 To 35) As Byte
        nNumOro As Byte
    End Type
    il codice che gestiva il tutto era quello postato sopra, è tanto lungo e qui non me lo lascia postare.

    codice:
    Function convertJsonToVariantArray(ByVal jsonString As String) As Variant()
    Dim cleanedUpArray() As Variant
    Dim brokenUpRows() As String
    
    
    'Remove the first and last square bracket in the string
    jsonString = Right$(jsonString, Len(jsonString) - 2)
    jsonString = Left$(jsonString, Len(jsonString) - 2)
    'Break up the string in an array
    brokenUpRows = Split(jsonString, "], [")
    
    
    Dim counter As Integer
    counter = 0
    Dim counter2 As Integer
    Dim brokenUpCols As Variant
    
    
    ReDim linkArray(UBound(brokenUpRows)) As String
    
    
    For counter = 0 To UBound(brokenUpRows)
    brokenUpCols = Split(brokenUpRows(counter), ",")
    If counter = 0 Then
    ReDim cleanedUpArray(UBound(brokenUpRows), UBound(brokenUpCols)) As Variant
    End If
    For counter2 = 0 To UBound(brokenUpCols)
    cleanedUpArray(counter, counter2) = brokenUpCols(counter2)
    Next
    Next
    convertJsonToVariantArray = cleanedUpArray
    End Function
    Però sono onesto, non so come amalgamarlo nel mio codice scritto all'epoca...ecco perchè ho chiesto aiuto.

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.