Come raschiare le tabelle dai siti web - un tutorial in Python

Come fare, Pitone, Scraping, 13 dicembre 20245 minuti di lettura

Il web scraping è diventato un'abilità vitale per gli sviluppatori Python, gli analisti di dati e tutti coloro che lavorano con gli insiemi di dati. Quando si tratta di dati strutturati e ricchi, le tabelle presenti nei siti web sono spesso miniere d'oro di informazioni. Che si tratti di cataloghi di prodotti, statistiche sportive o dati finanziari, la capacità di estrarre e salvare i dati delle tabelle con Python è uno strumento prezioso.

Questa guida pratica vi accompagna passo dopo passo nel processo di scraping di tabelle da siti web utilizzando Python. Alla fine, saprete come utilizzare librerie popolari come requests, Beautiful Soup e persino pandas per accedere ai dati delle tabelle e memorizzarli in formati riutilizzabili come i file CSV.

Prerequisiti

Prima di addentrarci nei dettagli tecnici, ecco cosa vi serve per seguirci:

  • Assicurarsi che Python sia installato sul sistema. È possibile scaricare l'ultima versione qui.
  • Biblioteche necessarie:
    • requests - Perrecuperare il contenuto HTML dai siti web. È un pacchetto popolare per l'invio di richieste HTTP in Python.
    • Beautiful Soup: unapotente libreria per il parsing di documenti HTML e XML. La useremo per estrarre elementi specifici dalla nostra pagina web.
    • pandas: lalibreria ideale per la manipolazione e l'analisi dei dati in Python. Questa sarà la nostra destinazione finale, dove memorizzeremo i dati della tabella estratta.

Utilizzeremo il comando pip per installare le librerie necessarie. È sufficiente eseguire il seguente comando nel terminale per completare l'installazione:

pip installa le richieste di beautifulsoup4 pandas

Guida passo-passo allo scraping delle tabelle

Passo 1: capire la struttura del sito web

Il primo passo di qualsiasi progetto di scraping web è analizzare la struttura del sito web di destinazione. In questo esempio, faremo lo scraping dei dati da un sito web campione che presenta una tabella che mostra la classifica delle squadre di hockey. Di seguito è riportata un'anteprima della tabella:

Ecco come appare questa tabella nella struttura HTML.

Passo 2: invio di una richiesta HTTP

Il primo passo consiste nel recuperare la pagina web che si vuole scrappare. Utilizzeremo la libreria requests per inviare una richiesta HTTP e recuperare il contenuto HTML dal sito web fittizio che stiamo utilizzando per ottenere il contenuto della tabella

url = "https://www.scrapethissite.com/pages/forms/"

response = requests.get(url)

if response.status_code == 200:
   print("Page fetched successfully!")
   html_content = response.text
else:
   print(f"Failed to fetch the page. Status code: {response.status_code}")
   exit()

Passo 3: estrazione dei dati dalla tabella

In HTML, una tabella è un modo strutturato per presentare i dati in righe e colonne, proprio come in un foglio di calcolo. Le tabelle vengono create utilizzando l'opzione <table> e il loro contenuto è diviso in righe (<tr>) e le cellule (<td> per le celle di dati o <th> per le celle di intestazione). Ecco una breve descrizione di come funziona la struttura di una tabella:

  • Tabella: Racchiuso all'interno <table> funge da contenitore per tutte le righe e le celle.
  • Righe: Ciascuno <tr> (riga della tabella) rappresenta una fetta orizzontale della tabella.
  • Cellule: All'interno di ogni riga, <td> I tag contengono singoli valori di dati (o <th> per le intestazioni).
  • Attributi: Le tabelle hanno spesso classi, ID o altri attributi che le caratterizzano o le identificano.

Ad esempio, in questo script, si individua il file <table> con una classe specifica (class="tabella") ed estrarre le righe e le celle utilizzando Zuppa bella. Questo ci permette di estrarre i dati in modo sistematico e di prepararli per l'analisi o il salvataggio.

soup = BeautifulSoup(html_content, "html.parser")

table = soup.find("table", {"class": "table"})

if not table:
   print("No table found on the page!")
   exit()

Passo 4: Salvataggio dei dati in un file CSV

In questo passo, salveremo i dati della tabella estratta in un file CSV per un uso futuro e li visualizzeremo anche come DataFrame di pandas, in modo da poter vedere come sono strutturati i dati. Il salvataggio dei dati in formato CSV consente di analizzarli in seguito con strumenti come Excel, Google Sheets o Python stesso.

headers = [header.text.strip() for header in table.find_all("th")]

rows = []
for row in table.find_all("tr", class_="team"):
   cells = [cell.text.strip() for cell in row.find_all("td")]
   rows.append(cells)

df = pd.DataFrame(rows, columns=headers)

csv_filename = "scraped_table_data_pandas.csv"
df.to_csv(csv_filename, index=False, encoding="utf-8")

print(f"Data saved to {csv_filename}")

Quando si esegue questo codice, pandas creerà un file chiamato dati_tabella_scraped.csv nella cartella di lavoro e i dati estratti saranno stampati nella console come segue:

          Nome della squadra Anno Vittorie Sconfitte OT Sconfitte Vittoria % Gol fatti (GF) Gol subiti (GA) + / -
0 Boston Bruins 1990 44 24 0,55 299 264 35
1 Buffalo Sabres 1990 31 30 0,388 292 278 14
2 Calgary Flames 1990 46 260,575 344 263 81
3 Chicago Blackhawks 1990 49 230,613 284 211 73
4 Detroit Red Wings 1990 34 380,425 273 298 -25

Codice completo: Scraping e salvataggio dei dati delle tabelle

Di seguito è riportato lo script Python completo per lo scraping dei dati delle tabelle da un sito web, il salvataggio in un file CSV e la visualizzazione dei dati estratti. Questo script combina tutti i passaggi trattati in questa guida in un unico flusso di lavoro coeso.

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = "https://www.scrapethissite.com/pages/forms/"

response = requests.get(url)

if response.status_code == 200:
    print("Page fetched successfully!")
    html_content = response.text
else:
    print(f"Failed to fetch the page. Status code: {response.status_code}")
    exit()

soup = BeautifulSoup(html_content, "html.parser")

table = soup.find("table", {"class": "table"})

if not table:
    print("No table found on the page!")
    exit()

headers = [header.text.strip() for header in table.find_all("th")]

rows = []
for row in table.find_all("tr", class_="team"):
    cells = [cell.text.strip() for cell in row.find_all("td")]
    rows.append(cells)

df = pd.DataFrame(rows, columns=headers)

csv_filename = "scraped_table_data_pandas.csv"
df.to_csv(csv_filename, index=False, encoding="utf-8")

print(df.head())
print(f"Data saved to {csv_filename}")

Conclusione

Questa guida vi ha accompagnato passo dopo passo nel processo: capire la struttura del sito web, estrarre i dati e salvarli per l'analisi. Se state costruendo insiemi di dati per la ricerca, automatizzando la raccolta dei dati o semplicemente esplorando le possibilità del web scraping, la padronanza di queste tecniche vi apre un mondo di opportunità.

Durante lo scraping, si possono incontrare problemi come i divieti IP o i limiti di velocità imposti dai siti web. È qui che i proxy diventano fondamentali. I proxy consentono di:

  • Bypassare i limiti di velocità: Ruotare gli indirizzi IP per evitare di essere bloccati dai siti web che inviano troppe richieste.
  • Mantenere l'anonimato: Tenete nascosta la vostra identità mascherando il vostro vero indirizzo IP.
  • Accesso a dati geo-ristretti: Usate i proxy con località specifiche per scrutare i contenuti specifici di una regione.

ProxyScrape offre un'ampia gamma di proxy, tra cui proxy residenziali, premium, dedicati e per dispositivi mobili, studiati su misura per lo scraping del web. Le loro soluzioni proxy affidabili e scalabili possono aiutarvi a gestire progetti di scraping su larga scala senza interruzioni, garantendo una raccolta di dati fluida ed efficiente.