темный логотип proxyscrape

Как сделать веб-сканер Amazon с помощью Python

Python, Скрапинг, Май-03-20215 минут чтения

Веб-скреппинг - это искусство извлечения данных из интернета и их использования в значимых целях. Иногда его также называют извлечением данных из Интернета или сбором данных в Интернете. Для новичков это то же самое, что копировать данные из интернета и сохранять их локально. Однако это ручной процесс. Веб-скраппинг - это автоматизированный процесс, который осуществляется с помощью веб-краулеров. Веб-краулеры подключаются к интернету по протоколу HTTP и позволяют пользователю получать данные в автоматическом режиме. Можно рассматривать интернет как обогащенную почву, а данные - как новую нефть, в то время как веб-скрепинг - это техника, позволяющая добывать эту нефть.

Умение собирать и анализировать данные из Интернета стало неотъемлемой техникой, независимо от того, являетесь ли вы специалистом по изучению данных, инженером или маркетологом. Существуют различные сценарии использования, в которых веб-скраппинг может оказать огромную помощь. В этой статье мы будем собирать данные с Amazon с помощью Python. Наконец, мы проанализируем полученные данные и поймем, насколько они важны для любого обычного человека, специалиста по анализу данных или человека, управляющего магазином электронной коммерции.

Небольшое предостережение: Если вы новичок в Python и веб-скреппинге, эта статья может оказаться для вас немного сложнее для понимания. Я бы посоветовал ознакомиться с вводными статьями на сайте ProxyScrape а затем перейти к этой.

Давайте приступим к работе с кодом.

Импорт библиотек

Прежде всего, мы импортируем все необходимые библиотеки, требуемые для работы с кодом. Эти библиотеки будут использоваться для соскабливания и визуализации данных. Если вы хотите узнать подробности о каждой из них, вы можете посетить их официальную документацию.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
импортировать re
импортировать время
from datetime import datetime
import matplotlib.dates as mdates
import matplotlib.ticker as ticker
from urllib.request import urlopen
from bs4 import BeautifulSoup
импортировать запросы

Поиск данных Amazon

Теперь мы извлечем полезную информацию из книг-бестселлеров Amazon. URL-адрес, по которому мы будем считывать информацию, следующий:

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

Поскольку нам нужно получить доступ ко всем страницам, мы пройдем по каждой из них, чтобы получить необходимый набор данных. 

Для подключения к URL-адресу и получения HTML-содержимого необходимо следующее,

  • get_data: эта функция будет использоваться для ввода номера страницы в качестве аргумента.
  • user-agent: это поможет обойти обнаружение.
  • Мы укажем URL в request.get и передадим user-agent в качестве аргумента.
  • Извлечение содержимого из requests.get.
  • Соскребите указанную страницу и присвойте ее переменной soup.

Вот некоторые из важных тегов, под которыми будут храниться наши важные данные,

  • Название книги
  • Автор
  • Рейтинг
  • Клиенты оценили
  • Цена

Если вы осмотрите данную страницу, то увидите родительский тег и соответствующие ему элементы.

 Если вы хотите проверить конкретный атрибут, перейдите к каждому из них и проверьте его. Вы найдете несколько важных атрибутов для автора, названия книги, рейтинга, цены, оценки покупателей. 

В нашем коде мы будем использовать вложенные операторы if-else, чтобы применить дополнительные выводы для тех авторов, которые не зарегистрированы на 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

Он будет выполнять следующие функции,

  • Соберите данные в цикле for.
  • В цикле будет выполняться итерация по каждой странице, начиная с 1 и заканчивая page+1.
  • Сначала нам нужно сгладить список, а затем передать его в DataFrame.
  • В завершение мы сохраним кадр данных в 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')

Чтение файла CSV

Теперь мы загрузим файл csv,

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

Форма рамки данных показывает, что в CSV-файле 100 строк и 5 столбцов.

Рассмотрим 5 строк набора данных,

df.head(61)

Теперь мы выполним некоторую предварительную обработку столбцов ratings, customers_rated и price.

  • Так как оценка составляет 5 баллов, мы уберем из нее лишнюю часть.
  • Мы удалим запятые из столбца customer_rated.
  • В столбце цены мы удалим символ рупии и разделим его точкой.
  • Наконец, мы преобразуем все три столбца в целое число или в число с плавающей запятой.

df['Рейтинг'] = df['Рейтинг'].apply(lambda x: x.split()[0])
df['Рейтинг'] = pd.to_numeric(df['Рейтинг'])
df["Цена"] = df["Цена"].str.replace('₹', '')
df["Цена"] = df["Цена"].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()

Если мы посмотрим на типы фреймов данных, то получим,

В приведенном выше выводе есть неполная информация. Сначала мы подсчитаем количество NaN, а затем отбросим их.

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

Самые дорогие книги авторов

Сейчас мы познакомимся со всеми авторами, чьи книги имеют самую высокую цену. Мы познакомимся с 20 лучшими из них.

data = data.sort_values(['Рейтинг'],axis=0, ascending=False)[:15]
данные

Самые рейтинговые книги

Теперь мы увидим книги и авторов с самым высоким рейтингом по отношению к рейтингу покупателей. Мы отфильтруем авторов и книги с менее чем 1000 рецензий, чтобы получить самых известных авторов.

data = df[df['Customers_Rated'] > 1000]
data = data.sort_values(['Рейтинг'],axis=0, ascending=False)[:15]
данные

Давайте представим себе книги, занимающие первые места в рейтинге,

p = figure(x_range=data.iloc[:,0], plot_width=800, plot_height=600, title="Лучшие книги с рейтингом более 1000 покупателей", 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
показать(p)

Авторы и книги, получившие наибольшее количество оценок покупателей

Чем больше оценок, тем выше доверие покупателей. Поэтому будет более убедительно и достоверно, если мы добавим авторов и книги, которые наиболее высоко оцениваются покупателями.

из bokeh.transform import factor_cmap
from bokeh.models import Legend
из bokeh.palettes import Dark2_5 as palette
import itertools
from bokeh.palettes import d3
#colors содержит список цветов, которые могут быть использованы в графиках
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 = "Лучшие авторы: Рейтинг по сравнению с оценками клиентов")
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'
p.legend.location = 'top_left'
 
показать(p)

Подведение итогов

В этой статье мы рассмотрели, что такое веб-скрепинг, на примере очень важного случая извлечения данных из Amazon. Мы не только извлекли данные с различных страниц Amazon, но и визуализировали их с помощью различных библиотек Python. Эта статья была написана на продвинутом уровне и может быть сложна для понимания людям, которые впервые сталкиваются с веб-скреппингом и визуализацией данных. Для них я бы посоветовал обратиться к статьям стартового пакета, доступным на сайте ProxyScrape. Веб-скреппинг - это очень полезная техника, которая может дать толчок вашему бизнесу. На рынке также есть несколько замечательных платных инструментов, но зачем платить, если можно написать свой собственный скребок. Код, который мы написали выше, может не подойти для каждой веб-страницы, потому что структура страницы может отличаться. Но если вы поняли вышеизложенные концепции, то для вас не будет никаких препятствий, чтобы скрести любую веб-страницу, изменив код в соответствии с ее структурой. Надеюсь, эта статья была интересна читателям. На этом все. Увидимся в следующих!