Impara a fare web scraping: una guida per principianti

È una buona idea imparare a fare web scraping? Se vuoi risparmiare centinaia di ore di lavoro, allora sì. Inoltre, è una competenza interessante da avere come programmatore.

Il web scraping è il processo di estrazione di dati dai siti web e, poiché i dati sono disponibili ovunque, puoi recuperarli ed elaborarli efficacemente padroneggiando tecniche di base e avanzate.

Abbiamo preparato una guida per principianti che include tutti gli elementi essenziali: dalla comprensione della struttura dei siti web alle tecniche di base, fino ai concetti avanzati di web scraping, così potrai diventare un professionista.

Capire la struttura dei siti web

Prima di dedicarti allo scraping, devi capire come sono strutturati i siti web.

Innanzitutto, i siti web sono realizzati con codice. I linguaggi più comuni sono HTML (Hypertext Markup Language), CSS (Cascading Style Sheet) e JavaScript.

HTML è il più diffuso perché è facile da usare. Definisce la struttura e il contenuto delle pagine web usando elementi, rappresentati da tag.

Per esempio,

  • <h1> per i titoli,
  • <p> per i paragrafi,

per citarne alcuni (e ce ne sono DAVVERO TANTI).

Ecco un esempio di come potrebbe apparire il codice HTML:

<html> <head> <title>Example Website</title> </head> <body> <h1>Welcome to my website!</h1> <p>This is a paragraph of text.</p> <ul> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> </ul> </body> </html> </body> </html>

Infine, CSS definisce lo stile degli elementi HTML, mentre JavaScript si occupa del comportamento dinamico dei siti web.

Lo strumento di scraping che useremo navigherà nella pagina seguendone la struttura e individuerà i contenuti da estrarre. I siti con una struttura più organizzata e descrittiva tendono a essere più facili da sottoporre a scraping. E da principiante, lo apprezzerai sicuramente, vero?

Configurare il tuo ambiente di sviluppo

Bene, ora che hai un'idea della struttura dei siti web, puoi iniziare a configurare il tuo ambiente di sviluppo.

Per prima cosa, devi scegliere un linguaggio di programmazione, poiché non tutti sono adatti a questo compito. Python è la scelta più diffusa per lo scraping perché è un linguaggio di alto livello, facile da usare e dispone anche di ottime librerie, framework e strumenti integrati.

Questi permettono di risolvere compiti specifici legati allo scraping, come i seguenti:

  • Requests: semplifica la creazione di richieste HTTP al sito web di destinazione.
  • BeautifulSoup: questa libreria si usa per analizzare documenti HTML e XML. Ma aspetta un attimo: cos'è il parsing? È il processo di analisi e interpretazione dei dati strutturati.
  • Selenium: per automatizzare i browser web ed eseguire attività che simulano l'interazione umana.
  • Scrapy: questo framework completo può essere usato per diverse attività, come il web crawling (la ricerca di URL da cui estrarre dati), il data mining e i test automatizzati.

Come iniziare?

  1. Configurazione dell'ambiente: scarica e installa la versione più recente di Python. Facile così.
  2. Configura un ambiente virtuale: crea un ambiente virtuale per mantenere isolate le dipendenze del tuo progetto. Apri un terminale ed esegui i seguenti comandi:
python -m venv myenv source myenv/bin/activate # For Unix/Linux myenv\Scripts\activate.bat # For Windows

3. Installa le librerie e gli strumenti: ti consiglio di installare Requests, Selenium, BeautifulSoup e Scrapy per cominciare. Puoi installarli usando il comando “pip install”: ti basta aprire un terminale ed eseguire quanto segue:

pip install requests beautifulsoup4 scrapy selenium

Web scraping 101: etica e buone pratiche

Un momento. Prima di addentrarci negli aspetti tecnici, esaminiamo le implicazioni etiche e le buone pratiche del web scraping.

Chiunque faccia scraping ne è più o meno consapevole, ma chi è alle prime armi deve conoscere le seguenti linee guida per non superare i limiti:

  • Rispetta Robots.txt: la prima regola dello scraping è rispettare Robots.txt. È un file di testo presente su ogni sito, che indica a tutti, in sostanza, cosa si può e cosa non si può sottoporre a scraping.
  • Rispetta i termini di servizio del sito: controlla i termini di servizio per verificare se il web scraping è consentito.
  • Limita la frequenza dello scraping e l'impatto sui server: evita di effettuare troppe richieste in poco tempo. Inoltre, evita di sovraccaricare il server inserendo delle pause tra una richiesta e l'altra.
  • Usa le API (se disponibili): prima di fare scraping, controlla se il sito mette a disposizione un'API per accedere ai dati. Ti dico quante volte mi è capitato di lavorare a uno scraper per poi scoprire che era disponibile un'API, ma non mi ero preso la briga di controllare. Usare un'API è molto più facile (fidati), perché fornisce dati strutturati.
  • Considerazioni legali: verifica le leggi per assicurarti di non violare diritti di proprietà intellettuale o altre norme. Se non sei sicuro, è meglio consultare prima un avvocato.

Come iniziare con il web scraping: tecniche di base

Bene, abbiamo finito con la teoria e i concetti: mettiamoci al lavoro. La prima cosa che imparerai è come inviare richieste HTTP.

Inviare richieste HTTP (GET, POST) con la libreria Requests di Python

Qui useremo la libreria Requests di Python. Vediamo un esempio:

import requests url = 'https://example.com' response = requests.get(url) html_content = response.text

Qui specifichi l'URL della pagina che vuoi sottoporre a scraping. Con requests.get () inviamo una richiesta GET e il contenuto HTML della pagina viene memorizzato nella variabile html_content.

Analisi dell’HTML con BeautifulSoup

Una volta ottenuto il contenuto HTML, puoi analizzarlo usando la libreria BeautifulSoup per estrarre dati specifici. Ecco un esempio:

from bs4 import BeautifulSoup soup = BeautifulSoup(html_content, 'html.parser') title = soup.find('h1').text paragraphs = soup.find_all('p')

In questo codice, creiamo un oggetto BeautifulSoup passando il contenuto HTML e specificando il parser (in questo caso, ‘html.parser‘). Possiamo quindi usare metodi come find() e find_all() per individuare elementi specifici in base ai loro tag o attributi.

Estrazione di dati usando i selettori CSS e metodi come find() e find_all()

I selettori CSS offrono un modo efficace per individuare elementi in una pagina web. BeautifulSoup consente di usare i selettori CSS per estrarre dati.

Ecco un esempio:

links = soup.select('a.external-link') for link in links: href = link['href'] text = link.text print(f"Link: {href}, Text: {text}")

In questo codice, usiamo il metodo select() per trovare tutti i tag con la classe “external-link“. Possiamo quindi scorrere gli elementi selezionati ed estrarre gli attributi o il testo desiderati.

Salvataggio dei dati estratti in file

Dopo aver estratto i dati desiderati, puoi salvarli in un file per ulteriori analisi o elaborazioni. Ecco un esempio di salvataggio dei dati in un file CSV:

import csv data = [ ['Name', 'Age', 'City'], ['John', '25', 'New York'], ['Alice', '30', 'London'], ] with open('output.csv', 'w', newline='') as file: writer = csv.writer(file) writer.writerows(data)

In questo codice, definiamo un elenco di righe di dati, apriamo un file denominato “output.csv” in modalità scrittura, creiamo un oggetto writer CSV e scriviamo le righe di dati nel file.

Queste sono le tecniche di base che devi mettere in pratica. Proseguendo, vedrai che in alcuni casi lo scraping diventa difficile, ad esempio con i siti web dinamici o la paginazione.

Non preoccuparti: (quasi) tutti i siti possono essere sottoposti a scraping se conosci le tecniche giuste e hai gli strumenti adeguati.

Gestione della paginazione e delle pagine multiple

Il termine “paginazione” si riferisce ai siti che suddividono i contenuti su più pagine. Se vuoi estrarre dati da tutte le pagine, devi identificare lo schema di paginazione. In questo modo puoi modificare il ciclo di scraping e ottenere i risultati.

Consulta le seguenti tecniche:

  1. Individuare gli schemi di paginazione negli URL: cerca schemi nella struttura dell’URL che indichino il numero della pagina. Ad esempio, URL come https://example.com/page/1, https://example.com/page/2 e così via seguono uno schema di paginazione chiaro.
  2. Modificare il ciclo di scraping: modifica il ciclo di scraping in modo che scorra l’intervallo dei numeri di pagina. Ad esempio:
for page in range(1, 11): url = f"https://example.com/page/{page}" # Scrape data from each page

In questo codice, scorriamo i numeri di pagina da 1 a 10 e componiamo dinamicamente l’URL di ciascuna pagina.

3. Rilevare la presenza di un pulsante “Successiva”: alcuni siti web usano un pulsante “Successiva” invece di numeri di pagina espliciti. In questi casi, puoi verificare la presenza del pulsante “Successiva” e continuare lo scraping finché non scompare.

Gestire i siti web dinamici e il rendering JavaScript

Come scraper, ti imbatterai sicuramente in siti web altamente interattivi e complessi, progettati per migliorare l’esperienza degli utenti. Questi tipi di siti si basano molto su JavaScript e sono generalmente chiamati siti web con contenuti dinamici.

Ma qual è il problema? Il problema è che in questi siti il codice sorgente potrebbe non contenere i dati desiderati, rendendoli difficili da sottoporre a scraping.

È in questi casi che devi usare strumenti come Selenium.

Selenium è un potente strumento per automatizzare i browser web. Ti permette di interagire con le pagine web, compilare moduli, fare clic sui pulsanti ed estrarre dati dai contenuti renderizzati dinamicamente.

Configurare Selenium

Se hai già installato Selenium, il passo successivo è installare un web driver per il browser che preferisci. Ad esempio, ChromeDriver per Google Chrome.

Ecco un esempio di come usarlo:

from selenium import webdriver driver = webdriver.Chrome() # Assumes ChromeDriver is installed and in PATH driver.get('https://example.com') # Perform actions and extract data title = driver.find_element_by_tag_name('h1').text driver.quit()

In questo codice, creiamo un’istanza del web driver di Chrome, raggiungiamo un URL specifico usando driver.get(), quindi eseguiamo azioni ed estraiamo dati con i metodi di Selenium, come find_element_by_tag_name().

Attendere il caricamento degli elementi

Nei siti dinamici, i contenuti spesso non vengono caricati tutti contemporaneamente. Alcuni elementi potrebbero quindi non essere subito disponibili al caricamento della pagina. Puoi gestire questa situazione con le attese esplicite e implicite di Selenium.

from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10)<br>element = wait.until(EC.presence_of_element_located((By.ID, 'my-element-id')))

In questo codice, creiamo un oggetto WebDriverWait con un timeout di 10 secondi. Poi usiamo il metodo until() per attendere la presenza di un elemento con un ID specifico.

Alternative a Selenium

Anche se molti utenti ritengono che Selenium sia la scelta migliore per i siti dinamici, dovresti esplorare le alternative per capire quale sia la più adatta a te.

Scrapy-Splash potrebbe essere un’opzione. È l’integrazione di un browser headless con il framework Scrapy. Permette di estrarre i dati in modo più efficiente grazie all’infrastruttura di rete non bloccante di Scrapy e alle funzionalità avanzate di Splash, che consentono di eseguire rapidamente il rendering delle pagine web dinamiche.

Requests-html è un’altra alternativa, poiché estende le funzionalità della libreria requests aggiungendo il supporto al rendering JavaScript e all’interazione con le pagine web.

Tecniche avanzate di web scraping

Man mano che farai progressi, vedrai che riuscirai a gestire alcuni scenari di scraping, ma dovrai anche affrontarne di complessi, che richiedono tecniche più avanzate.

Alcuni siti web richiedono l’autenticazione o utilizzano cookie per gestire le sessioni degli utenti. Puoi gestire l’autenticazione inviando le credenziali di accesso con le tue richieste e gestire i cookie usando librerie come requests o http.cookiejar.

Evitare il rilevamento e i divieti di accesso

I siti web possono adottare misure per rilevare e bloccare le attività di web scraping. Per evitare di essere rilevato, puoi ricorrere a tecniche come la rotazione degli user agent, l’uso di proxy e l’inserimento di ritardi casuali tra le richieste.

Archiviare i dati nei database

Invece di salvare i dati estratti in file, puoi archiviarli nei database per renderne più efficienti la conservazione e il recupero. Tra le opzioni più diffuse ci sono i database SQL, come MySQL e PostgreSQL, e quelli NoSQL, come MongoDB.

Effettuare scraping delle API e gestire i dati JSON

Ehi! Hai trovato l’API. Ma è in formato JSON. Cosa puoi fare? Puoi usare librerie come requests per effettuare richieste API e analizzare le risposte JSON usando il modulo json di Python.

Scraping parallelo e asincrono

Per velocizzare il processo di scraping, puoi sfruttare tecniche di elaborazione parallela e programmazione asincrona. Librerie Python come multiprocessing, threading e asyncio possono aiutarti a farlo.

Mettere tutto insieme: progetti di web scraping nel mondo reale

Da principiante, quando ho iniziato la mia formazione sullo scraping, pensavo di sapere perfettamente cosa dovevo fare, finché non ho dovuto farlo davvero. Non serve a niente limitarsi a leggere: bisogna mettere alla prova le proprie capacità facendo pratica.

E quale modo migliore per farlo se non lavorando a progetti del mondo reale?

Diamo un’occhiata ad alcuni esempi con il relativo procedimento passo dopo passo:

Esempio 1: scraping di articoli di notizie e analisi del sentiment

  1. Pianificare il processo di scraping:
    • Individuare il sito di notizie da cui effettuare lo scraping
    • Determinare la struttura degli articoli (titolo, contenuto, data ecc.)
    • Pianificare il formato di archiviazione dei dati (ad es. CSV, database)
  2. Implementare lo scraper:
    • Usare requests per recuperare il contenuto HTML del sito di notizie
    • Analizzare l’HTML con BeautifulSoup per estrarre le informazioni sugli articoli
    • Gestire la paginazione e navigare tra più pagine
    • Archiviare i dati estratti nel formato scelto
  3. Analizzare e visualizzare i dati estratti:
    • Eseguire l’analisi del sentiment sul contenuto degli articoli usando librerie come NLTK o TextBlob
    • Visualizzare i punteggi del sentiment con librerie come Matplotlib o Plotly
    • Individuare tendenze e modelli nel sentiment delle notizie nel corso del tempo

Esempio 2: creare uno strumento per monitorare i prezzi

  1. Estrarre informazioni sui prodotti dai siti di e-commerce:
    • Individuare i siti di e-commerce da cui effettuare lo scraping
    • Determinare la struttura delle informazioni sui prodotti (nome, prezzo, disponibilità ecc.)
    • Usare tecniche di web scraping per estrarre i dati dei prodotti da più siti web
  2. Impostare avvisi e notifiche:
    • Definire soglie di prezzo o criteri di disponibilità per ciascun prodotto
    • Implementare un meccanismo per confrontare i prezzi estratti con le soglie definite
    • Impostare notifiche via e-mail o SMS per avvisare gli utenti quando i prezzi scendono o i prodotti tornano disponibili
  3. Distribuire lo scraper sul cloud:
    • Scegliere una piattaforma cloud (ad es. AWS, Google Cloud, Heroku)
    • Configurare l’ambiente e le dipendenze necessarie
    • Programmare l’esecuzione dello scraper a intervalli regolari
    • Archiviare i dati estratti in un database basato sul cloud per facilitarne l’accesso e il monitoraggio

Framework e strumenti per il web scraping

So che i termini “framework” e “libreria” vengono usati in modo intercambiabile, ma indicano cose diverse e vengono utilizzati per scopi diversi.

Con librerie come Request o BeautifulSoup, puoi creare scraper web da zero. I framework, invece, semplificano il processo perché raccolgono strumenti e librerie.

Vedila così: le librerie sono come le auto con cambio manuale: ti danno il pieno controllo, ma richiedono più impegno e abilità per essere guidate. I framework, invece, sono come le auto automatiche: offrono un’esperienza più fluida ed efficiente, semplificando molti degli aspetti più noiosi dello scraping.

Alcune delle opzioni più popolari sono:

Scrapy

Scrapy è un framework per Python con un ecosistema completo per creare scraper web scalabili ed efficienti. Le sue caratteristiche principali sono:

  • Veloce per progettazione.
  • Non serve aggiungere codice per generare file CSV, JSON e di altro tipo.
  • Supporto per XPath e CSS Selector.
  • Un ottimo ecosistema di estensioni, con supporto per i middleware.
  • Integrazione con le pipeline degli elementi per l’elaborazione e l’archiviazione dei dati

PySpider

PySpider è anch’esso un framework per Python, ma a differenza di Scrapy è compatibile con JavaScript, il che rappresenta il suo principale punto di forza. È inoltre un’ottima scelta per i principianti. Tra le sue caratteristiche principali troviamo:

  • Supporto per il rendering di JavaScript con PhantomJS o Puppeteer
  • Coda di attività e pianificatore integrati
  • Integrazione con database e code di messaggi
  • Supporto alla concorrenza

Strumenti e servizi per il web scraping

Oltre ai framework, esistono alcuni strumenti e servizi che aiutano a semplificare lo scraping. La parte migliore è che richiedono una quantità minima di codice. Alcune opzioni sono:

  • Octoparse: uno strumento di web scraping basato sul cloud, con un’interfaccia che consente di estrarre dati dai siti web con un semplice clic.
  • ParseHub: un’applicazione desktop che consente di creare scraper web selezionando visivamente gli elementi di una pagina web.
  • Import.io: una piattaforma web che offre strumenti per estrarre dati da siti web e API.

Riepilogo dei fondamenti del web scraping

In questa guida abbiamo trattato a grandi linee i fondamenti del web scraping, come la comprensione della struttura dei siti web, le considerazioni etiche, le tecniche di base e avanzate e gli strumenti e framework aggiuntivi.

Ora puoi iniziare, ma valuta di ampliare le tue conoscenze consultando altre risorse, come la documentazione ufficiale delle librerie e dei framework e i tutorial sul web scraping.

Inoltre, cerca di chiedere consiglio a scraper esperti nelle community e nei forum dedicati allo scraping. Non isolarti: abbiamo bisogno gli uni degli altri.

Siamo stati tutti principianti, quindi sii paziente con te stesso, inizia con poco e fai pratica regolarmente. Con sufficiente pratica e dedizione, vedrai che man mano riuscirai ad affrontare progetti più complessi.