1. Introduzione alle pagine dinamiche
Se hai mai provato a fare scraping di dati da siti che aggiornano il contenuto al volo con JavaScript, allora sai che può essere un bel rompicapo. Ma non preoccuparti! Come si suol dire, qualsiasi codice complesso può essere configurato per sembrare una magia. Vediamo insieme come requests_html ci permette di lavorare con questo tipo di contenuto.
Come sappiamo, non tutte le pagine web sono ugualmente utili. Alcune pagine caricano il contenuto immediatamente, mentre altre possono generarlo o aggiornarlo dinamicamente usando JavaScript. Questo crea alcune difficoltà per chi vuole estrarre dati, dato che l'HTML che vedi con gli strumenti per sviluppatori può differire dall'HTML che ottieni con una richiesta standard.
Problemi che sorgono durante lo scraping del contenuto dinamico
La maggior parte delle librerie per il web, come requests, funziona solo con le risposte del server e non può eseguire JavaScript. Questo significa che se il contenuto viene caricato o modificato tramite JavaScript, potresti non vederlo affatto con una richiesta standard.
2. Utilizzo della libreria requests_html
Ed è qui che entra in scena requests_html — una libreria che combina la semplicità di requests e la potenza di un browser per eseguire JavaScript. Ti offre un motore di rendering basilare che ti permette di interagire con pagine web dinamiche come se stessi usando un vero browser.
Installazione e configurazione della libreria
Per iniziare, installiamo requests_html. Apri il tuo terminale preferito ed esegui il seguente comando:
pip install requests-html
Perfetto, la libreria è installata! Ora possiamo iniziare a usarla.
Fondamenti dell'uso di requests_html per estrarre contenuto JavaScript
requests_html rende la nostra vita più semplice. Vediamo come funziona in pratica. Supponiamo di avere una pagina che genera alcuni dati tramite JavaScript.
from requests_html import HTMLSession
# Creiamo una sessione HTML
session = HTMLSession()
# Effettuiamo una richiesta alla pagina web
response = session.get('https://example-dynamic-page.com')
# Renderizziamo il JavaScript
response.html.render()
# Estraiamo i dati
data = response.html.find('#dynamic-content', first=True)
print(data.text)
È magia! A differenza di requests, requests_html ci offre il metodo .render(), che permette di "scorrere" la pagina ed eseguire JavaScript. Una volta che la pagina "prende vita", puoi estrarre tutti i dati necessari usando i selettori che abbiamo visto in precedenza.
3. Esempi di estrazione dati
Ora immergiamoci e vediamo alcuni esempi, per capire come requests_html ci aiuta in scenari diversi.
Estrarre dati pratici da pagine dinamiche
Immagina una pagina che carica le ultime notizie solo dopo uno scroll. Con requests_html possiamo simulare il comportamento dell'utente.
url = 'https://example-news-site.com'
# Carichiamo la pagina
response = session.get(url)
# Eseguiamo il rendering aumentando il timeout, se necessario
response.html.render(timeout=20)
# Troviamo gli elementi con le notizie
news_items = response.html.find('.news-item')
for item in news_items:
print(item.text)
È così facile e senza stress abbiamo avuto accesso al contenuto, che prima sembrava irraggiungibile!
Elaborazione del contenuto JavaScript caricato con requests_html
Con requests_html e i selettori CSS che abbiamo esaminato nelle lezioni precedenti, puoi lavorare con il contenuto delle pagine web come se fossi già esperto nello scraping!
# Selezioniamo il primo elemento del titolo della notizia
headline = response.html.find('.news-headline', first=True)
print(headline.text)
# Estrarre il link dall'elemento
link = headline.find('a', first=True).attrs['href']
print(link)
4. Consigli pratici e trucchi
Sebbene requests_html sia uno strumento potente, ci sono alcune cose da ricordare quando lo usi:
- Timeout e ritardi: Ricorda di configurare i timeout di rendering per le pagine più complesse. Questo ti aiuterà a evitare errori dovuti a caricamenti lenti.
- Risorse di rendering:
requests_htmlpuò consumare molte risorse, dato che esegue il rendering di JavaScript. Per grandi quantità di dati o pagine complesse questo potrebbe rallentare il processo. - CAPTCHA e protezioni dai bot:
requests_htmlnon bypassa le protezioni anti-bot e CAPTCHA, quindi per casi più complessi è meglio usare Selenium.
GO TO FULL VERSION