Una guida per principianti per imparare il web scraping e la visualizzazione dei dati con Python

Guide, Pitone, Scraping, Dicembre-00-20215 minuti di lettura

Come si possono estrarre informazioni significative dai siti web in modo rapido ed efficiente? L'estrazione manuale dei dati richiede molto tempo. È possibile utilizzare il web scraping, un metodo automatizzato per acquisire dati non tabellari o poco strutturati dai siti web. Successivamente, è possibile convertire i dati in un formato strutturato e utilizzabile, come un foglio di calcolo.

Indice dei contenuti

Come si possono estrarre informazioni significative dai siti web in modo rapido ed efficiente? L'estrazione manuale dei dati richiede molto tempo. È possibile utilizzare il web scraping, un metodo automatizzato per acquisire dati non tabellari o poco strutturati dai siti web. Successivamente, è possibile convertire i dati in un formato strutturato e utilizzabile, come un foglio di calcolo o un file .csv.

Il web scraping consente di archiviare i dati e di tracciarne le modifiche online. Le aziende lo utilizzano ampiamente per scopi diversi. Ad esempio, i negozi online lo usano per raschiare i prezzi dei loro concorrenti e le pagine disponibili al pubblico. Quindi, utilizzano queste informazioni per adeguare i propri prezzi. Un'altra pratica comune di web scraping è il contact scraping, in cui le organizzazioni raccolgono dati personali come numeri di telefono o indirizzi e-mail per scopi di marketing. 

Perché si usa il Web Scraping?

Perché qualcuno deve estrarre grandi quantità di informazioni dai siti web? Per capirlo, guardate le seguenti applicazioni del web scraping.

  • Ricerca e sviluppo - È possibile raccogliere grandi insiemi di dati (temperatura, informazioni generali, ecc.) dai siti web e analizzarli per effettuare sondaggi per la ricerca e lo sviluppo.
  • Confronto dei prezzi - Aziende e servizi come ParseHub utilizzano il web scraping per raccogliere dati dai siti di shopping online e confrontare i prezzi dei prodotti.
  • Annunci di lavoro - È possibile utilizzare il web scraping per raccogliere i dettagli relativi alle offerte di lavoro e ai colloqui da diversi siti web ed elencarli in un unico posto. 
  • Social Media Scraping - È possibile utilizzare il web scraping per raccogliere dati da siti web di social media come Instagram e Twitter e scoprire quali sono i trend del momento.
  • Raccolta di indirizzi e-mail - Molte aziende utilizzano l'e-mail come mezzo di marketing. Utilizzano il web scraping per raccogliere gli ID e-mail e poi inviare e-mail in massa.

Scraping del web con Python

È possibile effettuare lo scraping dei dati dai siti web seguendo i passaggi indicati di seguito.

  • Ottenere l'URL che si vuole scrapare
  • Ispezione della pagina
  • Trovare i dati da estrarre
  • Scrivere il codice
  • Eseguire il codice ed estrarre i dati
  • Memorizzare i dati nel formato desiderato

Le librerie che possiamo utilizzare per il web scraping in Python sono:

Pandas - Pandas è utilizzato per manipolare e analizzare i dati. È possibile utilizzare questa libreria per estrarre i dati e memorizzarli nel formato desiderato.

Beautiful Soup - È un pacchetto Python per analizzare documenti HTML e XML. Crea alberi di analisi utili per estrarre facilmente i dati dai siti web.

Requests - È una semplice libreria HTTP.

Utilizzeremo questo sito per estrarre il numero di casi COVID. Successivamente, analizzeremo i dati e creeremo alcune visualizzazioni.

Importazione di librerie

È possibile importare richieste e BeautifulSoup in Python per lo scraping del web, come mostrato di seguito.

importare le richieste 
da bs4 importa BeautifulSoup

URL per lo scraping dei dati

Specificare l'URL del sito web da cui si deve effettuare lo scraping dei dati. Si deve usare il metodo requests.get() per inviare una richiesta GET all'URL specificato. Inoltre, si deve creare un costruttore BeautifulSoup che accetti i due parametri stringa, come mostrato nel codice seguente.

url = 'https://www.worldometers.info/coronavirus/countries-where-coronavirus-has-spread/'
pagina = requests.get(url) 
soup = BeautifulSoup(page.text, 'html.parser') 
  
dati = []

Raschiare ogni elemento

È possibile effettuare lo scraping di ogni elemento della tabella URL utilizzando il metodo soup.find_all(). Restituisce un oggetto che offre un accesso indicizzato alle occorrenze trovate e può essere stampato utilizzando un ciclo for o while.

data_iterator = iter(soup.find_all('td'))

Utilizzo di un ciclo

È possibile utilizzare un ciclo while True che si ripete finché non ci sono dati disponibili nell'iteratore.

mentre Vero: 
   try: 
        paese = next(data_iterator).text 
        confermato = next(data_iterator).text 
        morti = next(data_iterator).text 
        continente = next(data_iterator).text

Per le colonne "confermati" e "morti", assicurarsi di rimuovere le virgole e convertire in int. 

dati.append(( 
            paese, 
            (confermato.replace(', ', '')), 
            (morti.replace(',', '')), 
            continente
        )) 
    
    tranne StopIteration: 
       interrompere

Quando il numero di elementi rimasti da iterare è zero, viene sollevato l'errore StopIteration.

Creare un dataframe Pandas

È possibile estrarre i dati dal sito web dopo aver eseguito il codice sopra riportato. È necessario creare un dataframe Pandas per analizzare ulteriormente i dati. Nel codice sottostante, abbiamo ordinato i dati in base al numero di casi COVID confermati.

Importare la libreria pandas per creare un dataframe.

data.sort(key = lambda row: row[1], reverse = True)
importare pandas come pd
df = pd.DataFrame(data,columns=['country','Number of cases','Deaths','Continent'],dtype=float)
df.head()
df['Numero di casi'] = [x.replace(',', '') for x in df['Numero di casi']]
df['Numero di casi'] = pd.to_numeric(df['Numero di casi'])
df

Si otterrà il seguente risultato:

Per ottenere informazioni sul Dataframe, utilizzare df.info().

df.info()

Creare la colonna Death_rate

Creeremo una nuova colonna denominata Tasso di mortalità, come mostrato di seguito.

dff = df.sort_values(by ='Numero di casi', ascending = False)
dff['Tasso_di_morte'] = (dff['Decessi']/dff['Numero di casi'])*100
dff.head()

L'output è il seguente.

Scraping del web con i proxy

Un server proxy consente di utilizzare un indirizzo IP unico per accedere alle informazioni che si desidera analizzare. In questo modo, il sito web non vede il vostro indirizzo IP reale, consentendovi di effettuare lo scraping dei dati in modo anonimo. È necessario utilizzare i proxy per lo scraping del Web per i seguenti motivi.

  • Con un pool di proxy è possibile inviare più richieste simultanee a un server Web senza essere bannati.
  • Con l'aiuto dei proxy, è possibile effettuare richieste da una particolare posizione, dispositivo, ISP, rete mobile. È inoltre possibile effettuare il crawling dei contenuti visualizzati per un'area o un dispositivo specifico.
  • Alcuni siti web hanno dei divieti IP che possono essere aggirati con l'aiuto dei proxy. 

Tipi di proxy per lo scraping del web

È possibile utilizzare i due proxy seguenti per raschiare i dati dai siti web.

  • Proxy del datacenter - Gli indirizzi IP del datacenter sono gli indirizzi IP dei server. I server si trovano nei centri dati. Lo scopo principale dei proxy per datacenter è quello di nascondere il proprio indirizzo ai siti web che vengono visitati. Questi proxy sono utilizzati principalmente per lo scraping di dati aziendali.
  • Proxy residenziali - Gli indirizzi IP residenziali sono più costosi di quelli dei centri dati e sono difficili da ottenere. Questi proxy consentono di scegliere una località specifica, ad esempio una città, un paese, ecc. e di navigare sul web come un utente reale in quell'area geografica.

Visualizzazione dei dati con Python

La visualizzazione dei dati è la rappresentazione grafica di dati o informazioni. È possibile utilizzare strumenti visivi come grafici, mappe e diagrammi come modo accessibile per comprendere i dati rappresentati. Vediamo come visualizzare i dati estratti da questo sito web utilizzando gli strumenti di visualizzazione dei dati.

Importazione di librerie

Per visualizzare i dati è necessario importare le seguenti librerie, come mostrato di seguito.

importare seaborn come sns
importare matplotlib.pyplot come plt
da pylab import rcParams

Tracciare un diagramma a coppie

È possibile tracciare un grafico a coppie per dimostrare le relazioni a coppie in un set di dati. È possibile implementarlo facilmente utilizzando il codice sottostante e identificare le tendenze nei dati per un'analisi successiva.

rcParams['figure.figsize'] = 15, 10
da matplotlib.pyplot import figura
figura(num=Nessuno, figsize=(20, 6), dpi=80, facecolor='w', edgecolor='k')
sns.pairplot(dff,hue='Continente')

Si otterrà il risultato come.

Tracciare un grafico a barre

È possibile tracciare un grafico a barre che mostra i dati categoriali come barre rettangolari e confronta i valori delle diverse categorie nei dati. 

sns.barplot(x = 'Paese', y = 'Numero di casi', dati = dff.head(10))

L'output è il seguente.

Tracciare un diagramma di dispersione

È possibile comprendere la relazione tra valori numerici utilizzando un grafico a dispersione. Esso utilizza dei punti per rappresentare la relazione tra le variabili. 

sns.scatterplot(x = "Numero di casi", y = "Decessi", hue = "Continente", data = dff)

L'output è il seguente.

Raggruppare e ordinare i dati

Nel codice seguente, raggruppiamo i dati per continente e li ordiniamo in base al numero di casi COVID.

dfg = dff.groupby(by = 'Continent',as_index = False).agg({'Number of cases':sum,'Deaths':sum})
dfgg = dfg[1:]
df1 = dfgg.sort_values(by = 'Number of cases',ascending = False)
df1['Death_rate'] = (df1['Deaths']/df1['Number of cases'])*100
df1.sort_values(by = 'Death_rate',ascending = False)

L'output è il seguente.

Ora tracceremo un grafico a barre tra "Continente" e "Tasso di mortalità" come mostrato di seguito.

sns.barplot(x = 'Continente', y = 'Tasso di mortalità', dati = df1.sort_values(by = 'Tasso di mortalità', ascending = False))

L'output è il seguente.

Questo grafico a barre mostra che il tasso di mortalità è il più alto in Sud America e il più basso in Australia tra tutti i Paesi. 

Importazione della tabella di testo

Installare texttable per creare una semplice tabella ASCII. Quindi, importatela come tt.

pip installa texttable

importare texttable come tt

Creare un oggetto tabella di testo

È necessario creare un oggetto tabella di testo come mostrato di seguito. È necessario aggiungere una riga vuota all'inizio della tabella per le intestazioni e allineare le colonne.

tabella = tt.Texttable() 

table.add_rows([(None, None, None, None)] + data) table.set_cols_align(('c', 'c', 'c', 'c'))  # 'l' indica la sinistra, 'c' il centro e 'r' la destra 
table.header((' Paese ', ' Numero di casi ', ' Decessi ', ' Continente ')) 
  
print(table.draw())

Qui l'output rappresenta alcune righe della tabella come.

Conclusione

Con il web scraping è possibile estrarre grandi quantità di dati dai siti web in modo rapido ed efficiente. È possibile convertire i dati non strutturati estratti in un formato utilizzabile come un file .csv. Abbiamo visto che è possibile effettuare lo scraping dei dati dal Web utilizzando due moduli: Pandas e BeautifulSoup. I proxy consentono di estrarre i dati dal web in modo anonimo. Per lo scraping del web si possono usare sia i proxy dei centri dati che quelli residenziali. I proxy residenziali sono più affidabili ma più costosi di quelli dei datacenter. Inoltre, è possibile effettuare analisi dei dati per ricavare informazioni utili in base alle proprie esigenze. In questo articolo, abbiamo analizzato i dati utilizzando strumenti di visualizzazione come diagrammi a barre, diagrammi a coppie e diagrammi a dispersione.