In questo articolo andiamo a vedere come creare un programma in Python che effettua lo scraping di un sito web di e-commerce.

Lo scraping è una tecnica secondo la quale lo sviluppatore scrive un programma che non fa altro che navigare su un sito web come se fosse una persona reale a farlo e ne estrapola le informazioni necessarie per effettuare poi calcoli o semplicemente comunicarle al programmatore.

1. Perché dovrei aver bisogno di fare scraping?

Ci possono essere infinite ragioni per cui uno sviluppatore decide di fare scraping su un determinato sito, generalmente lo si fa nei casi in cui necessitiamo di alcune informazioni (es. commenti sotto a un video di YouTube) ma non abbiamo il modo di collegarci direttamente al database che contiene quelle informazioni.

Un altro scenario molto interessante in cui lo scraping potrebbe portare enormi benefici è lo scenario in cui dobbiamo ad esempio tenere monitorato un certo prodotto sul nostro store di e-commerce preferito.

Mettiamo caso che il prodotto in questione non è al momento disponibile ed io voglio immediatamente sapere quando tornerà disponibile posso scrivere un programma che ogni tot tempo vada a visitare la pagina del prodotto in questione per verificarne la disponibilità.

Schema funzionamento scraper

Da notare come il nostro scraper interagisce solo ed esclusivamente con il sito web e non ha nessun collegamento diretto con il database che contiene i dati mostrati nel sito.

2. Il nostro piccolo scraper

Lo scraper che andremo a scrivere in questo articolo non fa altro che visitare una pagina di un e-commerce di test una volta ogni ora per poi salvare in un file tutti i prodotti che ha trovato con relativa descrizione e prezzo di vendita.

Il risultato finale sarà quindi un file testuale (.txt) contenente tutte le rilevazioni effettuate dal programma con relativa data ed ora della singola rilevazione.

3. Tecnologie utilizzate

Come probabilmente avrai intuito anche dal titolo di questo articolo andremo a sviluppare il nostro script utilizzando il linguaggio Python.

Un appunto interessante da fare riguarda le librerie che andremo ad utilizzare per questo piccolo progetto. Sono librerie molto utilizzate in ambito lavorativo e quindi imparare a familiarizzarci un po’ non fa mai male

  • requests: libreria per richieste http
  • BeautifulSoup: libreria per gestire ed effettuare operazioni su pagine web
  • pandas: libreria di data frame utilissima per immagazzinare, gestire e presentare grandi quantità di dati

4. Passiamo al codice

Il sito del quale effettueremo lo scraping è un sito di test creato appositamente per effettuare prove.

https://webscraper.io/test-sites/e-commerce/allinone/phones/touch

Nulla vi vieta di riadattare lo script per poter farlo funzionare anche su altri siti di e-commerce reali.

Il nostro progetto si comporrà di una cartella contente 2 file Python ed un file di testo

struttura del nostro progetto

Il file “results.txt” possiamo anche non crearlo direttamente noi in quanto verrà generato dallo script una volta eseguito.

Qui di seguito incollo il codice del file main.py, i commenti nel codice dovrebbero far capire ogni singolo passaggio che cosa fa.

from scraping import scraping
import time

def main():
    while True:
        scraping()
        time.sleep(3600) # attendi 1 ora (3600 secondi)



# chiamata della funzione "main" quando viene eseguito il programma
if __name__ == "__main__":
    main()

Questo file si occupa sostanzialmente di lanciare ogni 3600 secondi (1 ora) la funzione (contenuta in scraping.py) che andrà a fare lo scraping del sito e salverà i dati nel file results.txt.

Qui di seguito il codice del file scraping.py:

# importazione delle librerie
import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
import datetime

def scraping():

    # url dal quale estrapolare i dati
    url = 'https://webscraper.io/test-sites/e-commerce/allinone/phones/touch'

    # chiamata in GET della pagina web
    r = requests.get(url)

    # parsing del contenuto in formato più leggibile
    soup = bs(r.content, 'html.parser')

    # get della lista di tutti i prodotti nella pagina
    product_list = soup.find_all("div", class_="thumbnail")

    #istanziamento della variabile che conterrà i dati
    result = {
        "title": [],
        "description": [],
        "price": []
    }

    # per ogni prodotto trovato vado a prendermi le proprietà
    # che mi servono e le inserisco nella apposita lista
    # del dizionario creato prima
    count = 0
    for product in product_list:
        title = product.find(class_="title").text
        description =  product.find(class_="description").text
        price =  product.find(class_="price").text

        result["title"].append(title)
        result["description"].append(description)
        result["price"].append(price)
        count += count

    # parsing del dizionario in un dataframe
    data_frame = pd.DataFrame(data=result)

    # stampa del data frame a video
    print(data_frame)

    # salvataggio del dataframe in un file
    file = open("results.txt", "a+")
    file_content = datetime.datetime.now().isoformat() + "\n\n"
    file_content += data_frame.to_string()
    file_content += "\n********************************** \n\n\n"
    file.write(file_content)

In parole povere questo algoritmo di scraping va a cercare all’interno della pagina web tutti gli elementi HTML che hanno una determinata classe associata (la classe che identifica i prodotti).

Successivamente per ogni prodotto trovato vengono salvate le informazioni di titolo, descrizione e prezzo.

Infine viene generato il dataframe di pandas con i dati raccolti che verrà salvato nel file results.txt

Qui di seguito incollo il contenuto del file results.txt al termine dell’esecuzione dello script

2021-01-09T09:00:10.657981

            title             description    price
0       Nokia 123           7 day battery   $24.99
1      LG Optimus             3.2" screen   $57.99
2  Samsung Galaxy      5 mpx. Android 5.0   $93.99
3         Nokia X  Andoid, Jolla dualboot  $109.99
4     Sony Xperia         GPS, waterproof  $118.99
5     Ubuntu Edge          Sapphire glass  $499.99
6          Iphone                   White  $899.99
7          Iphone                  Silver  $899.99
8          Iphone                   Black  $899.99
********************************** 


2021-01-09T09:00:16.202434

            title             description    price
0       Nokia 123           7 day battery   $24.99
1      LG Optimus             3.2" screen   $57.99
2  Samsung Galaxy      5 mpx. Android 5.0   $93.99
3         Nokia X  Andoid, Jolla dualboot  $109.99
4     Sony Xperia         GPS, waterproof  $118.99
5     Ubuntu Edge          Sapphire glass  $499.99
6          Iphone                   White  $899.99
7          Iphone                  Silver  $899.99
8          Iphone                   Black  $899.99
********************************** 


2021-01-09T09:00:21.836898

            title             description    price
0       Nokia 123           7 day battery   $24.99
1      LG Optimus             3.2" screen   $57.99
2  Samsung Galaxy      5 mpx. Android 5.0   $93.99
3         Nokia X  Andoid, Jolla dualboot  $109.99
4     Sony Xperia         GPS, waterproof  $118.99
5     Ubuntu Edge          Sapphire glass  $499.99
6          Iphone                   White  $899.99
7          Iphone                  Silver  $899.99
8          Iphone                   Black  $899.99
********************************** 


2021-01-09T09:00:27.474911

            title             description    price
0       Nokia 123           7 day battery   $24.99
1      LG Optimus             3.2" screen   $57.99
2  Samsung Galaxy      5 mpx. Android 5.0   $93.99
3         Nokia X  Andoid, Jolla dualboot  $109.99
4     Sony Xperia         GPS, waterproof  $118.99
5     Ubuntu Edge          Sapphire glass  $499.99
6          Iphone                   White  $899.99
7          Iphone                  Silver  $899.99
8          Iphone                   Black  $899.99
********************************** 

Come possiamo notare otteniamo una sorta elenco di tabelle contenente tutti i prodotti ed in cima ad ogni tabella è presente la data e l’ora della rilevazione. In questo caso per generare l’esempio ho lanciato lo script impostando come intervallo di tempo 5 secondi tra una rilevazione e l’altra.

5. Conclusioni

Abbiamo visto come è possibile creare un piccolo scraper utilizzando Python.

Adesso che hai le conoscenze base per creare i tuoi scraper personalizzati puoi dare libero sfogo alla fantasia.

Se qualche passaggio ti sfugge o hai incontrato qualche problema non esitare a lasciare un commento qui sotto.

ciao e alla prossima 🙂


7 commenti

firemage · 25 Febbraio 2021 alle 18:45

volevo chiedere se potresti spiegare come creare un bot che acquisti non appena il prodotto è disponibile

    fabiobiffi · 25 Febbraio 2021 alle 18:50

    Ciao, potrebbe essere argomento di un futuro articolo. Su che sito ti interesserebbe far lavorare il BOT?

    Alternative · 28 Aprile 2021 alle 18:17

    Sarebbe interessante farlo per il sito della Decathlon, visto che molti usano i bot per acquistare oggetti, infatti molti kit finiscono in un istante

      fabiobiffi · 28 Aprile 2021 alle 21:52

      potrebbe essere un argomento da trattare in futuro

      fabiobiffi · 28 Aprile 2021 alle 21:52

      ciao, se mi fornisci più dettagli forse posso aiutarti io direttamente 🙂

Silvia · 24 Marzo 2021 alle 00:10

Ciao, vorrei approfondire l argomento bot per comprare sui siti, puoi dirmi qualche libro o sito su cui approfondire? Grazie

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *