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

Сегодня многие политические партии разрабатывают свои предвыборные кампании на основе общественных настроений, выраженных в разделе комментариев на YouTube, в Instagram или Twitter. Они могут определять актуальные темы и даже выявлять возникающие проблемы.

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

В этой статье мы собираемся собрать отзывы о продукте с Amazon. Проанализируем, радостные отзывы или грустные.

Настройка предварительных условий для парсинга eBay

Надеюсь, вы уже установили Python 3.x на свой компьютер, а если нет, то установите его отсюда. Нам также потребуются 3 сторонние библиотеки Python.

  • Запросы — с помощью этой библиотеки мы установим HTTP-соединение со страницей Amazon. Эта библиотека поможет нам извлечь необработанный HTML-код с целевой страницы.
  • BeautifulSoup — это мощная библиотека для анализа данных. Используя это, мы будем извлекать необходимые данные из необработанного HTML, который мы получаем с помощью библиотеки запросов.
  • vaderSentiment — VADER, также известный как Valence Aware Dictionary и Sentiment Reasoner, представляет собой анализатор настроений, основанный на правилах, который прошел обучение с использованием текстовых данных из социальных сетей.

Прежде чем мы установим эти библиотеки, нам нужно будет создать специальную папку для нашего проекта. Здесь мы будем хранить наш скрипт Python.

mkdir amazonscraper

Теперь внутри этой папки мы можем установить вышеупомянутые библиотеки.

pip install beautifulsoup4
pip install requests
pip install vaderSentiment

Создайте файл Python внутри этой папки, где мы будем писать код. Я называю этот файл sentiment.py.

Загрузка html-данных с amazon.com

Самым первым шагом будет сделать запрос GET на целевую страницу. Для этого урока мы будем использовать эту страницу с Amazon.

Чтобы сделать запрос GET, мы собираемся использовать библиотеку Python requests.

import requests
from bs4 import BeautifulSoup
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer

target_url = 'https://www.amazon.com/Apple-MacBook-Laptop-12%E2%80%91core-19%E2%80%91core/product-reviews/B0BSHF7WHW/ref=cm_cr_dp_d_show_all_btm'
headers={"accept-language": "en-US,en;q=0.9","accept-encoding": "gzip, deflate, br","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36","accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"}
resp = requests.get(target_url, verify=False, headers=headers)

print(resp.status_code)

print(resp.content)

Как только вы запустите этот код, ответ будет выглядеть так.

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

Что мы собираемся собрать с Amazon?

Всегда здорово заранее решить, что именно нам нужно от страницы. На этой странице мы собираемся разобрать все 10 отзывов.

Давайте разберем эти отзывы с помощью BeautifulSoup.

Текст каждого отзыва хранится внутри тега span с именем атрибута data-hook и значением review-body.

И все эти теги span хранятся внутри тега div с содержимым отзывов о классе.

Это можно легко проанализировать, проверив его в chrome devtools.

import requests
from bs4 import BeautifulSoup
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
l=[]
o={}
target_url = 'https://www.amazon.com/Apple-MacBook-Laptop-12%E2%80%91core-19%E2%80%91core/product-reviews/B0BSHF7WHW/ref=cm_cr_dp_d_show_all_btm'
headers={"accept-language": "en-US,en;q=0.9","accept-encoding": "gzip, deflate, br","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36","accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"}
resp = requests.get(target_url, verify=False, headers=headers)

soup = BeautifulSoup(resp.text, 'html.parser')

fulldivcontainer = soup.find_all("div",{"class":"reviews-content"})[1]

reviewdata = fulldivcontainer.find_all("span",{"data-hook":"review-body"})

for i in range(0,len(reviewdata)):
    o["review{}".format(i+1)]=reviewdata[i].text


l.append(o)

print(l)

Позвольте мне объяснить этот код, разбив его для вас.

  1. Код импортирует необходимые библиотеки:
  • requests для отправки HTTP-запросов на целевой URL.
  • BeautifulSoup для разбора HTML и извлечения из него данных.
  • SentimentIntensityAnalyzer из vaderSentiment.vaderSentiment для анализа настроений.

2. Определены две пустые структуры данных:

  • l — пустой список.
  • o — пустой словарь.

3. Переменная target_url содержит URL-адрес страницы отзывов о продуктах Amazon, которая будет очищена.

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

5. Код отправляет запрос GET на указанный target_url с помощью requests.get(). Ответ сохраняется в переменной resp.

6. Содержимое ответа анализируется с использованием BeautifulSoup с парсером HTML, указанным как 'html.parser'. Результат анализа сохраняется в переменной soup.

7. Код находит определенные элементы div с именем класса "reviews-content" в проанализированном HTML, используя soup.find_all(). Индекс [1] используется для выбора второго совпадающего элемента, поскольку требуемые обзоры содержатся в этом конкретном элементе div. Результат сохраняется в переменной fulldivcontainer.

8. В пределах fulldivcontainer код находит все элементы span с атрибутом data-hook, установленным на "review-body", используя fulldivcontainer.find_all(). Извлеченные элементы обзора сохраняются в переменной reviewdata.

9. Настроен цикл для перебора reviewdata элементов. Для каждого элемента содержимое обзора извлекается с использованием reviewdata[i].text. Содержание обзора присваивается как значение словарю o с ключом в формате "review{}".format(i+1).

10. Словарь o добавляется к списку l.

11. Наконец, код выводит список l, который содержит все извлеченные данные обзора в виде словарей.

Давайте проведем анализ настроений каждого отзыва

Наконец, пришло время использовать библиотеку vaderSentiment.

Вы можете начать его, сначала создав объект класса SentimentIntensityAnalyzer. Затем мы можем передать каждый отзыв в функцию polarity_scores() объекта.

sentiment = SentimentIntensityAnalyzer()
for x in range(0,10):
    sent = sentiment.polarity_scores(l[0]["review{}".format(x+1)])
    print("Sentiment of review {}".format(x+1))
    print(sent)
  1. Код инициализирует экземпляр класса SentimentIntensityAnalyzer из модуля vaderSentiment.vaderSentiment. Этот анализатор отвечает за определение интенсивности тональности текста.
  2. Цикл настроен на повторение от 0 до 9 (включительно) с использованием функции диапазона range(0, 10). Это означает, что цикл будет выполняться 10 раз (у нас всего 10 обзоров).
  3. На каждой итерации цикла код извлекает текст отзыва из списка l с помощью ключа "review{}".format(x+1). x+1 гарантирует, что ключи обзора начинаются с 1, а не с 0.
  4. Метод sentiment.polarity_scores() вызывается для текста отзыва, который возвращает словарь, содержащий оценки тональности. Объект sentiment является экземпляром SentimentIntensityAnalyzer, инициализированным ранее.
  5. Словарь оценок настроений назначается переменной sent.
  6. Затем код выводит результаты анализа настроений для каждого отзыва. Он отображает оценку тональности для соответствующего обзора, используя метод форматирования для включения номера рецензии (x+1), и распечатывает оценки тональности (sent).
  7. Этот процесс повторяется для каждого отзыва, предоставляя результаты анализа тональности для всех 10 отзывов.

Как только вы запустите код, вы получите это.

  • 'neg': это показатель отрицательности для данного текста.
  • 'neu': это показатель нейтральности для данного текста.
  • 'pos': это показатель положительности данного текста.
  • 'compound': Представляет собой составной балл, представляющий собой комбинацию трех вышеперечисленных баллов. Он представляет собой общую полярность настроения текста.

Из этих 10 отзывов мы видим, что два отзыва имеют отрицательные составные значения, которые указывают на то, что обзор 3 и обзор 9 оба являются отрицательными, а остальные слегка положительными или положительными.

Полный код

import requests
from bs4 import BeautifulSoup
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
l=[]
o={}
target_url = 'https://www.amazon.com/Apple-MacBook-Laptop-12%E2%80%91core-19%E2%80%91core/product-reviews/B0BSHF7WHW/ref=cm_cr_dp_d_show_all_btm'
headers={"accept-language": "en-US,en;q=0.9","accept-encoding": "gzip, deflate, br","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36","accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"}
resp = requests.get(target_url, verify=False, headers=headers)

soup = BeautifulSoup(resp.text, 'html.parser')

fulldivcontainer = soup.find_all("div",{"class":"reviews-content"})[1]

reviewdata = fulldivcontainer.find_all("span",{"data-hook":"review-body"})

for i in range(0,len(reviewdata)):
    o["review{}".format(i+1)]=reviewdata[i].text



l.append(o)
sentiment = SentimentIntensityAnalyzer()
for x in range(0,10):
    sent = sentiment.polarity_scores(l[0]["review{}".format(x+1)])
    print("Sentiment of review {}".format(x+1))
    print(sent)

Заключение

В этом уроке мы увидели, как можно собирать и анализировать данные. С различными пакетами Python эта задача решалась легко.

В условиях растущей экономики для компаний становится очень важным отслеживать свои обзоры. Одна небольшая ошибка может испортить их имидж.

Я надеюсь, вам понравится этот небольшой блог, и если да, то не забудьте поделиться этим блогом в своей социальной учетной записи. Вы можете подписаться на нас в Твиттере, чтобы узнать больше такого замечательного контента. А пока счастливого кодирования😀!