Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Prelevare dati da pagine web usando i Driver Selenium

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 da pagine web usando i Driver Selenium

Postdi Anthony47 » 18/11/21 12:34

Premessa
Per accedere alle informazioni contenute nelle pagine web abbiamo spesso usato InternetExplorer (IE), a cui il vba accede tramite una librera specifica, mshtml.tlb
Tramite i comandi resi disponibili da mshtml.tlb e' possibile aprire una pagina web, leggerne il contenuto, interagire con la pagina, salvare informazioni lette nella pagina, e molto altro.
Lo abbiamo fatto spesso; alcune discussioni a caso:
viewtopic.php?t=111384#p654158
viewtopic.php?t=111428#p654429
viewtopic.php?t=111570#p655197
viewtopic.php?t=111410#p654369
viewtopic.php?p=642086#p642035
viewtopic.php?p=629134#p636420
viewtopic.php?t=112056#p658466
viewtopic.php?t=112053#p658366

Nel tempo IE e' stato superato da nuovi browser (Chrome, Firefox, Opera, Edge, ??) e numerosi siti non lo supportano piu', sia per problemi di sicurezza che di prestazioni. Infine, il nuovo sistema operativo Windows 11 non supporta piu' IE.
Tutto questo significa che le macro basate su IE sono destinate a diventare inutilizzabili.

Possibile evoluzione
Una alternativa meno flessibile e' l'ambiente "Selenium": nato per creare ambienti di test automatizzati, puo' essere benissimo utilizzato per interagire con le pagine web per scopi non di test, ad esempio navigare, inserire parametri, leggere dati, esattamente come si faceva con IE.

L'ambiente Selenium comprende un "incapsulatore" che si chiama Selenium Basic e un driver specifico per il browser che si vuole utilizzare.

1) Per prima cosa e' necessario scaricare quindi Selenium Basic; lo trovate qui:
https://github.com/florentbr/SeleniumBasic/releases

La versione corrente e' la SeleniumBasic v2.0.9.0; e' del 2016, quindi dovrebbe essere abbastanza stabile
Cliccate sul link SeleniumBasic-2.0.9.0.exe per scaricarlo sul vostro pc

Completato il download, fate doppioclick sul file scaricato per installare SeleniumBasic (come in tutte le installazioni, e' suggerito di chiudere altre applicazioni prima di procedere).
Durante l'installazione vi verra chiesto, in step successivi:
-di accettare i termini della licenza
-di specificare quali moduli installare; il mio suggerimento e' di installare solo Template and example e i driver per i browser che intendete usare (io mi limitero' a usare Chrome; oppure Edge in situazioni in cui Chrome non possa funzionare)
-di confermare l'installazione nella directory standard (C:\Users\NomeUtente\AppData\Local\SeleniumBasic; per sicurezza prendete nota della directory di installazione, vi servira' tra poco)

Completata l'installazione di SeleniumBasic, aprite la directory di installazione (nel mio caso C:\Users\NomeUtente\AppData\Local\SeleniumBasic)
-cancellate i file chromedriver.exe e edgedriver.exe perche' certamente NON SONO allineati ai vostri browser (immagino che non siano allineati nemmeno i driver per Firefox e per Opera, ma io non usero' mai questi driver)

2) Installiamo quindi i driver giusti...
...che purtroppo cambiano con la versione del browser
a) per Chrome
-Aprite Chrome, e nella barra dell'indirizzo scrivete chrome://settings/help
-Prendete nota della versione installata; io (oggi) ho la Versione 95.0.4638.69 (Build ufficiale) (a 64 bit)
-andare su https://sites.google.com/chromium.org/driver/downloads
-cercate una versione di ChromeDriver compatibile col vostro browser; cliccateci sopra per andare alla pagina da cui scaricare il driver; scaricate il driver compatibile con la vostra piattaforma. Io ho scaricato chromedriver_win32.zip (non esiste una versione a 64 bit)
-completato il download, aprite il file .zip ed "estraete" il driver chromedriver.exe posizionandolo nella directory di installazione di SeleniumBasic

b) per Edge
-aprite Edge, e nella barra dell'indirizzo scrivere edge://settings/help
- Prendete nota della versione installata; io (oggi) ho la Versione 95.0.1020.53 (Build ufficiale) (64 bit)
-i driver per Edge sono disponibili qui: https://developer.microsoft.com/en-us/m ... webdriver/
-cercate una versione di driver compatibile col vostro browser; io ho scaricato Version: 95.0.1020.44 per X64
-completato il download, aprite il file .zip ed "estraete" il driver msedgedriver.exe posizionandolo nella directory di installazione di SeleniumBasic
-RINOMINARE il file come edgedriver.exe

L'AMBIENTE SeleniumBasic e' ora installato

NB: Eventuali aggiornamenti a Chrome oppure Edge potrebbero richiedere la installazione di nuovi Driver Selenium. Suggerisco quindi di disabilitare l'aggiornamento automatico di questi programmi.

Se aprite Excel e da qui aprite il vba, tra le librerie disponibili dovreste ora trovare la "Selenium Type Library" (Menu /Strumenti /Riferimenti; scorrete l'elenco e cercatela)

Il riferimento a questa libreria puo' essere impostato manualmente, quando sappiamo di doverla usare (cercare la libreria, spuntarla, premere Ok); oppure puo' essere impostato all'esecuzione della macro tramite la funzione CreateObject. Queste due modalita' in vba sono chiamate rispettivamente Early binding e Late binding (Associazione anticipata o Associazione tardiva)
La prima modalita' consente di usare i tipi dati e di ricevere suggerimenti durante la scrittura del codice; la seconda teoricamente e' vantaggiosa da usare quando non si conosce esattamente la versione dell'ambiente da creare. Nel caso Selenium quindi il metodo della "spunta" e' quello preferibile.


3) Prova dell'ambiente
Dopo aver installato l'ambiente di prova (come descritto sopra) possiamo controllare se tutto funziona.
Allo scopo, scaricate questo file:
https://www.dropbox.com/s/jcjbfw4bu6avh ... .xlsm?dl=0

Il file ha come obiettivo di raccogliere tramite Chrome l'elenco delle discussioni attualmente in prima pagina del nostro forum, organizzanole secondo le colonne che vedete nel foglio.

Questo viene ottenuto tramite la seguente macro, agganciata al pulsante presente nel foglio:
Codice: Seleziona tutto
Sub SeleniumDemo()
Dim PColl As WebElements, myItm As Object, ItColl As Object, pCount As Long
Dim I As Long, J As Long, mySplit, myTim As Single
Dim WPage As New WebDriver
'
WPage.Start "Chrome", "http://www.pc-facile.com/forum/viewforum.php?f=26/"      ' <11
'WPage.Start "edge", "http://www.pc-facile.com/forum/viewforum.php?f=26/"        ' <22
WPage.Get "/"
'
myTim = Timer
Range("A:J").ClearContents
Range("A1").Resize(1, 7).Value = Array("Discussione", "Autore", "Aperta il", "Risposte", "Visite", "Ult Autore", "Data")
'
Debug.Print vbCrLf & "Start", WPage.Url, Format(Timer - myTim, "0.00")
J = 2
pCount = 0
Do
    pCount = pCount + 1
    Sleep 200
    Set PColl = WPage.FindElementsByTag("dl")
    If PColl.Count > 20 Then Exit Do
    If pCount > 50 Then Exit Do
Loop
Debug.Print "B", pCount, PColl.Count, Format(Timer - myTim, "0.00")
For I = 1 To (PColl.Count)
DoEvents
    If I < 10 Then Debug.Print I, J, Format(Timer - myTim, "0.00")
    If Len(PColl(I).Text) > 40 Then
        mySplit = Split(Replace(PColl(I).FindElementsByTag("dt")(1).Text & " ", "»", Chr(10), , , vbTextCompare), Chr(10), , vbTextCompare)
        Cells(J, 1).Resize(1, 1 + UBound(mySplit)).Value = mySplit
        Cells(J, 4).Value = PColl(I).FindElementsByTag("dd")(1).Text
        Cells(J, 5).Value = PColl(I).FindElementsByTag("dd")(2).Text
        mySplit = Split(PColl(I).FindElementsByTag("dd")(3).Text & " ", Chr(10), , vbTextCompare)
        Cells(J, 6).Resize(1, 1 + UBound(mySplit)).Value = mySplit
        J = J + 1
    End If
Next I
Debug.Print "FINE", I, J, Format(Timer - myTim, "0.00")
Call ShFormat
MsgBox ("Informazioni raccolte...")
WPage.Quit
End Sub


Se l'ambiente Selenium e' stato predisposto correttamente dovreste trovarvi col riepilogo delle discussioni come la vedete nella home page della sezione Applicativi Office.
Se volete usare Edge, commentate l'istruzione marcata <11 e "scommentate" quella marcata <22

In caso di errori o di risultati inconsistenti allora documentate quali errori vengono segnalati; poi aprite la "finestra Immediata" del vba e copiate le informazioni che vi trovate scritte.
Allegate poi tutto al vostro eventuale messaggio di richiesta di aiuto qui sul forum

Per aprire la finestra Immediata, dall'editor delle macro: premere Contr-g, oppure Menu /Visualizza /Finestra Immediata

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

Sponsor
 

Re: Prelevare dati da pagine web usando i Driver Selenium

Postdi Anthony47 » 23/05/22 11:38

Mi e' stato segnalato che all'esecuzione anche del codice inserito nel file di test che ho allegato al mio messaggio precedente potrebbe comparire un messaggio di "Automation Error" quando si cerca di creare l'oggetto webdriver.

In questi casi la raccomandazione e' di installare Microsoft .NET Framework 3.5, seguendo le istruzioni che trovate qui: https://docs.microsoft.com/it-it/dotnet ... 35-windows
Avatar utente
Anthony47
Moderatore
 
Post: 18194
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Prelevare dati da pagine web usando i Driver Selenium":


Chi c’è in linea

Visitano il forum: Nessuno e 65 ospiti