donker proxyscrape logo

Amazon scrapen met Python

Python, Schrapen, Mei-03-20215 min gelezen

Web scraping is de kunst om gegevens van het internet te halen en ze te gebruiken voor zinvolle doeleinden. Het staat ook bekend als web data extraction of web data harvesting. Voor nieuwelingen is het gewoon hetzelfde als gegevens kopiëren van het internet en ze lokaal opslaan. Het is echter een handmatig proces. Web scraping is een geautomatiseerd proces dat werkt met behulp van web crawlers. Webcrawlers maken verbinding met het internet via het HTTP-protocol en stellen de gebruiker in staat om op een geautomatiseerde manier gegevens op te halen. Men kan het internet beschouwen als verrijkte grond en gegevens als de nieuwe olie, terwijl web scraping de techniek is om die olie te extraheren.

De mogelijkheid om gegevens van het internet te schrapen en te analyseren is een essentiële techniek geworden, of je nu een datawetenschapper, ingenieur of marketeer bent. Er kunnen verschillende gebruikssituaties zijn waarbij het schrapen van webgegevens enorm kan helpen. In dit artikel zullen we gegevens van Amazon scrapen met Python. Tot slot zullen we ook de geschraapte gegevens analyseren en zien hoe belangrijk dit is voor een normaal persoon, datawetenschapper of persoon die een e-commercewinkel runt.

Gewoon een kleine voorzorgsmaatregel: Als Python en web scraping nieuw voor je zijn, is dit artikel misschien wat moeilijker te begrijpen. Ik zou aanraden om de inleidende artikelen op ProxyScrape en dan naar dit artikel gaan.

Laten we beginnen met de code.

Bibliotheken importeren

Allereerst importeren we alle bibliotheken die nodig zijn voor de code. Deze bibliotheken worden gebruikt voor het schrapen en visualiseren van gegevens. Als je de details van elk van deze bibliotheken wilt weten, kun je terecht in hun officiële documentatie.

importeer pandas als pd
importeer numpy als np
importeer matplotlib.pyplot als plt
importeer seaborn als sns
%matplotlib inline
importeer re
importeer tijd
uit datetime importeer datetime
importeer matplotlib.dates als mdates
importeer matplotlib.ticker als ticker
uit urllib.request importeert urlopen
van bs4 importeert BeautifulSoup
importeer verzoeken

Amazon-gegevens schrapen

Nu gaan we de nuttige informatie van de best verkochte boeken van Amazon scrapen. De URL die we gaan scrapen is:

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

Omdat we toegang moeten krijgen tot alle pagina's, lopen we door elke pagina om de benodigde dataset te krijgen. 

Om verbinding te maken met de URL en de HTML-inhoud op te halen, is het volgende vereist,

  • get_data: deze functie wordt gebruikt om het paginanummer als argument in te voeren.
  • user-agent: dit helpt om de detectie te omzeilen.
  • We geven de URL op in request.get en geven de user-agent door als argument.
  • De inhoud uit requests.get halen.
  • Schraap de opgegeven pagina en wijs deze toe aan de soepvariabele.

Enkele van de belangrijke tags waaronder onze belangrijke gegevens zich zullen bevinden zijn,

  • Naam boek
  • Auteur
  • Beoordeling
  • Klanten Beoordeeld
  • Prijs

Als je de gegeven pagina inspecteert, zie je de parent tag en de bijbehorende elementen.

 Als je een bepaald kenmerk wilt inspecteren, ga je naar elk kenmerk en inspecteer je het. Je vindt een aantal belangrijke kenmerken voor de auteur, de naam van het boek, de waardering, de prijs en de klanten die het boek beoordelen. 

In onze code gebruiken we geneste if-else-statements om extra bevindingen toe te passen voor auteurs die niet geregistreerd zijn bij 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

Dit voert de volgende functies uit,

  • Verzamel de gegevens in een for-lus.
  • De lus zal elke pagina doorlopen, beginnend bij 1 tot pagina+1.
  • We moeten eerst de lijst afvlakken en deze dan doorgeven aan DataFrame.
  • Tot slot slaan we het dataframe op als CSV-bestand.

voor i in bereik(1, geen_pagina's+1):
    results.append(get_data(i))
plat = lambda l: [item voor sublijst in l voor item in sublijst]
df = pd.DataFrame(flatten(results),columns=['Book Name','Author','Rating','Customers_Rated', 'Price'])
df.to_csv('amazon_products.csv', index=False, encoding='utf-8')

Het CSV-bestand lezen

We gaan nu het csv-bestand laden,

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

De vorm van het dataframe laat zien dat er 100 rijen en 5 kolommen in het CSV-bestand staan.

Laten we de 5 rijen van de dataset bekijken,

df.head(61)

We gaan nu wat voorbewerkingen uitvoeren op de ratings, customers_rated en price kolom.

  • Omdat de beoordelingen uit 5 bestaan, zullen we het extra deel verwijderen.
  • We verwijderen komma's uit de kolom customer_rated.
  • In de prijskolom verwijderen we het roepie-symbool en splitsen we het door punten.
  • Tot slot converteren we alle drie de kolommen naar integer of float.

df['Rating'] = df['Rating'].apply(lambda x: x.split()[0])
df['Rating'] = pd.to_numeric(df['Rating'])
df["Prijs"] = df["Prijs"].str.replace('₹', '')
df["Prijs"] = df["Prijs"].str.replace(',', '')
df['Prijs'] = df['Prijs'].apply(lambda x: x.split('.')[0])
df['Prijs'] = df['Prijs'].astype(int)
df["Klanten_Gerateerd"] = df["Klanten_Gerateerd"].str.replace(',', '')
df['Customers_Rated'] = pd.to_numeric(df['Customers_Rated'], errors='ignore')
df.head()

Als we kijken naar de typen dataframes, krijgen we,

Er is wat onvolledige informatie in de uitvoer hierboven. We zullen eerst het aantal NaN's tellen en ze dan weglaten.

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

df = df.dropna()

Hoogst geprijsde boeken van auteurs

We zullen nu alle auteurs met het duurste boek leren kennen. We maken kennis met de top 20 van hen.

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

Best gewaardeerde boeken

We zien nu de best beoordeelde boeken en auteurs met betrekking tot de klantwaardering. We filteren de auteurs en boeken met minder dan 1000 beoordelingen, zodat we de beroemdste auteurs te zien krijgen.

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

Laten we eens kijken naar de best beoordeelde boeken,

p = figuur(x_range=data.iloc[:,0], plot_width=800, plot_height=600, title="Best beoordeelde boeken met meer dan 1000 klanten", toolbar_location=None, tools="")
 
p.vbar(x=data.iloc[:,0], top=data.iloc[:,2], width=0.9)
 
p.xgrid.grid_line_color = Geen
p.y_range.start = 0
p.xaxis.major_label_orientation = math.pi/2
weergeven(p)

Meest gewaardeerde auteurs en boeken door klanten

Hoe meer beoordelingen, hoe groter het vertrouwen van de klant. Het zal dus overtuigender en geloofwaardiger zijn als we de auteurs en boeken toevoegen die het meest worden gewaardeerd door de klanten.

uit bokeh.transform importeer factor_cmap
uit bokeh.models importeer Legend
uit bokeh.palettes importeer Dark2_5 als palette
importeer itertools
uit bokeh.palettes importeer d3
#colors heeft een lijst met kleuren die gebruikt kunnen worden in plots
kleuren = itertools.cycle(palette)
 
palette = d3['Category20'][20]
index_cmap = factor_cmap('Auteur', palette=palette,
                         factoren=data["Auteur"])
p = figure(plot_width=700, plot_height=700, title = "Top Authors: Waardering vs. Klanten gewaardeerd")
p.scatter('Rating','Customers_Rated',source=data,fill_alpha=0.6, fill_color=index_cmap,size=20, legend='Author')
p.xaxis.axis_label = 'Waardering'.
p.yaxis.axis_label = 'KLANTEN WAARDERING'.
p.legend.location = 'top_left'.
 
toon(p)

Inpakken

In dit artikel hebben we gezien wat web scraping is door een zeer belangrijke use case te nemen, namelijk het extraheren van gegevens van Amazon. We hebben niet alleen gegevens van verschillende Amazon-pagina's gehaald, maar we hebben de gegevens ook gevisualiseerd met behulp van verschillende Python-bibliotheken. Dit artikel was voor gevorderden en is misschien moeilijk te begrijpen voor mensen die nieuw zijn op het gebied van web scraping en datavisualisatie. Voor hen raad ik aan om naar de startersartikelen te gaan die beschikbaar zijn op ProxyScrape. Web scraping is een zeer nuttige techniek die je bedrijf een boost kan geven. Er zijn ook enkele fantastische betaalde tools beschikbaar op de markt, maar waarom zou je die betalen als je je eigen scraper kunt coderen. De code die we hierboven hebben geschreven, werkt misschien niet voor elke webpagina omdat de paginastructuur kan verschillen. Maar als je de bovenstaande concepten hebt begrepen, dan zijn er geen obstakels voor je om elke webpagina te scrapen door de code aan te passen aan de structuur. Ik hoop dat dit artikel interessant was voor de lezers. Dat was alles. Tot de volgende!