dark proxyscrape logotipo

Como acessar a Web Scrape Amazon com Python

Python, Scraping, Maio-03-20215 minutos de leitura

Web scraping is the art of extracting data from the internet and using it for meaningful purposes. It is also sometimes known as web data extraction or web data harvesting. For newbies, it is just the same as copying data from the internet and storing it locally. However, it is a manual process. Web scraping

A Web scraping é a arte de extrair dados da Internet e usá-los para fins significativos. Às vezes, também é conhecida como extração de dados da Web ou coleta de dados da Web. Para os novatos, é o mesmo que copiar dados da Internet e armazená-los localmente. No entanto, esse é um processo manual. O site scraping é um processo automatizado que funciona com a ajuda de rastreadores da Web. Os rastreadores da Web se conectam à Internet usando o protocolo HTTP e permitem que o usuário busque dados de forma automatizada. Pode-se considerar a Internet como um solo enriquecido e os dados como o novo petróleo, enquanto a Web scraping é a técnica para extrair esse petróleo.

A capacidade de scrape e analisar os dados da Internet tornou-se uma técnica essencial, seja você um cientista de dados, engenheiro ou profissional de marketing. Pode haver vários casos de uso em que a Web scraping pode ser de grande ajuda. Neste artigo, vamos scrape dados da Amazon usando Python. Por fim, também analisaremos os dados extraídos e veremos como eles são importantes para qualquer pessoa normal, cientista de dados ou pessoa que administre uma loja de comércio eletrônico.

Apenas uma pequena precaução: Se você é novo no Python e na Web scraping, este artigo pode ser um pouco mais difícil de entender. Sugiro que você leia os artigos de nível introdutório em ProxyScrape e, em seguida, este.

Vamos começar com o código.

Importação de bibliotecas

Em primeiro lugar, importaremos todas as bibliotecas necessárias para o código. Essas bibliotecas serão usadas para scraping e visualizar dados. Se quiser saber os detalhes de cada uma delas, visite a documentação oficial.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
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 requests

Scraping Dados da Amazon

Agora vamos acessar scrape as informações úteis dos livros mais vendidos da Amazon. O URL para o qual estamos indo é scrape :

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

Como precisamos acessar todas as páginas, faremos um loop em cada página para obter o conjunto de dados necessário. 

Para se conectar ao URL e buscar o conteúdo HTML, é necessário o seguinte,

  • get_data: essa função será usada para inserir o número da página como argumento.
  • user-agent: ajudará a contornar a detecção.
  • Especificaremos o URL para request.get e passaremos o agente do usuário como um argumento.
  • Extraindo o conteúdo de requests.get.
  • Scrape a página especificada e a atribui à variável soup.

Algumas das tags importantes sob as quais nossos dados importantes residirão são,

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

Se você inspecionar a página fornecida, verá a tag pai e seus elementos correspondentes.

 Se quiser inspecionar um atributo específico, vá até cada um deles e inspecione-os. Você encontrará alguns atributos importantes para o autor, nome do livro, classificação, preço e clientes avaliados. 

Em nosso código, usaremos instruções if-else aninhadas para aplicar descobertas extras para os autores que não estão registrados 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

Isso executará as seguintes funções,

  • Colete os dados em um loop for.
  • O loop itera sobre cada página, começando de 1 a página+1.
  • Primeiro, precisamos achatar a lista e depois passá-la para o DataFrame.
  • Finalmente, salvaremos o dataframe como um arquivo 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')

Leitura do arquivo CSV

Agora, carregaremos o arquivo csv,

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

O formato do dataframe mostra que há 100 linhas e 5 colunas no arquivo CSV.

Vamos ver as 5 linhas do conjunto de dados,

df.head(61)

Agora faremos um pré-processamento nas colunas ratings, customers_rated e price.

  • Como as classificações são de 5, removeremos a parte extra.
  • Removeremos as vírgulas da coluna customer_rated.
  • Na coluna de preço, removeremos o símbolo de rúpias e o dividiremos por ponto.
  • Por fim, converteremos todas 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["Price"] = df["Price"].str.replace('₹', '')
df["Price"] = df["Price"].str.replace(',', '')
df['Price'] = df['Price'].apply(lambda x: x.split('.')[0])
df['Price'] = df['Price'].astype(int)
df["Customers_Rated"] = df["Customers_Rated"].str.replace(',', '')
df['Customers_Rated'] = pd.to_numeric(df['Customers_Rated'], errors='ignore')
df.head()

Se dermos uma olhada nos tipos de dataframe, teremos,

Há algumas informações incompletas no resultado acima. Primeiro, contaremos o número de NaNs e depois os eliminaremos.

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()

Livros de autores com os preços mais altos

Agora conheceremos todos os autores com o livro de preço mais alto. Vamos nos familiarizar com os 20 principais deles.

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

Livros mais bem avaliados

Agora veremos os livros e autores mais bem avaliados com relação à avaliação dos clientes. Filtraremos os autores e livros com menos de 1.000 avaliações, para obtermos os autores mais famosos.

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

Vamos visualizar os livros mais bem avaliados,

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 = None
p.y_range.start = 0
p.xaxis.major_label_orientation = math.pi/2
show(p)

Autores e livros mais bem avaliados pelos clientes

Quanto maior o número de classificações, maior a confiança do cliente. Portanto, será mais convincente e confiável se adicionarmos os autores e livros mais bem avaliados 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 usadas em gráficos
colors = itertools.cycle(palette)
 
paleta = d3['Categoria20'][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 = 'CUSTOMERS RATED' (classificação dos clientes)
p.legend.location = 'top_left'
 
mostrar(p)

Concluindo

Neste artigo, vimos o que é a Web scraping usando um caso de uso 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 é de nível avançado e pode ser difícil de entender para pessoas que não conhecem a Web scraping e a visualização de dados. Para elas, sugiro que consultem os artigos do pacote inicial disponíveis em ProxyScrape. A Web scraping é uma técnica muito útil que pode impulsionar seus negócios. Há também algumas ferramentas pagas incríveis disponíveis no mercado, mas por que pagá-las se você pode codificar seu próprio raspador? O código que escrevemos acima pode não funcionar para todas as páginas da Web porque a estrutura da página pode ser diferente. Mas, se você entendeu os conceitos acima, não haverá obstáculos para scrape qualquer página da Web modificando o código de acordo com sua estrutura. Espero que este artigo tenha sido interessante para os leitores. Isso é tudo. Vejo vocês nos próximos!