1. Contenuti dinamici e JavaScript
Se hai già imparato le basi del web scraping con librerie come BeautifulSoup e requests, è arrivato il momento di immergerti in aspetti più avvincenti di questa attività. Oggi parleremo di come si può lavorare con contenuti che vengono caricati dinamicamente solo mentre scorri la pagina. Il tuo browser non sarà più l'unico ad amare i feed infiniti, ora potrai insegnare anche ai tuoi script questo trucco! 🤖
Internet è pieno di pagine che si caricano dinamicamente, dove i contenuti si aggiornano e appaiono solo quando interagisci con JavaScript che, a sua volta, "fa la magia" lato client. Questo può essere una benedizione o una maledizione per chi fa web scraping. Da un lato, questi siti possono essere più interattivi e user-friendly, dall'altro — fare scraping su queste pagine diventa più complicato, dato che la libreria requests non capisce JavaScript.
2. La libreria requests_html
Per fortuna, come già sai, esiste requests_html
— una libreria che combina la potenza di requests con le capacità di rendering simili a quelle di un browser, grazie a Pyppeteer. Questa libreria permette di caricare e rendere pagine con contenuti dinamici, offrendoti la possibilità di eseguire JavaScript e persino di scrollare le pagine.
Installazione di requests_html
Per iniziare, bisogna installare la libreria. Se non l'hai ancora fatto, esegui il comando:
pip install requests-html
Uso di requests_html
Dopo l'installazione, vediamo come usare requests_html
per caricare e lavorare con contenuti dinamici.
Esempio: Caricamento e rendering della pagina
Cominciamo con un caso semplice: caricare una pagina, eseguire JavaScript ed estrarre dati. Consideriamo un esempio in cui carichiamo una pagina e otteniamo il testo di un elemento che appare solo dopo l'esecuzione di JavaScript.
from requests_html import HTMLSession
# Creiamo una sessione
session = HTMLSession()
# Carichiamo la pagina
response = session.get('https://example.com/dynamic-page')
# Eseguiamo JavaScript per renderizzare la pagina
response.html.render()
# Estrarre il testo dell'elemento che appare dopo il rendering
content = response.html.find('#dynamic-content', first=True)
print(content.text)
In questo esempio usiamo il metodo render()
, che permette a requests_html
di eseguire JavaScript sulla pagina e rendere i contenuti che potrebbero essere nascosti a un caricamento standard.
3. Scrolling automatico delle pagine
A volte i contenuti dinamici non si caricano subito, ma appaiono solo man mano che si scrolla la pagina. requests_html
può aiutarti anche in questo, permettendo di simulare lo scrolling della pagina e caricare più dati.
Esempio di scrolling automatico
Supponiamo di avere una pagina con un feed infinito di notizie, e di voler estrarre il maggior numero possibile di elementi. Ecco come si può fare:
from requests_html import HTMLSession
session = HTMLSession()
response = session.get('https://example.com/infinite-scroll')
# Renderizziamo e scrolliamo la pagina
response.html.render(scrolldown=5, sleep=1)
# Estrarre tutti gli elementi delle notizie
news_items = response.html.find('.news-item')
for news_item in news_items:
print(news_item.text)
Qui il metodo render()
è arricchito dai parametri scrolldown
e sleep
, che indicano quante volte scrolliamo verso il basso e quanto tempo aspettiamo tra gli scroll.
4. Applicazioni pratiche
Ma perché dovresti perdere tempo con cose come lo scrolling automatico? 🤔
- Ricerche di mercato: Molte aziende usano pagine infinite per mostrare continuamente dati utili per l'analisi dei trend e dei comportamenti dei consumatori.
-
Monitoraggio dei social media: Tante piattaforme di social media usano feed infiniti, e
requests_html
diventa utile per monitorare e raccogliere dati da queste fonti. - Notizie e aggiornamenti: Estrarre titoli di notizie e articoli da feed infiniti ti permette di ottenere informazioni attuali per l'analisi.
5. Errori tipici e loro soluzioni
Lavorando con pagine dinamiche e requests_html, possono sorgere diversi problemi. Vediamone un paio comuni:
Problema con il rendering
A volte il metodo render()
potrebbe non completarsi con successo, specialmente se la pagina è troppo grande o complessa. In questi casi, può aiutare aumentare il tempo di rendering usando il parametro timeout
o ridurre il numero degli scroll.
response.html.render(timeout=30)
Esecuzione indesiderata di script
Possono verificarsi situazioni in cui il JavaScript della pagina blocca l'esecuzione dello script o causa problemi. Prova a utilizzare il parametro wait
per aspettare la comparsa degli elementi necessari.
response.html.render(wait=2)
Risoluzione dello schermo e tipo di dispositivo
Alcuni siti forniscono contenuti in base alla risoluzione dello schermo o al tipo di dispositivo. Controlla con quale user-agent viene eseguita la richiesta e rendi il contenuto.
response.session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
6. Cosa leggere ancora
requests_html
è uno strumento potente, ma per sfruttarne appieno le potenzialità ed evitare errori comuni, studia la
documentazione ufficiale. Ti aiuterà a capire meglio come gestire lo scrolling e rendere pagine complesse con successo.
A questo punto sei armato di tutto il necessario per non temere i contenuti dinamici e i feed infiniti. Fai attenzione, e ricorda di specificare che il tuo script è un hacker "bianco", che ama aiutare le persone ad automatizzare le loro attività, e non un malintenzionato! 😇
GO TO FULL VERSION