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:
http://www.pc-facile.com/forum/viewtopi ... 84#p654158
http://www.pc-facile.com/forum/viewtopi ... 28#p654429
http://www.pc-facile.com/forum/viewtopi ... 70#p655197
http://www.pc-facile.com/forum/viewtopi ... 10#p654369
http://www.pc-facile.com/forum/viewtopi ... 86#p642035
http://www.pc-facile.com/forum/viewtopi ... 34#p636420
http://www.pc-facile.com/forum/viewtopi ... 56#p658466
http://www.pc-facile.com/forum/viewtopi ... 53#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

2a) per Chrome (fino a Vers 114)
-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

Per Chrome Vers-115 e superiori, vedere https://www.pc-facile.com/forum/viewtopic.php?f=26&t=112225#p664966


2b) 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: 19431
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: 19431
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Prelevare dati da pagine web usando i Driver Selenium

Postdi Anthony47 » 08/09/23 17:29

Chrome versione 115 e superiori
A partire dalla versione 115 di Chrome la distribuzione del Driver per interfacciare l’ambiente Selenium e’ cambiata.
La nuova pagina: https://googlechromelabs.github.io/chrome-for-testing/
In questa pagina, cercate la vostra versione “Stable” di Chrome; poi cercate il “ChromeDriver” adatto per la vostra piattaforma (Linux, Mac, Windows; 32-64 bit)
Aprite quindi il relativo link per scaricare il file .zip; aprite il file .zip ed estraete il file chromedriver.exe posizionandolo nella directory di installazione di SeleniumBasic.
Ho notato con piacere che ora e’ disponibile anche un driver per Windows 64 bit (precedentemente era disponibile solo un “chromedriver_win32.zip”)

Il link menzionato prima (https://googlechromelabs.github.io/chrome-for-testing/ ) parla di “Chrome for testing”, una versione di Chrome specifica per gli ambienti di test, di cui rende disponibile il codice binario; la caratteristica principale di questa versione e’ che non si aggiorna, rendendo possibile per gli sviluppatori creare degli ambienti di test stabili e riutilizzabili nel tempo. Vi ricordo che l’ambiente Selenium e’ stato sviluppato proprio per creare ambienti di test, anche se noi qui nel forum lo utilizziamo quasi esclusivamente per “web scraping”.
L’uso di questa versione per scopi diversi dal testing è sconsigliata; mi accodo anche io a sconsigliare vivamente di utilizzare tale versione nei pc che usate per la normale navigazione, a causa di evidenti problemi di sicurezza (che in un ambiente di prova non si pongono).

E se avete dubbi siamo qua
Avatar utente
Anthony47
Moderatore
 
Post: 19431
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Prelevare dati da pagine web usando i Driver Selenium

Postdi AndreaDeBiagi » 20/10/24 09:03

Ho provato con Chrome ed Edge e funziona, mentre con Opera la macro si blocca in WPage.Start "Opera", "http://www.pc-facile.com/forum/viewforum.php?f=26/".
L'errore è il seguente:

SessionNotCreatedError
session Not Created
from unknown error: cannot find opera binary

Può darsi che non vada bene la versione di operadriver.exe per le ultime versioni di Opera o di selenium basic?

Andrea De Biagi
AndreaDeBiagi
Newbie
 
Post: 4
Iscritto il: 20/10/24 08:53

Re: Prelevare dati da pagine web usando i Driver Selenium

Postdi Anthony47 » 20/10/24 12:07

Buon giorno Andrea, benvenuto nel forum
Mi spiace ma non uso Opera quindi non ne ho esplorato la compatibilità con Selenium...
Avatar utente
Anthony47
Moderatore
 
Post: 19431
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 17 ospiti