Поиск по сайту:

Как получить информацию о продукте Amazon с помощью Beautiful Soup


Web Scraping — это метод, основанный на программировании, для извлечения соответствующей информации с веб-сайтов и ее сохранения в локальной системе для дальнейшего использования.

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

В этой статье мы будем собирать информацию о продуктах с веб-сайтов Amazon. Соответственно, в качестве целевого продукта мы будем рассматривать «Playstation 4».

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

Веб-сервисы парсинга

Если вы хотите создать сервис с использованием веб-скрапинга, вам, возможно, придется пройти блокировку IP-адресов, а также управление прокси-сервером. Хорошо знать базовые технологии и процессы, но для массового парсинга лучше работать с поставщиками парсинга API, такими как резидентный прокси-сервис.

Некоторые основные требования:

Чтобы приготовить суп, нам нужны правильные ингредиенты. Точно так же наш свежий парсер требует определенных компонентов.

  • Python. Простота использования и обширная коллекция библиотек делают Python номер-идентификатором для парсинга веб-сайтов. Однако, если у пользователя он не установлен предварительно, см. здесь.
  • Beautiful Soup — одна из многих библиотек веб-скрейпинга для Python. Простое и чистое использование библиотеки делает ее главным претендентом на веб-скрапинг. После успешной установки Python пользователь может установить Beautiful Soup следующим образом:

pip install bs4

  • Основные сведения о HTML-тегах. Обратитесь к этому руководству, чтобы получить необходимую информацию о HTML-тегах.
  • Веб-браузер. Поскольку с веб-сайта приходится удалять много ненужной информации, для фильтрации нам нужны определенные идентификаторы и теги. Таким образом, такие веб-браузеры, как Google Chrome или Mozilla Firefox, служат для обнаружения этих тегов.

Создание пользовательского агента

Многие веб-сайты имеют определенные протоколы для блокировки доступа роботов к данным. Следовательно, чтобы извлечь данные из скрипта, нам нужно создать User-Agent. User-Agent — это в основном строка, которая сообщает серверу о типе хоста, отправляющего запрос.

Этот веб-сайт содержит множество пользовательских агентов, из которых читатель может выбирать. Ниже приведен пример User-Agent в значении заголовка.

HEADERS = ({'User-Agent':
            'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36',
            'Accept-Language': 'en-US, en;q=0.5'})

В HEADERS есть дополнительное поле под названием «Accept-Language», которое при необходимости переводит веб-страницу на английский-США.

Отправка запроса на URL

Доступ к веб-странице осуществляется по ее URL-адресу (унифицированный указатель ресурсов). С помощью URL-адреса мы отправим запрос на веб-страницу для доступа к ее данным.

URL = "https://www.amazon.com/Sony-PlayStation-Pro-1TB-Console-4/dp/B07K14XKZH/"
webpage = requests.get(URL, headers=HEADERS)

Запрошенная веб-страница содержит продукт Amazon. Следовательно, наш скрипт Python фокусируется на извлечении сведений о продукте, таких как «Название продукта», «Текущая цена» и т. д.

Примечание. Запрос к URL-адресу отправляется через библиотеку requests. В случае, если пользователь получает сообщение об ошибке «Нет именованных модулей», его можно установить с помощью «запросов на установку pip».

Создание супа информации

Переменная webpage содержит ответ, полученный веб-сайтом. Мы передаем содержимое ответа и тип парсера в функцию Beautiful Soup.

soup = BeautifulSoup(webpage.content, "lxml")

lxml — это высокоскоростной парсер, используемый Beautiful Soup для разбиения HTML-страницы на сложные объекты Python. Как правило, можно получить четыре типа объектов Python:

  • Тег. Соответствует тегам HTML или XML, которые включают имена и атрибуты.
  • NavigableString — соответствует тексту, хранящемуся в теге.
  • BeautifulSoup — фактически весь проанализированный документ.
  • Комментарии. Наконец, остатки HTML-страницы, не вошедшие в три вышеуказанные категории.

Обнаружение точных тегов для извлечения объектов

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

Мы открываем веб-страницу в браузере и проверяем соответствующий элемент, нажав правую кнопку мыши.

В результате в правой части экрана откроется панель, как показано на следующем рисунке.

Как только мы получим значения тегов, извлечение информации станет проще простого. Однако мы должны изучить некоторые функции, определенные для объекта Beautiful Soup.

Извлечение названия продукта

Используя функцию find(), доступную для поиска определенных тегов с определенными атрибутами, мы находим объект тега, содержащий название продукта.

# Outer Tag Object
title = soup.find("span", attrs={"id":'productTitle'})

Затем мы вынимаем объект NavigableString.

# Inner NavigableString Object
title_value = title.string

И, наконец, мы удаляем лишние пробелы и преобразуем объект в строковое значение.

# Title as a string value
title_string = title_value.strip()

Мы можем взглянуть на типы каждой переменной, используя функцию type().

# Printing types of values for efficient understanding
print(type(title))
print(type(title_value))
print(type(title_string))
print()

# Printing Product Title
print("Product Title = ", title_string)

Выход:

<class 'bs4.element.Tag'>
<class 'bs4.element.NavigableString'>
<class 'str'>

Product Title =  Sony PlayStation 4 Pro 1TB Console - Black (PS4 Pro)

Точно так же нам нужно выяснить значения тегов для других сведений о продукте, таких как «Цена продукта» и «Оценки потребителей».

Скрипт Python для извлечения информации о продукте

Следующий скрипт Python отображает следующие сведения о продукте:

  • Название продукта
  • Цена продукта
  • Рейтинг продукта
  • Количество отзывов клиентов
  • Доступность продукта

from bs4 import BeautifulSoup
import requests

# Function to extract Product Title
def get_title(soup):
	
	try:
		# Outer Tag Object
		title = soup.find("span", attrs={"id":'productTitle'})

		# Inner NavigableString Object
		title_value = title.string

		# Title as a string value
		title_string = title_value.strip()

		# # Printing types of values for efficient understanding
		# print(type(title))
		# print(type(title_value))
		# print(type(title_string))
		# print()

	except AttributeError:
		title_string = ""	

	return title_string

# Function to extract Product Price
def get_price(soup):

	try:
		price = soup.find("span", attrs={'id':'priceblock_ourprice'}).string.strip()

	except AttributeError:
		price = ""	

	return price

# Function to extract Product Rating
def get_rating(soup):

	try:
		rating = soup.find("i", attrs={'class':'a-icon a-icon-star a-star-4-5'}).string.strip()
		
	except AttributeError:
		
		try:
			rating = soup.find("span", attrs={'class':'a-icon-alt'}).string.strip()
		except:
			rating = ""	

	return rating

# Function to extract Number of User Reviews
def get_review_count(soup):
	try:
		review_count = soup.find("span", attrs={'id':'acrCustomerReviewText'}).string.strip()
		
	except AttributeError:
		review_count = ""	

	return review_count

# Function to extract Availability Status
def get_availability(soup):
	try:
		available = soup.find("div", attrs={'id':'availability'})
		available = available.find("span").string.strip()

	except AttributeError:
		available = ""	

	return available	

if __name__ == '__main__':

	# Headers for request
	HEADERS = ({'User-Agent':
	            'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36',
	            'Accept-Language': 'en-US, en;q=0.5'})

	# The webpage URL
	URL = "https://www.amazon.com/Sony-PlayStation-Pro-1TB-Console-4/dp/B07K14XKZH/"

	# HTTP Request
	webpage = requests.get(URL, headers=HEADERS)

	# Soup Object containing all data
	soup = BeautifulSoup(webpage.content, "lxml")

	# Function calls to display all necessary product information
	print("Product Title =", get_title(soup))
	print("Product Price =", get_price(soup))
	print("Product Rating =", get_rating(soup))
	print("Number of Product Reviews =", get_review_count(soup))
	print("Availability =", get_availability(soup))
	print()
	print()


Выход:

Product Title = Sony PlayStation 4 Pro 1TB Console - Black (PS4 Pro)
Product Price = $473.99
Product Rating = 4.7 out of 5 stars
Number of Product Reviews = 1,311 ratings
Availability = In Stock.

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

Кроме того, давайте теперь попытаемся получить ссылки с веб-страницы результатов поиска Amazon.

Получение ссылок с веб-страницы результатов поиска Amazon

Ранее мы получили информацию о случайной PlayStation 4. Было бы находчивой идеей извлечь такую информацию для нескольких PlayStation для сравнения цен и рейтингов.

Мы можем найти ссылку, заключенную в тег <\a>, как значение атрибута href.

вместо получения одной ссылки мы можем извлечь все похожие ссылки, используя функцию find_all().

# Fetch links as List of Tag Objects
links = soup.find_all("a", attrs={'class':'a-link-normal s-no-outline'})

Функция find_all() возвращает итерируемый объект, содержащий несколько объектов Tag. В результате мы выбираем каждый объект Tag и извлекаем ссылку, хранящуюся как значение атрибута href.

# Store the links
links_list = []

# Loop for extracting links from Tag Objects
for link in links:
	links_list.append(link.get('href'))

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

# Loop for extracting product details from each link 
	for link in links_list:
		
		new_webpage = requests.get("https://www.amazon.com" + link, headers=HEADERS)
		new_soup = BeautifulSoup(new_webpage.content, "lxml")
		
		print("Product Title =", get_title(new_soup))
		print("Product Price =", get_price(new_soup))
		print("Product Rating =", get_rating(new_soup))
		print("Number of Product Reviews =", get_review_count(new_soup))
		print("Availability =", get_availability(new_soup))

Мы повторно используем созданные ранее функции для извлечения информации о продукте. Несмотря на то, что этот процесс создания нескольких супов делает код медленным, он, в свою очередь, обеспечивает правильное сравнение цен между несколькими моделями и сделками.

Скрипт Python для извлечения сведений о продукте на нескольких веб-страницах

Ниже приведен полный рабочий скрипт Python для перечисления нескольких сделок PlayStation.

from bs4 import BeautifulSoup
import requests

# Function to extract Product Title
def get_title(soup):
	
	try:
		# Outer Tag Object
		title = soup.find("span", attrs={"id":'productTitle'})

		# Inner NavigatableString Object
		title_value = title.string

		# Title as a string value
		title_string = title_value.strip()

		# # Printing types of values for efficient understanding
		# print(type(title))
		# print(type(title_value))
		# print(type(title_string))
		# print()

	except AttributeError:
		title_string = ""	

	return title_string

# Function to extract Product Price
def get_price(soup):

	try:
		price = soup.find("span", attrs={'id':'priceblock_ourprice'}).string.strip()

	except AttributeError:

		try:
			# If there is some deal price
			price = soup.find("span", attrs={'id':'priceblock_dealprice'}).string.strip()

		except:		
			price = ""	

	return price

# Function to extract Product Rating
def get_rating(soup):

	try:
		rating = soup.find("i", attrs={'class':'a-icon a-icon-star a-star-4-5'}).string.strip()
		
	except AttributeError:
		
		try:
			rating = soup.find("span", attrs={'class':'a-icon-alt'}).string.strip()
		except:
			rating = ""	

	return rating

# Function to extract Number of User Reviews
def get_review_count(soup):
	try:
		review_count = soup.find("span", attrs={'id':'acrCustomerReviewText'}).string.strip()
		
	except AttributeError:
		review_count = ""	

	return review_count

# Function to extract Availability Status
def get_availability(soup):
	try:
		available = soup.find("div", attrs={'id':'availability'})
		available = available.find("span").string.strip()

	except AttributeError:
		available = "Not Available"	

	return available	


if __name__ == '__main__':

	# Headers for request
	HEADERS = ({'User-Agent':
	            'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36',
	            'Accept-Language': 'en-US'})

	# The webpage URL
	URL = "https://www.amazon.com/s?k=playstation+4&ref=nb_sb_noss_2"
	
	# HTTP Request
	webpage = requests.get(URL, headers=HEADERS)

	# Soup Object containing all data
	soup = BeautifulSoup(webpage.content, "lxml")

	# Fetch links as List of Tag Objects
	links = soup.find_all("a", attrs={'class':'a-link-normal s-no-outline'})

	# Store the links
	links_list = []

	# Loop for extracting links from Tag Objects
	for link in links:
		links_list.append(link.get('href'))


	# Loop for extracting product details from each link 
	for link in links_list:

		new_webpage = requests.get("https://www.amazon.com" + link, headers=HEADERS)

		new_soup = BeautifulSoup(new_webpage.content, "lxml")
		
		# Function calls to display all necessary product information
		print("Product Title =", get_title(new_soup))
		print("Product Price =", get_price(new_soup))
		print("Product Rating =", get_rating(new_soup))
		print("Number of Product Reviews =", get_review_count(new_soup))
		print("Availability =", get_availability(new_soup))
		print()
		print()

Выход:

Product Title = SONY PlayStation 4 Slim 1TB Console, Light & Slim PS4 System, 1TB Hard Drive, All the Greatest Games, TV, Music & More
Product Price = $357.00
Product Rating = 4.4 out of 5 stars
Number of Product Reviews = 32 ratings
Availability = In stock on September 8, 2020.


Product Title = Newest Sony PlayStation 4 PS4 1TB HDD Gaming Console Bundle with Three Games: The Last of Us, God of War, Horizon Zero Dawn, Included Dualshock 4 Wireless Controller
Product Price = $469.00
Product Rating = 4.6 out of 5 stars
Number of Product Reviews = 211 ratings
Availability = Only 14 left in stock - order soon.


Product Title = PlayStation 4 Slim 1TB Console - Fortnite Bundle
Product Price = 
Product Rating = 4.8 out of 5 stars
Number of Product Reviews = 2,715 ratings
Availability = Not Available


Product Title = PlayStation 4 Slim 1TB Console - Only On PlayStation Bundle
Product Price = $444.00
Product Rating = 4.7 out of 5 stars
Number of Product Reviews = 5,190 ratings
Availability = Only 1 left in stock - order soon.

Приведенный выше скрипт Python не ограничивается списком PlayStation. Мы можем переключить URL-адрес на какую-либо другую ссылку на результат поиска Amazon, например на наушники или наушники.

Как упоминалось ранее, макет и теги HTML-страницы могут со временем меняться, что делает приведенный выше код бесполезным в этом отношении. Тем не менее, читатель должен вернуться домой с концепцией парсинга веб-страниц и методами, изученными в этой статье.

Заключение

У веб-скрейпинга могут быть различные преимущества, начиная от «сравнения цен на товары» и заканчивая «анализом потребительских тенденций». Поскольку Интернет доступен для всех, а Python — очень простой язык, любой может выполнить веб-скрейпинг для удовлетворения своих потребностей.

Мы надеемся, что эта статья была легкой для понимания. Не стесняйтесь комментировать ниже любые вопросы или отзывы. До тех пор, счастливого соскабливания!!!.