È una buona idea imparare a fare web scraping? Se vuoi risparmiare centinaia di ore di lavoro, allora dovresti. Inoltre, è una bella abilità da avere come programmatore.
Il web scraping è il processo di estrazione di dati dai siti web e, poiché i dati sono disponibili ovunque, è possibile ottenerli ed elaborarli in modo efficace padroneggiando tecniche di base e avanzate.
Abbiamo preparato una guida per principianti che include tutti gli elementi essenziali, dalla comprensione della struttura del sito web, alle tecniche di base, fino ai concetti avanzati di web scraping, per permetterti di diventare un professionista.
Comprendere la struttura del sito web
Prima di dedicarti allo scraping, è necessario comprendere come sono strutturati i siti web.
Innanzitutto, i siti web vengono creati utilizzando il codice. I più comuni sono HTML (Hypertext Markup Language), CSS (Cascading Style Sheet) e JavaScript.
HTML è il più popolare perché è facile da usare. Definisce la struttura e il contenuto delle pagine web utilizzando elementi, che sono rappresentati da tag.
Ad esempio,
- <h1> per le intestazioni,
- <p> per i paragrafi,
per citarne alcuni (e sono TANTI).
Ecco un esempio di come apparirebbe un 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 è responsabile del comportamento dinamico dei siti web.
Lo strumento di scraping che utilizzeremo navigherà nella pagina usando la sua struttura e identificherà il contenuto da estrarre. I siti con una struttura più organizzata e descrittiva tendono a essere più facili da scrapare. E come principiante, sicuramente lo apprezzerai, vero?
Impostazione dell'ambiente di sviluppo
Bene, ora che hai un'idea della struttura del sito 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ù popolare per lo scraping perché è di alto livello, facile da usare e ha anche ottime librerie, framework e strumenti integrati.
Questi consentono di risolvere un compito specifico legato allo scraping, come ad esempio:
- Requests: semplifica la generazione di richieste HTTP al sito web di destinazione.
- BeautifulSoup: questa libreria è usata per analizzare documenti HTML e XML. Ma, aspetta un attimo, cos'è l'analisi? È il processo di analisi e interpretazione di dati strutturati.
- Selenium: per automatizzare i browser web affinché eseguano attività che simulano l'interazione umana.
- Scrapy: questo framework completo può essere utilizzato per diverse attività, come il web crawling (ricerca di URL per estrarre dati), il data mining e i test automatizzati.
Come iniziare?
- Configurazione dell'ambiente: scarica l'ultima versione di Python e installala. Semplice come sembra.
- Imposta 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 iniziare. Puoi installarli usando “pip install"comando, basta aprire un terminale ed eseguire quanto segue:
pip install requests beautifulsoup4 scrapy selenium
Web Scraping 101: Etica e buone pratiche
Aspetta. Prima di addentrarci negli aspetti tecnici, esaminiamo le implicazioni etiche e le best practice del web scraping.
Ogni scraper lo sa in qualche modo, ma i principianti devono comprendere le seguenti linee guida per poter restare entro i limiti:
- Rispetta Robots.txt: la prima regola dello scraping è che devi rispettare Robots.txt. È un file di testo che ogni sito ha e che fa sapere a tutti cosa puoi e cosa non puoi scrapare.
- Rispetta i termini di servizio del sito: controlla i termini di servizio del sito per verificare se il web scraping è consentito.
- Limita la frequenza di scraping e l'impatto sui server: evita di fare troppe richieste in un breve periodo. Inoltre, evita di sovraccaricare il server implementando ritardi tra le richieste.
- Usa le API (se disponibili): prima di effettuare lo scraping, controlla se il sito fornisce un'API per accedere ai dati. Lascia che ti racconti le volte in cui ho lavorato su uno scraper solo per scoprire che l'API era disponibile, ma non mi ero preoccupato di controllare. Utilizzare un'API è molto più semplice (fidati di me) in quanto fornisce dati strutturati.
- Considerazioni legali: controlla le leggi per assicurarti di non violare alcun diritto di proprietà intellettuale o di non violare alcuna regola. Se non sei sicuro, è meglio consultare prima un avvocato.
Introduzione al Web Scraping: tecniche di base
Ok, abbiamo finito con la teoria e i concetti, mettiamoci al lavoro. La prima cosa che imparerai è come inviare richieste HTTP.
Invio di richieste HTTP (GET, POST) con la libreria Requests di Python
Qui useremo la libreria Requests in 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 raschiare. Con requests.get () stiamo inviando una richiesta GET e il contenuto HTML della pagina è memorizzato nella variabile html_content.
Analisi HTML con BeautifulSoup
Una volta ottenuto il contenuto HTML, puoi analizzarlo utilizzando 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 utilizzare metodi come find() E find_all() per individuare elementi specifici in base ai loro tag o attributi.
Estrazione dei dati utilizzando selettori CSS e metodi come find() e find_all()
I selettori CSS forniscono un modo potente per localizzare gli elementi su una pagina web. BeautifulSoup consente di utilizzare i selettori CSS per estrarre i 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 utilizziamo il select() metodo 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 su 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, crea un oggetto scrittore CSV e scrivi le righe di dati nel file.
Queste sono le tecniche di base che devi mettere in pratica. Man mano che procedi, vedrai che ci sono alcuni casi in cui lo scraping diventa difficile, come siti web dinamici o impaginazione.
Non preoccuparti, (quasi) tutti i siti possono essere sottoposti a scraping se conosci le tecniche giuste e hai gli strumenti adatti.
Gestione della paginazione e delle pagine multiple
Il termine "impaginazione" si riferisce ai siti che dividono il loro contenuto su più pagine. Se vuoi raschiare i dati da tutte le pagine, devi identificare il modello di paginazione. In questo modo, puoi modificare il tuo ciclo di scraping e ottenere risultati.
Controllare le seguenti tecniche:
- Identificazione dei pattern di paginazione negli URL: Cerca i pattern nella struttura dell'URL che indicano il numero di pagina. Ad esempio, URL come https://example.com/page/1, https://example.com/page/2, ecc., seguono uno schema di impaginazione chiaro.
- Modifica del ciclo di scraping: adatta il tuo ciclo di scraping per iterare sull'intervallo di 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, eseguiamo un'iterazione sui numeri di pagina da 1 a 10 e costruiamo dinamicamente l'URL per ogni pagina.
3. Rilevare la presenza di un “Next” pulsante: alcuni siti web utilizzano un “Next” invece di numeri di pagina espliciti. In questi casi, puoi verificare la presenza del pulsante “Next" e continua a raschiare finché non scompare.
Gestione di siti Web dinamici e rendering JavaScript
Come scraper, incontrerai sicuramente siti web altamente interattivi e complessi, con l'obiettivo di migliorare l'esperienza utente. Questi tipi di siti si basano molto su JavaScript e sono generalmente chiamati siti web con contenuto dinamico.
Ma, perché tutto questo trambusto? Il problema è che in questi siti il codice sorgente potrebbe non contenere i dati desiderati e sono una sfida per lo scraping.
Ecco perché è necessario ricorrere a strumenti come Selenium.
Selenium è un potente strumento per automatizzare i browser web. Ti consente di interagire con le pagine web, compilare moduli, cliccare pulsanti ed estrarre dati da contenuti renderizzati dinamicamente.
Impostazione di Selenium
Se hai già installato Selenium, la prossima cosa che devi fare è installare un driver web per il tuo browser preferito. Ad esempio, ChromeDriver per Google Chrome.
Ecco un esempio di come utilizzarlo:
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 driver web di Chrome, navighiamo verso un URL specifico utilizzando driver.get(), quindi eseguire azioni ed estrarre dati utilizzando i metodi di Selenium come find_element_by_tag_name().
In attesa del caricamento degli elementi
Nei siti dinamici, il contenuto spesso non viene caricato contemporaneamente. Quindi, alcuni elementi potrebbero non essere immediatamente disponibili quando la pagina viene caricata. Puoi gestire questo problema utilizzando 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. Quindi utilizziamo il metodo until() per attendere la presenza di un elemento con un ID specifico.
Alternative al selenio
Sebbene molti utenti ritengano che Selenium sia la soluzione migliore per i siti dinamici, dovresti valutare delle alternative per scoprire quale sia la più adatta a te.
Scrapy-Splash potrebbe essere un'opzione. È l'integrazione di un browser headless con il framework Scrapy. Consente l'estrazione di dati in modo più efficiente grazie all'infrastruttura di rete non bloccante di Scrapy e alle funzionalità avanzate di Splash per il rendering rapido di pagine web dinamiche.
Requests-html è un'altra alternativa, poiché estende la funzionalità della libreria requests aggiungendo il supporto per il rendering JavaScript e l'interazione con le pagine web.
Tecniche avanzate di Web Scraping
Man mano che farai progressi, ti accorgerai di riuscire a gestire alcuni scenari di scraping, ma ti troverai anche ad affrontare scenari più complessi che richiedono tecniche più avanzate.
Gestione dell'autenticazione e dei cookie
Alcuni siti web richiedono l'autenticazione o utilizzano cookie per gestire le sessioni utente. Puoi gestire l'autenticazione inviando credenziali di accesso con le tue richieste e gestire i cookie utilizzando librerie come requests O Il cookie jar è un file HTML..
Evitare il rilevamento e i divieti
I siti Web possono impiegare misure per rilevare e bloccare le attività di web scraping. Per evitare il rilevamento, puoi usare tecniche come la rotazione degli user agent, l'uso di proxy e l'introduzione di ritardi casuali tra le richieste.
Memorizzazione dei dati nei database
Invece di salvare i dati scraped su file, puoi archiviarli in database per un'archiviazione e un recupero più efficienti. Le scelte più diffuse includono database SQL come MySQL e PostgreSQL e database NoSQL come MongoDB.
API di scraping e gestione dei 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 utilizzando il modulo json in Python.
Scraping parallelo e asincrono
Per velocizzare il processo di scraping, puoi sfruttare l'elaborazione parallela e le tecniche di programmazione asincrona. Librerie come multiprocessing, threading e asyncio in Python possono aiutarti a raggiungere questo obiettivo.
Mettere tutto insieme: progetti di web scraping nel mondo reale
Da principiante, quando ho iniziato il mio allenamento di scraping, sentivo di sapere perfettamente cosa dovevo fare, finché non ho dovuto farlo. Non ha senso leggere e basta, devi mettere alla prova le tue capacità praticando.
E quale modo migliore per farlo se non lavorando su progetti concreti?
Diamo un'occhiata ad alcuni esempi con il loro processo passo dopo passo:
Esempio 1: scraping di articoli di notizie e analisi del sentiment
- Pianificazione del processo di raschiatura:
- Identificare il sito web di notizie da scansionare
- Determinare la struttura degli articoli (titolo, contenuto, data, ecc.)
- Pianificare il formato di archiviazione dei dati (ad esempio, CSV, database)
- Implementazione dello scraper:
- Utilizzare le richieste per recuperare il contenuto HTML del sito web di notizie
- Analizza l'HTML utilizzando BeautifulSoup per estrarre le informazioni dell'articolo
- Gestisci la paginazione e naviga attraverso più pagine
- Memorizza i dati estratti nel formato scelto
- Analisi e visualizzazione dei dati raccolti:
- Eseguire l'analisi del sentiment sul contenuto dell'articolo utilizzando librerie come NLTK o TextBlob
- Visualizza i punteggi del sentiment utilizzando librerie come Matplotlib o Plotly
- Identificare tendenze e modelli nel sentimento delle notizie nel tempo
Esempio 2: creazione di uno strumento di monitoraggio dei prezzi
- Estrazione di informazioni sui prodotti da siti di e-commerce:
- Identificare i siti web di e-commerce da scansionare
- Determinare la struttura delle informazioni sul prodotto (nome, prezzo, disponibilità, ecc.)
- Utilizzare tecniche di web scraping per estrarre dati di prodotto da più siti web
- Impostazione di avvisi e notifiche:
- Definire soglie di prezzo o criteri di disponibilità per ciascun prodotto
- Implementare un meccanismo per confrontare i prezzi di scarto con le soglie definite
- Imposta notifiche via e-mail o SMS per avvisare gli utenti quando i prezzi scendono o i prodotti diventano disponibili
- Distribuzione dello scraper sul cloud:
- Scegli una piattaforma cloud (ad esempio, AWS, Google Cloud, Heroku)
- Configurare l'ambiente e le dipendenze necessarie
- Pianificare l'esecuzione dello scraper a intervalli regolari
- Memorizza i dati raccolti in un database basato su cloud per un facile accesso e monitoraggio
Framework e strumenti per il Web Scraping
So che i termini "framework" e "libreria" sono usati in modo intercambiabile, ma hanno significati diversi e sono utilizzati per scopi diversi.
Con librerie come Request o BeautifulSoup, puoi creare web scraper da zero. Tuttavia, con i framework, puoi semplificare il processo poiché sono una raccolta di strumenti e librerie.
Vediamola in questo modo, le librerie sono come le auto a guida manuale, che ti danno il pieno controllo ma richiedono più sforzo e abilità per essere gestite. Mentre i framework sono come le auto automatiche; offrono un'esperienza più fluida ed efficiente semplificando molti degli aspetti noiosi dello scraping.
Alcune delle opzioni più popolari sono:
Scrapy
Scrapy è un framework per Python con un ecosistema completo per la creazione di web scraper scalabili ed efficienti. Le sue caratteristiche principali sono:
- Veloce per progettazione.
- Non è necessario aggiungere codice per generare file CSV, JSON e altri.
- Supporto per i selettori XPath e CSS.
- Ottimo ecosistema di estensioni, come il supporto per i middleware.
- Integrazione con pipeline di elementi per l'elaborazione e l'archiviazione dei dati
PySpider
PySpider è anche un framework per Python, ma a differenza di Scrapy, è compatibile con JavaScript, che è la sua caratteristica più forte. È anche ottimo per i principianti. Le sue caratteristiche principali includono:
- Supporto per il rendering JavaScript tramite PhantomJS o Puppeteer
- Coda attività e pianificatore integrati
- Integrazione con database e code di messaggi
- Supporta la concorrenza
Strumenti e servizi di Web Scraping
Oltre ai framework, ci sono alcuni strumenti e servizi che ti aiutano a semplificare lo scraping. La parte migliore è che richiedono una codifica minima. Alcune opzioni sono:
- Octoparse: Uno strumento di web scraping basato sul cloud con un'interfaccia punta e clicca per estrarre dati dai siti web.
- ParseHub: Un'applicazione desktop che consente di creare web scraper selezionando visivamente gli elementi di una pagina web.
- Import.io: Una piattaforma basata sul Web che fornisce strumenti per estrarre dati da siti Web e API.
Riassumendo i fondamenti del Web Scraping
In questa guida abbiamo trattato in modo generale i fondamenti del web scraping, come la comprensione della struttura del sito web, considerazioni etiche, tecniche di base e avanzate e strumenti e framework aggiuntivi.
Ora sei pronto per iniziare, ma potresti valutare di ampliare le tue conoscenze leggendo risorse aggiuntive, come la documentazione ufficiale di librerie e framework e tutorial sul web scraping.
Inoltre, cerca di chiedere consiglio a scraper esperti in comunità e forum di scraping. Non isolarti, perché abbiamo bisogno l'uno dell'altro.
Siamo stati tutti principianti una volta, quindi sii gentile con te stesso, inizia in piccolo e fai pratica regolarmente. Con sufficiente pratica e dedizione, vedrai come sarai in grado di affrontare progetti più complessi man mano che procedi.