Condividi:        

Selenium con Agcom

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

Selenium con Agcom

Postdi Raffaele53 » 24/10/24 13:44

Una macro con IE funzionava sino qualche mese fà, mi sono accorto che bastava cambiargli il link per farla funzionare nuovamente (da www.agcom ad old.agcom) mà presumo che tra poco non funzionerà più. Volevo rifare la macro usando Selenium, però mi sono accorto che le "Voci_Html" sono totalmente cambiate e non riesco a far nulla.
Modulo2 Macro per www.agcom
Modulo3 Macro per old.agcom (funziona)
Modulo4 Macro Selenium (incompletta)
Grazie Mille>>>https://www.mediafire.com/file/j1tccvu18e53kw3/Mail-Agcom-Marco.xlsm/file
Raffaele53
Utente Junior
 
Post: 19
Iscritto il: 03/10/24 13:06

Sponsor
 

Re: Selenium con Agcom

Postdi Anthony47 » 24/10/24 21:28

Allora, la cosa interessante e' che la pagina https://www.agcom.it/numerazionicallcenter in realtà al suo interno apre un <iframe> con src= https://www.agcom.it/numerazionicallcenter
Quindi per questo esperimento e' piu' semplice aprire direttamente l'url https://www.agcom.it/numerazionicallcenter

Ho da qui estratto i dati di quell'elenco di numeri usando questo codice:
Codice: Seleziona tutto
Sub DaAGCOM()
'Selenium
Dim WPage As Object
Dim CollA As Object, CollB As Object
Dim myArr, I As Long, LastF As Long, J As Long, K As Long
'
'Crea Driver:
Set WPage = CreateObject("Selenium.WebDriver")
myURL = "https://old.agcom.it/numerazionicallcenter"         'Your url
WPage.Start "chrome", myURL
WPage.Get "/"
WPage.Wait 200
'
Set CollA = WPage.FindElementsByClass("agree-button")
If CollA.Count > 0 Then             'Eventuale pulsante Privacy
    CollA(1).Click
    WPage.Wait 500
End If
LastF = Cells(Rows.Count, "F").End(xlUp).Row
For I = 2 To LastF
    WPage.FindElementsById("numerotelefono")(1).SendKeys (String(20, Chr(8)))   'Clear input
    WPage.FindElementsById("numerotelefono")(1).SendKeys (Cells(I, "F"))        'Nuovo numero
    Set CollA = WPage.FindElementsByTag("Form")
    CollA(2).submit
    WPage.Wait 300
    Cells(I, "G").Resize(1, 30).ClearContents                                       'Azzera area risultati
    If InStr(1, WPage.FindElementsById("num-risultati")(1).text, "Risultati trovati", vbTextCompare) > 0 Then
        myArr = WPage.FindElementsByClass("tab-telefonia-fissa")(1).AsTable.Data    'Legge Tabella esito
        For K = 2 To UBound(myArr)                                                  'Gestione multi esiti
            Cells(I, "G").Offset(0, 6 * (K - 2)).Resize(1, UBound(myArr, 2)).Value = Application.WorksheetFunction.Index(myArr, K, 0)
        Next K
    Else
        Cells(I, "G") = "Nessun Risultato"
    End If
Next I
MsgBox ("Completato...")
WPage.Quit
Set WPage = Nothing
End Sub

Non ho collaudato l'ipotesi di piu' risultati per lo stesso numero (loop For K = 2 To UBound(myArr) /Next K) perchè non conosco numeri che abbiano questo esito

Se hai bisogno di "perchè" chiedi pure, ma potresti rimanere deluso dalla risposta :D
Avatar utente
Anthony47
Moderatore
 
Post: 19421
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Selenium con Agcom

Postdi maxpit » 24/10/24 22:16

Buonasera Raffaele53,

qui sotto riporto il codice modificato (ho reso commenti le linee di codice che ho ritenuto non necessarie per raggiungere il risultato) ma prima di tutto, nel file, dovrà essere attivato il riferimento alla libreria "Selenium Type Library" altrimenti non è possibile utilizzare Selenium.

Codice: Seleziona tutto
Sub Telefoni_Agcom_Selenium()
    Dim Cd As New Selenium.EdgeDriver
'    Dim Tb As Selenium.WebElements
    Dim El As Selenium.WebElement
    Dim eTr As Selenium.WebElement
   
    Const myURL As String = "https://www.agcom.it/numerazionicallcenter"
    Dim Ur As Long, X As Long, n As Long, Num As String 'String per ex 02.123456789
    Ur = Range("F" & Rows.Count).End(xlUp).Row
    If X = 1 Then Exit Sub

    With Cd
        .Start
        .SetCapability "ms:edgeOptions", "{""args"":[""--headless""]}"
        .Get myURL
        .Wait 750
        .FindElementsByCss("button.agree-button")(1).Click    ' cookies
       
        '-------------------
        .SwitchToFrame .FindElementsByTag("iframe")(1)        ' mi sposto nel frame
        .activeElement.WaitEnabled
       
        For X = 2 To Ur
            Num = Cells(X, 6)
            .FindElementByCss("#numerotelefono").SendKeys (Chr$(127) & Num) ' inserisco il numero di telefono
            On Error Resume Next
            Do
                .FindElementsByCss(".submit_input")(1).Click
                If Err = 0 Then Exit Do
                Err.Clear
            Loop
            On Error GoTo 0

'        Set Tb = .FindElementsByCss(".tab-telefonia-fissa")
'        n = Tb.Count
       
            For Each eTr In .FindElementsByCss(".tab-telefonia-fissa tr")
                If eTr.FindElementsByCss("td").Count Then
                    Range("L" & X).Value = eTr.FindElementsByCss("td")(6).Text
                    Range("M" & X).Value = eTr.FindElementsByCss("td")(1).Text
                    Range("N" & X).Value = eTr.FindElementsByCss("td")(2).Text
''                Range("L" & X).Value = .FindElementsByClass("ng-binding")(3).Attribute("innerText")
''                Range("M" & X).Value = .FindElementsByClass("ng-binding")(2).Attribute("innerText")
''                Range("N" & X).Value = .FindElementsByClass("ng-binding")(1).Attribute("innerText")
                End If
           
            Next eTr
       
        Next X
       
        '-------------------
        .SwitchToParentFrame                                  ' ritorno al chiamante
   
    End With
   
End Sub

Prova e fai sapere, ma soprattutto è importante capirne il contenuto altrimenti non ti sarà possibile fare anche piccole modifiche in autonomia.

A presto.

P.S.: vale anche per questo codice quanto ha già detto @Anthony47 circa la possibilità di risultati multipli ottenuti interrogando un numero di telefono ...
Avatar utente
maxpit
Utente Junior
 
Post: 19
Iscritto il: 04/08/24 11:59

Re: Selenium con Agcom

Postdi Raffaele53 » 25/10/24 15:30

Ciao a tutti, stavo aspettando "invano" un numero tel. per ottenere diversi-riscontri

@Anthony47
Ho installato Chrome Versione 130.0.6723.70 (Build ufficiale) (a 64 bit)
Il Driver non esiste, c'è la versione simile con xxx.x.xxxx.69 finale (presumo vada bene ed inserito)
https://storage.googleapis.com/chrome-f ... -win64.zip

Di norma uso Option Explicit, aggiunto "Dim myURL As String" e si ferma sù >>>Set WPage ???
Domanda. Non ho capito la cosa interessante? Nel post dici www.agcom e nel VBA usi old.agcom?

@maxpit
Reinstallato un mese fà W10, non capisco perchè "ieri" non fosse spuntata "Selenium Type Library"
Usavo browser Edge e tramite "IA" ho fatto alcune prove senza risultato mà senza errori.
Col Tuo codice errore in "With Cd"

Vorrei sapere se da Voi il files funziona, riallego: Anthony47 in Modulo5, maxpit in Modulo6
Ps. Nel foglio HELP, cè la foto della directory di Selenium. Grazie mille a Voi
https://www.mediafire.com/file/j1tccvu1 ... .xlsm/file
Raffaele53
Utente Junior
 
Post: 19
Iscritto il: 03/10/24 13:06

Re: Selenium con Agcom

Postdi Anthony47 » 25/10/24 18:34

Quindi si ferma su Set WPage = CreateObject("Selenium.WebDriver") ??
E non esce un messaggio esplicito su cosa succede?

La mia installazione e' coerente con le istruzioni che avevo pubblicato qui: viewtopic.php?f=26&t=112225#p659460
Per il driver di Chrome Vers 115: viewtopic.php?f=26&t=112225#p664966

Sul mio PC la mia macro funziona anche senza spuntare la libreria Selenium, usando il file pubblicato oggi pomeriggio.

Quanto all'url utilizzato, ho sbagliato a scrivere nel messaggio: l'indirizzo https://www.agcom.it/numerazionicallcenter in realtà al suo interno apre in un iframe il vecchio indirizzo https://old.agcom.it/numerazionicallcenter e quindi invece di provare a selezionare l'iframe (cosa non sempre facile) uso direttamente old.agcom.it

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

Re: Selenium con Agcom

Postdi maxpit » 25/10/24 19:58

Buonasera Raffaele53,

ho utilizzato il codice inserito nel Modulo 6, sostituendo il browser in Chrome e eliminando la linea di codice Set Capability: ha funzionato tutto correttamente come da immagine sotto riportata senza errori ( le colonne L, M e N sono state popolate quando è stato trovato il numero) :

Immagine

N.B. nel sito dive l'ho inserita può essere vista completa.

Per l'errore devi essere più preciso perché quello che hai indicato su quella riga di istruzione "With Cd" non ha senso e potrebbe derivare da qualche modifica effettuata nel codice.

A presto
Avatar utente
maxpit
Utente Junior
 
Post: 19
Iscritto il: 04/08/24 11:59

Re: Selenium con Agcom

Postdi Raffaele53 » 25/10/24 20:34

Uso Excel2019

@Anthony47
Forse dipende dalla versione del driver xxx.x.xxxx.69/70 ???
Errore di run-time '2146232576 (80131700)
Ps. Ho richiesto una modifica, perchè credo che "old.agcom.it" stia per andare in disuso.

@maxpit
Non ho fatto nessuna modifica. Modificando >>>Dim Cd As New Selenium.ChromeDriver, mi da lo stesso errore di Anthony47
Raffaele53
Utente Junior
 
Post: 19
Iscritto il: 03/10/24 13:06

Re: Selenium con Agcom

Postdi maxpit » 25/10/24 20:48

Buonasera Raffaele53,

Se usi Chrome e ottieni quel risultato è di sicuro un errore di Driver Selenium.

E il motivo più probabile è la versione non corretta/non adeguata rispetto al browser che utilizzi.

Prova a leggere qui per la tua versione https://chromereleases.googleblog.com/2 ... op_22.html.

A presto

P.S.: @Anthony47, ho provato anche il tuo codice nel modulo5 ha funzionato compilando la tabella e non ha restituito errori.
Avatar utente
maxpit
Utente Junior
 
Post: 19
Iscritto il: 04/08/24 11:59

Re: Selenium con Agcom

Postdi Anthony47 » 25/10/24 23:43

Errore di run-time '2146232576 (80131700)
Raffaele, credo che dipenda da quanto detto qui: viewtopic.php?f=26&t=112225#p661017
(non da un errore del driver)


Ps. Ho richiesto una modifica, perchè credo che "old.agcom.it" stia per andare in disuso.
Come detto "nuovo.agcom" richiama al suo interno old.agcom:
Codice: Seleziona tutto
<iframe class="servizio-x-iframe" style="height:388px;" src="https://old.agcom.it/numerazionicallcenter" title="Numerazioni telefoniche"></iframe>
Quindi quando old.agcom sara' dismesso TUTTO quello che progettiamo oggi sarà inutile, che usi https://www.agcom.it/numerazionicallcenter o https://old.agcom.it/numerazionicallcenter non fa differenza
Avatar utente
Anthony47
Moderatore
 
Post: 19421
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Selenium con Agcom

Postdi Raffaele53 » 26/10/24 10:47

Come detto un mese fà ho reinstallato W10, oggi ho abilitato "NET Framework 3.5" e riavviato. La macro di @Anthony47 funziona, quelle di @maxpit... con Chrome nessun errore ma non estrae dati, con Edge si ferma sù Start con "Errore di run-time '-2146233078 (8013150a)':
Origine non trovata, ma non è stato possibile eseguire la ricerca in uno o piu log eventi non accessibili: Security, State"

@Anthony47, alcuni mesi fà il sito AGCOM è stato "rifatto" Ti garantisco che prima non esisteva old.agcom. Non sò per quale motivo sia stato creato (forse problemi interni Loro), in questo momento esiste e la mia vecchia macro funziona ancora. Forse andrà avanti per anni, mà se domani mattina lo tolgono? Il vecchio HTML era molto più semplice, vedo che ultimamente molti siti sono già cambiati e onestamente questa nuova scrittura non riesco leggerla. Esiste un sito che spiega questo nuovo HTML?

Vi ringrazio per quello che avete fatto.
Raffaele53
Utente Junior
 
Post: 19
Iscritto il: 03/10/24 13:06

Re: Selenium con Agcom

Postdi maxpit » 26/10/24 13:25

Buon pomeriggio Raffaele53,

cosa intendi con
Raffaele53 ha scritto:@maxpit... con Chrome nessun errore ma non estrae dati ...

perché se guardi l'immagine che ho allegato, clickando sopra, l'immagine si allarga e diventa completa e vedi che solo le colonne L, M e N contengono i dati rilevati per i soli numeri trovati, come era già presente nella tua macro originale (nella tua macro io ho solo inserito il codice necessario per estrarre i dati che già tentavi di rilevare).

A presto
Avatar utente
maxpit
Utente Junior
 
Post: 19
Iscritto il: 04/08/24 11:59

Re: Selenium con Agcom

Postdi Anthony47 » 26/10/24 14:52

Credo che col codice di Max ci sia un problema di sincronizzazione dei dati

Raffaele, prova eliminando l'istruzione .SetCapability "ms:edgeOptions",etc etc

Quanto all' aggiornamento del sito, probabilmente è stato fatto per avere una maggiore facilità di aggiornamento dei contenuti con nuovi strumenti di authoring che se ne infischiano del codice html generato.
Quando old.agcom.it/numerazionicallcenter sarà sostituita inevitabilmente il codice che oggi funziona (il tuo, il mio, quello di Max) saranno da riscrivere.
Non ho una grossa esperienza di html quindi non so che documentazione consigliarti, se non il classico sito https://www.w3schools.com/html/
Avatar utente
Anthony47
Moderatore
 
Post: 19421
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Selenium con Agcom

Postdi Raffaele53 » 26/10/24 17:45

Errore mio, non mi ero accorto che li scaricava da colonna L in poi. Adesso vedo di capire bene come avete fatto, casomai chiederò nuovamente. Grazie mille a tutti due.
Raffaele53
Utente Junior
 
Post: 19
Iscritto il: 03/10/24 13:06


Torna a Applicazioni Office Windows


Topic correlati a "Selenium con Agcom":


Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti