1. Introduzione alla paginazione
Chi ha detto che i dati che ti servono saranno su una sola pagina? Molto spesso devi tirarli fuori da un mucchio di pagine, o magari sono sparsi in tutto il sito. Quindi una delle prime sfide che incontrerai sarà la suddivisione dei dati in pagine (pages). E il lavoro affascinante di raccolta si chiama pagination (paginazione).
Sì, la paginazione non è solo quel momento in cui aspetti di passare alla prossima pagina di risultati di Google, ma anche quando ti chiedi come automatizzare tutto ciò per non farlo a mano.
La paginazione è un modo per organizzare i dati su un sito, per evitare pagine lunghissime con contenuti. Invece, i siti dividono i dati in pagine, aggiungendo link tipo "Avanti" o "Next" per passare da una pagina all'altra. È un concetto importante perché, come web scraper, non vorrai dire al tuo capo che ti sei perso qualcosa perché era nascosto nella "quinta pagina".
2. Problemi di scraping dei dati da più pagine
Il primo problema che potresti incontrare è la mancanza di URL intuitivi e prevedibili. Alcuni siti non hanno URL che cambiano in modo prevedibile quando passi da una pagina all'altra, rendendo la vita piuttosto complicata per l'automazione. Per esempio, invece di page=1
, page=2
potresti trovarti davanti a x=abc
, x=def
senza alcun schema apparente.
Il secondo problema è la protezione contro i bot. Alcuni siti monitorano attivamente il numero di richieste da un dato indirizzo IP. Se vedono che stai facendo troppe richieste, potresti essere bloccato temporaneamente (o per sempre).
Ma non preoccuparti, impareremo ora come aggirare queste difficoltà come veri esperti di scraping.
3. Come aggirare la paginazione
Tecniche e strategie
- Analisi della struttura degli URL: Di solito le pagine usano un parametro nell'URL per indicare il numero della pagina, per esempio
?page=2
. Se trovi qualcosa del genere, congratulazioni, hai trovato il modello perfetto per aggirare la paginazione! - Ricerca dei link "Avanti": A volte l'URL non è prevedibile. In questi casi devi cercare link come "Avanti" o "Next" sulla pagina e seguirli.
- Uso delle richieste AJAX: Alcuni siti ottengono i dati tramite AJAX senza ricaricare la pagina. In questo caso devi intercettare queste richieste e riprodurle.
Passiamo alla pratica!
Esempio di script per aggirare la paginazione e raccogliere dati
Di seguito un esempio di script:
import requests
from bs4 import BeautifulSoup
# Funzione per ottenere dati da una singola pagina
def get_data_from_page(url):
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
# Qui estrai i dati da soup - esempio
data = soup.find_all('div', class_='data-class')
for item in data:
print(item.text) # Visualizza o salva i dati
else:
print(f"Impossibile ottenere la pagina: {url}")
# Logica principale per aggirare la paginazione
def scrape_all_pages(start_url):
current_url = start_url
while current_url:
get_data_from_page(current_url)
soup = BeautifulSoup(requests.get(current_url).text, 'html.parser')
# Cerchiamo il link "Avanti"
next_button = soup.find('a', text='Avanti')
if next_button:
current_url = next_button['href']
else:
current_url = None
# Inizio dello scraping dalla prima pagina
start_url = 'http://example.com/page=1'
scrape_all_pages(start_url)
Questo è un esempio base che dimostra il principio di funzionamento con la paginazione. Dovrai adattarlo alla struttura del sito con cui stai lavorando.
Gestione della sessione e uso del user-agent
Quando invii molte richieste a un sito, è utile usare una sessione e modificare lo user-agent per ridurre il rischio di essere bloccati.
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'}
session = requests.Session()
session.headers.update(headers)
response = session.get('http://example.com')
Questa struttura ti permette di emulare un browser in modo più affidabile rispetto all'invio di richieste con intestazioni vuote.
4. Implementazione pratica
Ora che conosciamo le basi, complichiamo un po' le cose. Consideriamo il caso in cui i link alle pagine contengono parametri imprevedibili e dobbiamo usare AJAX per ottenere i dati.
Implementazione con AJAX
A volte i dati non vengono caricati sulla pagina principale, ma tramite AJAX. Se noti che il sito si comporta in questo modo, usa lo strumento di debug del browser per analizzare la rete e determinare quali richieste vengono inviate in background. Poi riproducile con Python.
# Esempio di chiamata AJAX
ajax_url = 'http://example.com/ajax_endpoint'
params = {
'some_param': 'value', # parametri, se necessari per la richiesta
'page': 1
}
while True:
response = session.get(ajax_url, params=params)
data = response.json()
if not data['has_more']:
break
# Elaborazione dei dati
for item in data['items']:
print(item)
params['page'] += 1 # Passa alla pagina successiva
Questo approccio è utile quando, dopo un'analisi dettagliata della richiesta e della risposta, capisci come avviene il caricamento dei dati nel browser.
La lezione di oggi ci ha immerso nel mondo affascinante e spesso fastidioso della paginazione. Questa abilità ti permetterà di raccogliere dati dai siti in modo sicuro ed efficace, senza perdere alcuna pagina. Alla fine, come nella vita, anche nel web scraping la metodicità e la perseveranza sono fondamentali, perché chissà quali tesori nascosti si trovano alla ventesima pagina!
GO TO FULL VERSION