Esistono molti siti come TikTok dove i video vengono caricati man mano che si scorre verso il basso o ad esempio e-commerce dove le immagini vengono caricate solo nel momento dello scroll in modo "lazy".
Questo fatto per un utente medio è un vantaggio perché aiuta nel caricamento ma se ad esempio dobbiamo estrarre una grande quantità di dati risulta un problema.
Prima di tutto è necessario installare i pacchetti base:
pip install selenium webdriver_manager
Ora procediamo a configurare Selenium con ChromeDriver.
Per prima cosa impostiamo Selenium con ChromeDriver usando webdriver_manager per scaricare e gestire automaticamente l'eseguibile di ChromeDriver.
Vediamo come installare webdriver_manager Chrome in Selenium:
- Installa l'ambiente Python
- Installa Selenium:
- Installa webdriver_manager:
pip install webdriver_manager
Ora possiamo includerle nei nostri programmi:
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium import webdriver
Il prossimo passo è creare il driver che verrà usato per estrarre i dati dai siti in questione:
service = ChromeService(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
Ora con "get" possiamo richiamare il sito:
driver.get('https://sito.com')
Per chiudere:
driver.quit()
Facciamo un esempio, dobbiamo estrarre i dati da Wikipedia:
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium import webdriver
import time
# Configura ChromeDriver
servizio = ChromeService(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=servizio)
Successivamente carichiamo la pagina web che desideriamo analizzare (o automatizzare).
driver.get("https://it.wikipedia.org/wiki/Pagina_principale")
Ora definiamo una funzione in JavaScript per scorrere gradualmente verso il basso, quindi tramite execute_script
prende il codice JavaScript come parametro sotto forma di stringa.
script_di_scorrimento = """
function scorriFinoInFondo() {
var altezzaScorrimento = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);
var passoScorrimento = 200; // velocità
var intervalloScorrimento = 100; // interv. scorrimento
function scorrimento() {
window.scrollBy(0, passoScorrimento);
var raggiuntoFondo = window.innerHeight + window.scrollY >= altezzaScorrimento;
if (!raggiuntoFondo) {
setTimeout(scorrimento, intervalloScorrimento);
}
}
scorrimento();
}
scorriFinoInFondo();
"""
driver.execute_script(script_di_scorrimento)
driver.quit()
Se la connessione è lenta o il sito è pesante/lento bisogna giocare con la velocità di scorrimento (in questo caso abbassando l'intervallo e il passo di scorrimento) in modo che il sito si carichi insieme allo scorrimento.
Nel codice questa linea: var raggiuntoFondo = window.innerHeight + window.scrollY >= altezzaScorrimento;
permette di far terminare il codice in maniera automatica, restituisce true se abbiamo raggiunto il fondo della pagina. Viene calcolato verificando se la somma dell'altezza attuale della finestra e la posizione di scorrimento è uguale o superiore all'altezza totale dello scorrimento.