Come effettuare lo scraping di Amazon con Python

Pitone, Scraping, Mar-06-20245 minuti di lettura

Il web scraping è l'arte di estrarre dati da Internet e di utilizzarli per scopi significativi. A volte è noto anche come estrazione di dati dal web o raccolta di dati dal web. Per i neofiti è come copiare i dati da Internet e memorizzarli localmente. Tuttavia, si tratta di un processo manuale. Scraping del web

Il web scraping è l'arte di estrarre dati da Internet e di utilizzarli per scopi significativi. A volte è noto anche come estrazione di dati dal web o raccolta di dati dal web. Per i neofiti è come copiare i dati da Internet e memorizzarli localmente. Tuttavia, si tratta di un processo manuale. Il web scraping è un processo automatizzato che funziona con l'aiuto dei web crawler. I web crawler si collegano a Internet tramite il protocollo HTTP e consentono all'utente di recuperare i dati in modo automatico. Si può considerare Internet come un terreno arricchito e i dati come il nuovo olio, mentre il web scraping è la tecnica per estrarre quell'olio.

La capacità di scraping e di analisi dei dati da Internet è diventata una tecnica essenziale, sia che siate data scientist, ingegneri o marketer. Ci possono essere diversi casi d'uso in cui lo scraping del web può essere di grande aiuto. In questo articolo, faremo lo scraping di dati da Amazon utilizzando Python. Infine, analizzeremo i dati raschiati e vedremo quanto sia importante per qualsiasi persona normale, scienziato dei dati o persona che gestisce un negozio di e-commerce.

Solo una piccola precauzione: Se siete nuovi a Python e al web scraping, questo articolo potrebbe essere un po' più difficile da capire. Suggerisco di leggere gli articoli introduttivi su ProxyScrape e poi passare a questo.

Iniziamo con il codice.

Importazione di librerie

Prima di tutto, importeremo tutte le librerie necessarie per il codice. Queste librerie saranno utilizzate per lo scraping e la visualizzazione dei dati. Per conoscere i dettagli di ciascuna di esse, si può visitare la loro documentazione ufficiale.

importare pandas come pd
importare numpy come np
importare matplotlib.pyplot come plt
importare seaborn come sns
%matplotlib inline
importare re
importare tempo
da datetime import datetime
importare matplotlib.dates come mdates
importare matplotlib.ticker come ticker
da urllib.request import urlopen
da bs4 import BeautifulSoup
importare richieste

Scraping dei dati Amazon

Ora cercheremo di raccogliere le informazioni utili dai libri più venduti su Amazon. L'URL che andremo a raschiare è:

https://www.amazon.in/gp/bestsellers/books/ref=zg_bs_pg_’+str(pageNo)+’?ie=UTF8&pg=’+str(pageNo)

Dal momento che dobbiamo accedere a tutte le pagine, faremo un ciclo su ogni pagina per ottenere il set di dati necessario. 

Per collegarsi all'URL e recuperare il contenuto HTML, è necessario quanto segue,

  • get_data: questa funzione verrà utilizzata per inserire il numero di pagina come argomento.
  • user-agent: aiuterà a bypassare il rilevamento.
  • Si specificherà l'URL a request.get e si passerà l'user-agent come argomento.
  • Estrazione del contenuto da requests.get.
  • Scrape la pagina specificata e la assegna alla variabile soup.

Alcuni dei tag importanti sotto cui risiederanno i nostri dati importanti sono,

  • Nome del libro
  • Autore
  • Valutazione
  • Valutazione dei clienti
  • Prezzo

Se si ispeziona la pagina data, si vedrà il tag genitore e gli elementi corrispondenti.

 Se si desidera esaminare un attributo particolare, è sufficiente andare su ciascuno di essi e controllarli. Troverete alcuni attributi importanti per l'autore, il nome del libro, la valutazione, il prezzo e la valutazione dei clienti. 

Nel nostro codice, utilizzeremo dichiarazioni nidificate if-else per applicare risultati extra per quegli autori che non sono registrati su amazon. 

no_pages = 2
 
def get_data(pageNo):  
    headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0", "Accept-Encoding":"gzip, deflate", "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "DNT":"1","Connection":"close", "Upgrade-Insecure-Requests":"1"}
 
    r = requests.get('https://www.amazon.in/gp/bestsellers/books/ref=zg_bs_pg_'+str(pageNo)+'?ie=UTF8&pg='+str(pageNo), headers=headers)#, proxies=proxies)
    content = r.content
    soup = BeautifulSoup(content)
    #print(soup)
 
    alls = []
    for d in soup.findAll('div', attrs={'class':'a-section a-spacing-none aok-relative'}):
        #print(d)
        name = d.find('span', attrs={'class':'zg-text-center-align'})
        n = name.find_all('img', alt=True)
        #print(n[0]['alt'])
        author = d.find('a', attrs={'class':'a-size-small a-link-child'})
        rating = d.find('span', attrs={'class':'a-icon-alt'})
        users_rated = d.find('a', attrs={'class':'a-size-small a-link-normal'})
        price = d.find('span', attrs={'class':'p13n-sc-price'})
 
        all1=[]
 
        if name is not None:
            #print(n[0]['alt'])
            all1.append(n[0]['alt'])
        else:
            all1.append("unknown-product")
 
        if author is not None:
            #print(author.text)
            all1.append(author.text)
        elif author is None:
            author = d.find('span', attrs={'class':'a-size-small a-color-base'})
            if author is not None:
                all1.append(author.text)
            else:    
                all1.append('0')
 
        if rating is not None:
            #print(rating.text)
            all1.append(rating.text)
        else:
            all1.append('-1')
 
        if users_rated is not None:
            #print(price.text)
            all1.append(users_rated.text)
        else:
            all1.append('0')     
 
        if price is not None:
            #print(price.text)
            all1.append(price.text)
        else:
            all1.append('0')
        alls.append(all1)    
    return alls

Questo strumento svolge le seguenti funzioni,

  • Raccogliere i dati in un ciclo for.
  • Il ciclo itererà su ogni pagina, partendo da 1 fino a pagina+1.
  • Dobbiamo prima appiattire l'elenco e poi passarlo a DataFrame.
  • Infine, salveremo il dataframe come file CSV.
per i in range(1, no_pages+1):
    risultati.append(get_data(i))
flatten = lambda l: [item for sublist in l for item in sublist]
df = pd.DataFrame(flatten(results),columns=['Book Name','Author','Rating','Customers_Rated', 'Price'])
df.to_csv('amazon_products.csv', index=False, encoding='utf-8')

Lettura del file CSV

Ora carichiamo il file csv,

df = pd.read_csv("amazon_products.csv")
df.shape

La forma del dataframe mostra che nel file CSV ci sono 100 righe e 5 colonne.

Vediamo le 5 righe del dataset,

df.head(61)

Ora faremo alcune preelaborazioni sulle colonne ratings, customers_rated e price.

  • Poiché le valutazioni sono su 5, elimineremo la parte extra.
  • Rimuoveremo le virgole dalla colonna customer_rated.
  • Nella colonna del prezzo rimuoviamo il simbolo delle rupie e lo dividiamo con un punto.
  • Infine, convertiremo tutte e tre le colonne in numeri interi o in numeri fluttuanti.
df['Valutazione'] = df['Valutazione'].apply(lambda x: x.split()[0])
df['Valutazione'] = pd.to_numeric(df['Valutazione'])
df["Prezzo"] = df["Prezzo"].str.replace('₹', '')
df["Prezzo"] = df["Prezzo"].str.replace(',', '')
df['Prezzo'] = df['Prezzo'].apply(lambda x: x.split('.')[0])
df['Prezzo'] = df['Prezzo'].astype(int)
df["Clienti_Rati"] = df["Clienti_Rati"].str.replace(',', '')
df['Customers_Rated'] = pd.to_numeric(df['Customers_Rated'], errors='ignore')
df.head()

Se diamo un'occhiata ai tipi di dataframe, otteniamo,

L'output sopra riportato contiene alcune informazioni incomplete. Conteremo prima il numero di NaN e poi li elimineremo.

df.replace(str(0), np.nan, inplace=True)
df.replace(0, np.nan, inplace=True)
count_nan = len(df) - df.count()
conteggio_nan
df = df.dropna()

I libri più costosi degli autori

Ora conosceremo tutti gli autori con il libro più costoso. Conosceremo la top 20 di questi autori.

dati = data.sort_values(['Rating'],axis=0, ascending=False)[:15]
dati

I libri più votati

Ora vedremo i libri e gli autori più votati rispetto alla valutazione dei clienti. Filtreremo gli autori e i libri con meno di 1000 recensioni, in modo da ottenere gli autori più famosi.

dati = df[df['Customers_Rated'] > 1000]
dati = data.sort_values(['Rating'],axis=0, ascending=False)[:15]
dati

Visualizziamo i libri più votati,

p = figura(x_range=data.iloc[:,0], plot_width=800, plot_height=600, title="Libri più votati con più di 1000 valutazioni da parte dei clienti", toolbar_location=Nessuno, tools="")
 
p.vbar(x=data.iloc[:,0], top=data.iloc[:,2], width=0.9)
 
p.xgrid.grid_line_color = Nessuno
p.y_range.start = 0
p.xaxis.major_label_orientation = math.pi/2
mostra(p)

Autori e libri più votati dai clienti

Più sono le valutazioni, maggiore è la fiducia dei clienti. Quindi sarà più convincente e credibile se aggiungiamo gli autori e i libri più votati dai clienti.

da bokeh.transform importare factor_cmap
da bokeh.models import Legend
da bokeh.palettes import Dark2_5 as palette
importare itertools
da bokeh.palettes import d3
#colors ha un elenco di colori che possono essere usati nei grafici
colori = itertools.cycle(palette)
 
palette = d3['Categoria20'][20]
index_cmap = factor_cmap('Author', palette=palette,
                         fattori=dati["Autore"])
p = figura(larghezza_trama=700, altezza_trama=700, titolo = "Autori migliori: Valutazione vs. Clienti valutati")
p.scatter('Rating','Customers_Rated', source=data, fill_alpha=0.6, fill_color=index_cmap, size=20, legend='Author')
p.xaxis.axis_label = 'RATING'
p.yaxis.axis_label = 'VALUTAZIONE DEI CLIENTI'
p.legend.location = 'top_left'
 
mostra(p)

Conclusione

In questo articolo abbiamo visto cos'è il web scraping prendendo in considerazione un caso d'uso molto importante: l'estrazione di dati da Amazon. Non solo abbiamo estratto i dati da diverse pagine Amazon, ma abbiamo anche visualizzato i dati utilizzando diverse librerie Python. Questo articolo è di livello avanzato e potrebbe essere difficile da capire per chi è alle prime armi con il web scraping e la visualizzazione dei dati. Per loro, suggerisco di consultare gli articoli dello starter pack disponibili su ProxyScrape. Il web scraping è una tecnica molto utile che può dare una spinta alla vostra attività. Sul mercato sono disponibili anche alcuni strumenti a pagamento, ma perché pagarli quando si può creare il proprio scraper. Il codice che abbiamo scritto qui sopra potrebbe non funzionare per ogni pagina web, perché la struttura della pagina potrebbe essere diversa. Ma se avete compreso i concetti sopra esposti, allora non ci sono ostacoli per la scansione di qualsiasi pagina web modificando il codice in base alla sua struttura. Spero che questo articolo sia stato interessante per i lettori. Questo è tutto. Ci vediamo nei prossimi!