Como fazer Web Scrape da Amazon com Python

Python, Raspagem, Mar-06-20245 minutos de leitura

O Web scraping é a arte de extrair dados da Internet e utilizá-los para fins significativos. Por vezes, também é conhecida como extração de dados da Web ou recolha de dados da Web. Para os principiantes, é o mesmo que copiar dados da Internet e armazená-los localmente. No entanto, trata-se de um processo manual. Raspagem da Web

O Web scraping é a arte de extrair dados da Internet e utilizá-los para fins significativos. Por vezes, também é conhecida como extração de dados da Web ou recolha de dados da Web. Para os principiantes, é o mesmo que copiar dados da Internet e armazená-los localmente. No entanto, trata-se de um processo manual. A raspagem da Web é um processo automatizado que funciona com a ajuda de Web crawlers. Os Web crawlers ligam-se à Internet através do protocolo HTTP e permitem ao utilizador ir buscar dados de forma automatizada. Pode considerar-se a Internet como um solo enriquecido e os dados como o novo petróleo, enquanto a recolha de dados da Web é a técnica para extrair esse petróleo.

A capacidade de extrair e analisar os dados da Internet tornou-se uma técnica essencial, quer se trate de um cientista de dados, engenheiro ou profissional de marketing. Pode haver vários casos de utilização em que a recolha de dados da Web pode ser de grande ajuda. Neste artigo, vamos extrair dados da Amazon utilizando Python. Por fim, também analisaremos os dados extraídos e veremos a sua importância para qualquer pessoa normal, cientista de dados ou pessoa que gere uma loja de comércio eletrónico.

Apenas uma pequena precaução: Se és novo em Python e em web scraping, este artigo pode ser um pouco mais difícil de compreender. Eu sugeriria passar pelos artigos de nível introdutório em ProxyScrape e depois vir para este.

Vamos começar com o código.

Importação de bibliotecas

Em primeiro lugar, vamos importar todas as bibliotecas necessárias para o código. Estas bibliotecas serão utilizadas para a recolha e visualização de dados. Se quiser saber os detalhes de cada uma, pode visitar a sua documentação oficial.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib em linha
import re
import time
from datetime import datetime
import matplotlib.dates as mdates
import matplotlib.ticker as ticker
from urllib.request import urlopen
from bs4 import BeautifulSoup
importar pedidos

Recolha de dados da Amazon

Agora vamos extrair as informações úteis dos livros mais vendidos na Amazon. O URL que vamos utilizar é:

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

Uma vez que precisamos de aceder a todas as páginas, vamos percorrer cada página para obter o conjunto de dados necessário. 

Para estabelecer a ligação ao URL e obter o conteúdo HTML, é necessário o seguinte,

  • get_data: esta função será utilizada para introduzir o número da página como argumento.
  • user-agent: ajudará a contornar a deteção.
  • Especificaremos o URL para request.get e passaremos o user-agent como argumento.
  • Extrair o conteúdo de requests.get.
  • Extrai a página especificada e atribui-a à variável soup.

Algumas das etiquetas importantes em que residem os nossos dados importantes são

  • Nome do livro
  • Autor
  • Classificação
  • Clientes avaliados
  • Preço

Se inspecionar a página em questão, verá a etiqueta principal e os elementos correspondentes.

 Se pretender inspecionar um atributo específico, vá a cada um deles e inspeccione-os. Encontrará alguns atributos importantes para o autor, o nome do livro, a classificação, o preço e a classificação dos clientes. 

No nosso código, utilizaremos instruções if-else aninhadas para aplicar conclusões adicionais aos autores que não estão registados na 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

Esta função tem as seguintes funções,

  • Recolha os dados dentro de um ciclo for.
  • O ciclo irá iterar sobre cada página, começando de 1 a página+1.
  • Primeiro, temos de aplanar a lista e depois passá-la para DataFrame.
  • Finalmente, guardaremos o quadro de dados como um ficheiro 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')

Ler o ficheiro CSV

Vamos agora carregar o ficheiro csv,

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

A forma do quadro de dados mostra que existem 100 linhas e 5 colunas no ficheiro CSV.

Vejamos as 5 linhas do conjunto de dados,

df.head(61)

Vamos agora efetuar algum pré-processamento nas colunas ratings, customers_rated e price.

  • Uma vez que as classificações são de 5, retiramos a parte extra.
  • Vamos remover as vírgulas da coluna customer_rated.
  • Na coluna do preço, retiramos o símbolo das rupias e dividimo-lo por pontos.
  • Por fim, vamos converter as três colunas em números inteiros ou float.
df['Rating '] = df['Rating'].apply(lambda x: x.split()[0])
df['Rating' ] = pd.to_numeric(df['Rating'])
df["Preço"] = df["Preço"].str.replace('₹', '')
df["Preço" ] = df["Preço"].str.replace(',', '')
df['Preço'] = df['Preço'].apply(lambda x: x.split('.')[0])
df['Preço'] = df['Preço'].astype(int)
df["Clientes_Rated"] = df["Clientes_Rated"].str.replace(',', '')
df['Clientes_Rated'] = pd.to_numeric(df['Clientes_Rated'], errors='ignore')
df.head()

Se dermos uma vista de olhos nos tipos de dataframe, obtemos,

Existe alguma informação incompleta no resultado acima. Começamos por contar o número de NaNs e depois eliminamo-los.

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

Livros de autores mais vendidos

Vamos agora conhecer todos os autores com o livro mais caro. Iremos familiarizar-nos com os 20 melhores.

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

Livros mais votados

Veremos agora os livros e autores mais bem classificados no que diz respeito à classificação dos clientes. Filtraremos os autores e livros com menos de 1000 avaliações, para obtermos os autores mais famosos.

dados = df[df['Clientes_Classificados'] > 1000]
dados = dados.sort_values(['Rating'],axis=0, ascending=False)[:15]
dados

Vamos visualizar os livros mais bem classificados,

p = figure(x_range=data.iloc[:,0], plot_width=800, plot_height=600, title="Livros mais bem classificados com mais de 1000 avaliações de clientes", toolbar_location=None, tools="")
 
p.vbar(x=data.iloc[:,0], top=data.iloc[:,2], width=0.9)
 
p.xgrid.grid_line_color = Nenhum
p.y_range.start = 0
p.xaxis.major_label_orientation = math.pi/2
mostrar(p)

Autores e livros mais votados pelos clientes

Quanto maior for o número de classificações, maior será a confiança dos clientes. Assim, será mais convincente e credível se adicionarmos os autores e livros mais bem classificados pelos clientes.

from bokeh.transform import factor_cmap
from bokeh.models import Legend
from bokeh.palettes import Dark2_5 as palette
importar itertools
from bokeh.palettes import d3
#colors tem uma lista de cores que podem ser utilizadas em gráficos
cores = itertools.cycle(paleta)
 
paleta = d3['Categoria20'][20]
 mapa_de_índices= mapa_de_factores('Autor', paleta=paleta,
                         factores=dados["Autor"])
p = figure(plot_width=700, plot_height=700, title = "Top Authors: Classificação vs. Clientes avaliados")
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 = 'CLASSIFICAÇÃO DOS CLIENTES'
p.legend.location = 'top_left'
 
mostrar(p)

Conclusão

Neste artigo, vimos o que é a raspagem da Web, utilizando um caso de utilização muito importante de extração de dados da Amazon. Não apenas extraímos dados de diferentes páginas da Amazon, mas também visualizamos os dados usando diferentes bibliotecas Python. Este artigo foi um artigo de nível avançado e pode ser difícil de entender para pessoas que são novas em web scraping e visualização de dados. Para eles, sugiro que consultem os artigos do pacote inicial disponíveis em ProxyScrape. O Web scraping é uma técnica muito útil que pode dar um impulso ao seu negócio. Existem também algumas ferramentas pagas fantásticas disponíveis no mercado, mas porquê pagá-las se pode codificar o seu próprio scraper. O código que escrevemos acima pode não funcionar para todas as páginas Web, porque a estrutura da página pode ser diferente. Mas se compreendeu os conceitos acima, então não existem obstáculos para que possa fazer scraping de qualquer página web, modificando o código de acordo com a sua estrutura. Espero que este artigo tenha sido interessante para os leitores. Isso é tudo. Vejo-vos nos próximos!