Cómo hacer Web Scrape de Amazon con Python

Python, Scraping, Mayo-19-20215 minutos de lectura

El web scraping es el arte de extraer datos de Internet y utilizarlos con fines útiles. A veces también se conoce como extracción de datos web o recolección de datos web. Para los novatos, es lo mismo que copiar datos de Internet y almacenarlos localmente. Sin embargo, es un proceso manual. Web scraping

El web scraping es el arte de extraer datos de Internet y utilizarlos con fines útiles. A veces también se conoce como extracción de datos web o recolección de datos web. Para los novatos, es lo mismo que copiar datos de Internet y almacenarlos localmente. Sin embargo, es un proceso manual. El web scraping es un proceso automatizado que funciona con la ayuda de rastreadores web. Los rastreadores web se conectan a Internet mediante el protocolo HTTP y permiten al usuario obtener datos de forma automatizada. Se puede considerar Internet como un suelo enriquecido y los datos como el nuevo petróleo, mientras que el web scraping es la técnica para extraer ese petróleo.

La capacidad de raspar y analizar los datos de Internet se ha convertido en una técnica esencial tanto si eres un científico de datos, un ingeniero o un vendedor. Puede haber varios casos de uso en los que el web scraping puede ser de gran ayuda. En este artículo, vamos a raspar los datos de Amazon utilizando Python. Por último, también analizaremos los datos raspados y veremos lo importante que es para cualquier persona normal, científico de datos o persona que dirija una tienda de comercio electrónico.

Sólo una pequeña precaución: Si eres nuevo en Python y web scraping, este artículo puede ser un poco más difícil de entender para ti. Yo sugeriría ir a través de los artículos de nivel introductorio en ProxyScrape y luego venir a éste.

Empecemos con el código.

Importación de bibliotecas

En primer lugar, importaremos todas las bibliotecas necesarias para el código. Estas librerías se utilizarán para el scraping y la visualización de datos. Si quieres conocer los detalles de cada una, puedes visitar su documentación oficial.

importar pandas como pd
import numpy como np
import matplotlib.pyplot como plt
import seaborn as sns
matplotlib en línea
import re
import time
from datetime import datetime
import matplotlib.dates as mdates
import matplotlib.ticker como ticker
from urllib.request import urlopen
from bs4 import BeautifulSoup
importar peticiones

Extracción de datos de Amazon

Ahora vamos a scrapear la información útil de los libros más vendidos de Amazon. La URL que vamos a raspar es:

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

Como necesitamos acceder a todas las páginas, haremos un bucle por cada una de ellas para obtener el conjunto de datos necesario. 

Para conectarse a la URL y obtener el contenido HTML, se requiere lo siguiente,

  • get_data: esta función se utilizará para introducir el número de página como argumento.
  • user-agent: ayudará a evitar la detección.
  • Especificaremos la URL a request.get y pasaremos el user-agent como argumento.
  • Extraer el contenido de requests.get.
  • Rastrea la página especificada y la asigna a la variable soup.

Algunas de las etiquetas importantes bajo las que residirán nuestros datos importantes son,

  • Nombre del libro
  • Autor
  • Clasificación
  • Calificación de los clientes
  • Precio

Si inspecciona la página dada, verá la etiqueta padre y sus elementos correspondientes.

 Si desea inspeccionar un atributo en particular, vaya a cada uno de ellos e inspecciónelos. Encontrará algunos atributos importantes para el autor, nombre del libro, valoración, precio, clientes valorados. 

En nuestro código, utilizaremos sentencias if-else anidadas para aplicar conclusiones adicionales a aquellos autores que no estén registrados en 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

Esto realizará las siguientes funciones,

  • Recoge los datos dentro de un bucle for.
  • El bucle iterará sobre cada página, empezando por 1 hasta página+1.
  • Primero tenemos que aplanar la lista y luego pasarla a DataFrame.
  • Por último, guardaremos el marco de datos como archivo CSV.
for i in range(1, no_pages+1):
    results.append(get_data(i))
aplanar = lambda l: [elemento para sublista en l para elemento en sublista]
df = pd.DataFrame(flatten(results),columns=['Nombre del libro','Autor','Valoración','Clientes_Calificados', 'Precio'])
df.to_csv('amazon_products.csv', index=False, encoding='utf-8')

Lectura del archivo CSV

Ahora cargaremos el archivo csv,

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

La forma del marco de datos muestra que hay 100 filas y 5 columnas en el archivo CSV.

Veamos las 5 filas del conjunto de datos,

df.head(61)

A continuación realizaremos un preprocesamiento de las columnas ratings, customers_rated y price.

  • Como las valoraciones son de 5, le quitaremos la parte extra.
  • Eliminaremos las comas de la columna customer_rated.
  • En la columna del precio eliminaremos el símbolo de las rupias y la dividiremos por puntos.
  • Por último, convertiremos las tres columnas en enteros o flotantes.
df['Calificación'] = df['Calificación'].apply(lambda x: x.split()[0])
df['Valoración'] = pd.to_numeric(df['Valoración'])
df["Precio "] = df["Precio"].str.replace('₹', '')
df[" Precio"] = df["Precio"].str.replace(',', ' ')
df['Precio'] = df['Precio'].apply(lambda x: x.split('.')[0])
df['Precio'] = df['Precio'].astype(int)
df["Clientes_Calificados" ] = df["Clientes_Calificados"].str.replace(',', '')
df['Clientes_Calificados'] = pd.to_numeric(df['Clientes_Calificados'], errors='ignorar')
df.head()

Si echamos un vistazo a los tipos de dataframe obtenemos,

Hay alguna información incompleta en la salida anterior. Primero contaremos el número de NaN y luego los eliminaremos.

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

Libros de autores más cotizados

Ahora conoceremos a todos los autores con el libro más caro. Nos familiarizaremos con los 20 mejores de ellos.

data = data.sort_values(['Valoración'],axis=0, ascending=False)[:15]
datos

Los libros mejor valorados

Ahora veremos los libros y autores mejor valorados con respecto a la valoración de los clientes. Filtraremos aquellos autores y libros con menos de 1.000 reseñas, de modo que obtendremos los autores más famosos.

datos = df[df['Calificación_clientes'] > 1000]
datos = datos.ordenar_valores(['Calificación'],eje=0, ascendente=False)[:15]
datos

Visualicemos los libros mejor valorados,

p = figure(x_range=data.iloc[:,0], plot_width=800, plot_height=600, title="Los libros mejor valorados por más de 1000 clientes", toolbar_location=None, tools="")
 
p.vbar(x=datos.iloc[:,0], top=datos.iloc[:,2], width=0.9)
 
p.xgrid.grid_line_color = None
p.y_range.start = 0
p.eje_x.orientación_etiqueta_mayor = math.pi/2
mostrar(p)

Autores y libros más valorados por los clientes

Cuantas más valoraciones, mayor será la confianza de los clientes. Así que será más convincente y creíble si añadimos los autores y libros más valorados por los clientes.

from bokeh.transform import factor_cmap
from bokeh. models import Leyenda
from bokeh.palettes import Dark2_5 as palette
import itertools
from bokeh. palettes import d3
#colors tiene una lista de colores que se pueden utilizar en los gráficos
colors = itertools.cycle(paleta)
 
paleta = d3['Categoría20'][20]
index_cmap = factor_cmap('Autor', palette=palette,
                         factores=datos["Autor"])
p = figure(plot_width=700, plot_height=700, title = "Los mejores autores: Valoración vs. Clientes valorados")
p.scatter('Valoración','Clientes_valorados',source=datos,fill_alpha=0.6, fill_color=index_cmap,size=20,legend='Autor')
p.xaxis.axis_label = 'VALORACIÓN'
p.yaxis.axis_label = ' CLIENTES VALORADOS'
p.legend.location = 'arriba_izquierda'
 
Mostrar(p)

Conclusión

En este artículo, hemos visto lo que es el web scraping tomando un caso de uso muy importante de extracción de datos de Amazon. No sólo hemos extraído datos de diferentes páginas de Amazon, sino que también hemos visualizado los datos utilizando diferentes bibliotecas de Python. Este artículo fue un artículo de nivel avanzado y puede ser difícil de entender para las personas que son nuevas en el web scraping y visualización de datos. Para ellos, yo sugeriría ir a los artículos del paquete de arranque disponible en ProxyScrape. Web scraping es una técnica muy útil que puede dar un impulso a su negocio. También hay algunas increíbles herramientas de pago disponibles en el mercado, pero ¿por qué pagar cuando se puede codificar su propio raspador. El código que hemos escrito arriba puede no funcionar para todas las páginas web porque la estructura de la página puede diferir. Pero si usted ha entendido los conceptos anteriores, entonces no hay obstáculos para que usted pueda raspar cualquier página web modificando el código de acuerdo a su estructura. Espero que este artículo haya sido interesante para los lectores. Eso es todo. ¡Nos vemos en los próximos!