Comment faire du Web Scrape sur Amazon avec Python

Python, Scraping, May-19-20215 minutes de lecture

Le web scraping est l'art d'extraire des données de l'internet et de les utiliser à des fins utiles. Il est également connu sous le nom d'extraction de données web ou de récolte de données web. Pour les néophytes, cela revient à copier des données de l'internet et à les stocker localement. Il s'agit toutefois d'un processus manuel. Raclage de sites web

Le web scraping est l'art d'extraire des données de l'internet et de les utiliser à des fins utiles. Il est également connu sous le nom d'extraction de données web ou de récolte de données web. Pour les néophytes, cela revient à copier des données de l'internet et à les stocker localement. Il s'agit toutefois d'un processus manuel. Le web scraping est un processus automatisé qui fonctionne à l'aide de robots d'indexation. Ces derniers se connectent à l'internet à l'aide du protocole HTTP et permettent à l'utilisateur de récupérer des données de manière automatisée. On peut considérer l'internet comme un sol enrichi et les données comme le nouveau pétrole, tandis que le web scraping est la technique qui permet d'extraire ce pétrole.

La capacité de récupérer et d'analyser les données de l'internet est devenue une technique essentielle, que l'on soit un scientifique, un ingénieur ou un spécialiste du marketing. Il existe plusieurs cas d'utilisation dans lesquels le web scraping peut être d'une grande aide. Dans cet article, nous allons récupérer des données d'Amazon en utilisant Python. Enfin, nous analyserons les données scrappées et verrons à quel point elles sont importantes pour une personne normale, un scientifique des données ou une personne gérant un magasin de commerce électronique.

Juste une petite précaution : Si vous êtes novice en matière de Python et de web scraping, cet article risque d'être un peu plus difficile à comprendre. Je vous suggère de lire les articles d'introduction à ProxyScrape puis de lire celui-ci.

Commençons par le code.

Importation de bibliothèques

Tout d'abord, nous importerons toutes les bibliothèques nécessaires au code. Ces bibliothèques seront utilisées pour le scraping et la visualisation des données. Si vous souhaitez connaître les détails de chacune d'entre elles, vous pouvez consulter leur documentation officielle.

import pandas as pd
import numpy sous np
import matplotlib.pyplot en tant que plt
import seaborn sous sns
%matplotlib en ligne
import re
import time
from datetime import datetime
import matplotlib.dates as mdates
import matplotlib.ticker en tant que ticker
from urllib.request import urlopen
from bs4 import BeautifulSoup
Importation de requêtes

Récupérer les données d'Amazon

Nous allons maintenant extraire les informations utiles des livres les plus vendus sur Amazon. L'URL que nous allons récupérer est la suivante :

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

Étant donné que nous devons accéder à toutes les pages, nous allons parcourir chaque page en boucle pour obtenir l'ensemble de données nécessaire. 

Pour se connecter à l'URL et récupérer le contenu HTML, les éléments suivants sont nécessaires,

  • get_data : cette fonction sera utilisée pour saisir le numéro de page en tant qu'argument.
  • user-agent : cela permettra de contourner la détection.
  • Nous allons spécifier l'URL à request.get et passer le user-agent comme argument.
  • Extraction du contenu de requests.get.
  • Récupère la page spécifiée et l'affecte à la variable soupe.

Voici quelques-uns des principaux tags sous lesquels nos données importantes seront stockées,

  • Nom du livre
  • Auteur
  • Evaluation
  • Clients évalués
  • Prix

Si vous inspectez la page donnée, vous verrez la balise parent et ses éléments correspondants.

 Si vous souhaitez examiner un attribut particulier, allez à chacun d'entre eux et examinez-les. Vous trouverez des attributs importants pour l'auteur, le nom du livre, la note, le prix, les clients évalués. 

Dans notre code, nous utiliserons des instructions if-else imbriquées pour appliquer des conclusions supplémentaires aux auteurs qui ne sont pas enregistrés auprès d'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

Il remplit les fonctions suivantes,

  • Recueillez les données dans une boucle "for".
  • La boucle itère sur chaque page, en commençant par la page 1 jusqu'à la page+1.
  • Nous devons d'abord aplatir la liste, puis la passer au DataFrame.
  • Enfin, nous enregistrerons le cadre de données sous la forme d'un fichier CSV.
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')

Lecture du fichier CSV

Nous allons maintenant charger le fichier csv,

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

La forme du cadre de données montre que le fichier CSV comporte 100 lignes et 5 colonnes.

Voyons les 5 lignes de l'ensemble de données,

df.head(61)

Nous allons maintenant effectuer un prétraitement sur les colonnes ratings, customers_rated et price.

  • Puisque les notes sont sur 5, nous enlèverons la partie supplémentaire.
  • Nous allons supprimer les virgules de la colonne customer_rated.
  • Dans la colonne des prix, nous allons supprimer le symbole des roupies et le diviser par un point.
  • Enfin, nous convertirons les trois colonnes en nombres entiers ou flottants.
df['Note'] = df['Note'].apply(lambda x : x.split()[0])
df["Cote"] = pd.to_numeric(df["Cote"])
df["Prix"] = df["Prix"].str.replace('₹', '')
df["Prix"] = df["Prix"].str.replace(',', '')
df["Prix "] = df["Prix"].apply(lambda x : x.split('.')[0])
df['Prix '] = df['Prix'].astype(int)
df["Clients_Rated"] = df["Clients_Rated"].str.replace(',', '')
df["Clients _Rated"] = pd.to_numeric(df["Clients_Rated"], errors='ignore')
df.head()

Si nous regardons les types de dataframe, nous obtenons,

La sortie ci-dessus contient des informations incomplètes. Nous allons d'abord compter le nombre de NaN, puis les supprimer.

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

Livres d'auteurs les plus chers

Nous allons maintenant faire connaissance avec tous les auteurs dont le livre est le plus cher. Nous nous familiariserons avec les 20 premiers d'entre eux.

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

Livres les mieux notés

Nous verrons maintenant les livres et les auteurs les mieux notés par rapport à ceux qui sont notés par les clients. Nous filtrons les auteurs et les livres ayant reçu moins de 1 000 évaluations, afin d'obtenir les auteurs les plus célèbres.

data = df[df['Clients_Rated'] > 1000]
data = data.sort_values(['Notation'],axis=0, ascending=False)[:15]
données

Visualisons les livres les mieux notés,

p = figure(x_range=data.iloc[ :,0], plot_width=800, plot_height=600, title="Livres les mieux notés par plus de 1000 clients", toolbar_location=None, tools="")
 
p.vbar(x=data.iloc[ :,0], top=data.iloc[ :,2], width=0.9)
 
p.xgrid.grid_line_color = None
p.y_range.start = 0
p.xaxis.major_label_orientation = math.pi/2
show(p)

Auteurs et livres les plus appréciés par les clients

Plus les évaluations sont nombreuses, plus la confiance des clients est grande. Il sera donc plus convaincant et plus crédible d'ajouter les auteurs et les livres les mieux notés par les clients.

from bokeh.transform import factor_cmap
from bokeh.models import Legend
from bokeh.palettes import Dark2_5 as palette
import itertools
from bokeh.palettes import d3
#colors contient une liste de couleurs qui peuvent être utilisées dans les graphiques
colors = itertools.cycle(palette)
 
palette = d3['Category20'][20]
index_cmap = factor_cmap('Author', palette=palette,
                         factors=data["Author"])
p = figure(plot_width=700, plot_height=700, title = "Top Authors : Rating vs. Customers Rated")
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 = 'CLIENTS NOTÉS'
p.legend.location = 'top_left'
 
montrer(p)

Conclusion

Dans cet article, nous avons vu ce qu'est le web scraping en prenant un cas d'utilisation très important d'extraction de données d'Amazon. Nous avons non seulement extrait des données de différentes pages d'Amazon, mais nous avons également visualisé les données à l'aide de différentes bibliothèques Python. Cet article est d'un niveau avancé et peut être difficile à comprendre pour les personnes qui ne connaissent pas le web scraping et la visualisation de données. Pour eux, je suggérerais d'aller voir les articles du pack de démarrage disponibles sur ProxyScrape. Le web scraping est une technique très utile qui peut donner un coup de pouce à votre entreprise. Il existe également des outils payants étonnants disponibles sur le marché, mais pourquoi les payer quand vous pouvez coder votre propre scraper. Le code que nous avons écrit ci-dessus ne fonctionnera peut-être pas pour toutes les pages web, car leur structure peut être différente. Mais si vous avez compris les concepts ci-dessus, alors il n'y a aucun obstacle pour vous de scraper n'importe quelle page web en modifiant le code en fonction de sa structure. J'espère que cet article a été intéressant pour les lecteurs. C'est tout. A bientôt dans les prochains !