Wie man Amazon mit Python scrapen kann

Python, Scraping, Mar-06-20245 Min. gelesen

Web Scraping ist die Kunst, Daten aus dem Internet zu extrahieren und sie für sinnvolle Zwecke zu nutzen. Manchmal wird es auch als Webdatenextraktion oder Webdatenerfassung bezeichnet. Für Neulinge ist es dasselbe wie das Kopieren von Daten aus dem Internet und deren lokale Speicherung. Es handelt sich jedoch um einen manuellen Prozess. Web Scraping

Web Scraping ist die Kunst, Daten aus dem Internet zu extrahieren und sie für sinnvolle Zwecke zu nutzen. Manchmal wird es auch als Webdatenextraktion oder Webdatenerfassung bezeichnet. Für Neulinge ist es dasselbe wie das Kopieren von Daten aus dem Internet und deren lokale Speicherung. Allerdings ist dies ein manueller Prozess. Web Scraping ist ein automatisierter Prozess, der mit Hilfe von Web Crawlern funktioniert. Webcrawler stellen über das HTTP-Protokoll eine Verbindung zum Internet her und ermöglichen es dem Benutzer, Daten auf automatisierte Weise abzurufen. Man kann das Internet als angereicherten Boden und Daten als das neue Öl betrachten, während Web Scraping die Technik ist, dieses Öl zu extrahieren.

Die Fähigkeit, Daten aus dem Internet zu scrapen und zu analysieren, ist zu einer unverzichtbaren Technik geworden, unabhängig davon, ob man Datenwissenschaftler, Ingenieur oder Vermarkter ist. Es gibt verschiedene Anwendungsfälle, in denen Web Scraping eine große Hilfe sein kann. In diesem Artikel werden wir mit Python Daten von Amazon scrapen. Schließlich werden wir auch die gescrapten Daten analysieren und sehen, wie wichtig sie für jeden normalen Menschen, Datenwissenschaftler oder Betreiber eines E-Commerce-Geschäfts sind.

Nur eine kleine Vorsichtsmaßnahme: Wenn Sie neu in Python und Web Scraping sind, könnte dieser Artikel für Sie etwas schwieriger zu verstehen sein. Ich würde vorschlagen, dass Sie zunächst die Einführungsartikel unter ProxyScrape durchzuarbeiten und dann zu diesem Artikel zu kommen.

Lassen Sie uns mit dem Code beginnen.

Bibliotheken importieren

Zunächst werden wir alle notwendigen Bibliotheken importieren, die für den Code erforderlich sind. Diese Bibliotheken werden für das Scraping und die Visualisierung von Daten verwendet. Wenn Sie die Details der einzelnen Bibliotheken kennenlernen möchten, können Sie deren offizielle Dokumentation besuchen.

importiere pandas als pd
import numpy as np
import matplotlib.pyplot as plt
importieren seaborn as sns
%matplotlib inline
importieren re
importiere Zeit
from datetime importieren datetime
importieren matplotlib.dates as mdates
import matplotlib.ticker as ticker
from urllib.request import urlopen
von bs4 importieren BeautifulSoup
import requests

Scraping von Amazon-Daten

Jetzt werden wir die nützlichen Informationen aus den meistverkauften Büchern von Amazon abrufen. Die URL, die wir abrufen werden, ist:

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

Da wir auf alle Seiten zugreifen müssen, werden wir jede Seite in einer Schleife durchlaufen, um den erforderlichen Datensatz zu erhalten. 

Um eine Verbindung zur URL herzustellen und den HTML-Inhalt abzurufen, ist Folgendes erforderlich,

  • get_data: Diese Funktion wird für die Eingabe der Seitennummer als Argument verwendet.
  • User-Agent: Er hilft, die Erkennung zu umgehen.
  • Wir geben die URL in request.get an und übergeben den User-Agent als Argument.
  • Extrahieren des Inhalts von requests.get.
  • Scrape die angegebene Seite und weise sie der Variable soup zu.

Einige der wichtigen Tags, unter denen unsere wichtigen Daten gespeichert werden, sind,

  • Buch Name
  • Autor
  • Bewertung
  • Bewertete Kunden
  • Preis

Wenn Sie die angegebene Seite untersuchen, sehen Sie das übergeordnete Tag und die entsprechenden Elemente.

 Wenn Sie ein bestimmtes Attribut prüfen möchten, gehen Sie zu jedem einzelnen und prüfen Sie es. Sie finden einige wichtige Attribute für den Autor, den Buchnamen, die Bewertung, den Preis und die Kundenbewertung. 

In unserem Code werden wir verschachtelte if-else-Anweisungen verwenden, um zusätzliche Ergebnisse für die Autoren zu erhalten, die nicht bei amazon registriert sind. 

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

Dieser hat folgende Funktionen,

  • Sammeln Sie die Daten in einer for-Schleife.
  • Die Schleife durchläuft jede Seite, beginnend von 1 bis Seite+1.
  • Wir müssen die Liste zunächst reduzieren und sie dann an DataFrame übergeben.
  • Schließlich speichern wir den Datenrahmen als CSV-Datei.
for i in range(1, no_pages+1):
    results.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')

Lesen der CSV-Datei

Wir laden nun die csv-Datei,

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

Die Form des Datenrahmens zeigt, dass die CSV-Datei 100 Zeilen und 5 Spalten enthält.

Schauen wir uns die 5 Zeilen des Datensatzes an,

df.head(61)

Wir werden nun einige Vorverarbeitungen an den Spalten "ratings", "customers_rated" und "price" vornehmen.

  • Da die Bewertungen aus 5 bestehen, werden wir den zusätzlichen Teil entfernen.
  • Wir entfernen die Kommas aus der Spalte customer_rated.
  • In der Preisspalte entfernen wir das Rupiensymbol und trennen es durch einen Punkt.
  • Zum Schluss werden alle drei Spalten in Integer oder Float umgewandelt.
df['Bewertung'] = df['Bewertung'].apply(lambda x: x.split()[0])
df['Bewertung'] = pd.to_numeric(df['Bewertung'])
df["Preis"] = df["Preis"].str.replace('₹', '')
df["Preis"] = df["Preis"].str.replace(',', '')
df['Preis'] = df['Preis'].apply(lambda x: x.split('.')[0])
df['Preis'] = df['Preis'].astype(int)
df["Kunden_Bewertung"] = df["Kunden_Bewertung"].str.replace(',', '')
df['Kunden_Bewertung'] = pd.to_numeric(df['Kunden_Bewertung'], errors='ignore')
df.head()

Wenn wir einen Blick auf die Typen von Datenrahmen werfen, erhalten wir,

Die obige Ausgabe enthält einige unvollständige Informationen. Wir zählen zunächst die Anzahl der NaNs und lassen sie dann weg.

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

Höchstpreisige Bücher von Autoren

Wir werden nun alle Autoren mit dem höchstpreisigen Buch kennenlernen. Wir werden uns mit den Top 20 von ihnen vertraut machen.

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

Top bewertete Bücher

Wir werden nun die am besten bewerteten Bücher und Autoren in Bezug auf die Kundenbewertung sehen. Wir werden die Autoren und Bücher mit weniger als 1000 Bewertungen herausfiltern, damit wir die bekanntesten Autoren erhalten.

data = df[df['Kunden_Bewertung'] > 1000]
data = data.sort_values(['Bewertung'],axis=0, ascending=False)[:15]
daten

Machen wir uns ein Bild von den am besten bewerteten Büchern,

p = figure(x_range=data.iloc[:,0], plot_width=800, plot_height=600, title="Top Rated Books with more than 1000 Customers Rating", toolbar_location=None, tools="")
 
p.vbar(x=data.iloc[:,0], top=data.iloc[:,2], width=0.9)
 
p.xgrid.grid_line_color = Keine
p.y_range.start = 0
p.xaxis.major_label_orientation = math.pi/2
show(p)

Von Kunden am meisten bewertete Autoren und Bücher

Je mehr Bewertungen, desto größer ist das Vertrauen der Kunden. Es wird also überzeugender und glaubwürdiger sein, wenn wir die Autoren und Bücher hinzufügen, die von den Kunden am besten bewertet wurden.

from bokeh.transform import factor_cmap
from bokeh.models importiere Legende
from bokeh.palettes importiere Dark2_5 als Palette
importiere itertools
from bokeh.palettes importiere d3
#colors enthält eine Liste von Farben, die in Plots verwendet werden können.
colors = itertools.cycle(palette)
 
palette = d3['Kategorie20'][20]
index_cmap = factor_cmap('Autor', palette=palette,
                         factors=data["Autor"])
p = figure(plot_width=700, plot_height=700, title = "Top-Autoren: Bewertung vs. bewertete Kunden")
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 = 'KUNDEN BEWERTET'
p.legend.location = 'top_left'
 
anzeigen(p)

Einpacken

In diesem Artikel haben wir gesehen, was Web Scraping ist, indem wir einen sehr wichtigen Anwendungsfall der Extraktion von Daten aus Amazon genommen haben. Wir haben nicht nur Daten von verschiedenen Amazon-Seiten extrahiert, sondern die Daten auch mit verschiedenen Python-Bibliotheken visualisiert. Dieser Artikel war ein Artikel für Fortgeschrittene und könnte für Leute, die neu im Bereich Web Scraping und Datenvisualisierung sind, schwer zu verstehen sein. Für sie empfehle ich die Artikel des Starter Packs, die unter ProxyScrape. Web Scraping ist eine sehr nützliche Technik, die Ihrem Unternehmen einen Schub geben kann. Es gibt auch einige erstaunliche kostenpflichtige Tools auf dem Markt, aber warum sollten Sie diese bezahlen, wenn Sie Ihren eigenen Scraper programmieren können. Der Code, den wir oben geschrieben haben, funktioniert möglicherweise nicht für jede Webseite, da die Seitenstruktur unterschiedlich sein kann. Aber wenn Sie die obigen Konzepte verstanden haben, dann gibt es keine Hürden für Sie, jede Webseite zu scrapen, indem Sie den Code entsprechend ihrer Struktur modifizieren. Ich hoffe, dieser Artikel war für die Leser interessant. Das war schon alles. Wir sehen uns in den nächsten Artikeln!