CoderCastrov logo
CoderCastrov
Парсер

Анализ настроений с использованием Python

Анализ настроений с использованием Python
просмотров
5 мин чтение
#Парсер

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

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

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

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

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

Я надеюсь, что вы уже установили Python 3.x на своем компьютере, и если нет, то пожалуйста, установите его отсюда (https://www.python.org/downloads/). Нам также понадобятся 3 сторонние библиотеки Python.

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

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

mkdir amazonscraper

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

pip install beautifulsoup4
pip install requests
pip install vaderSentiment

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

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

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

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

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 с классом reviews-content.

Это можно легко проанализировать, используя инструменты разработчика Chrome.

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)

Давайте разберем этот код, разбив его на части.

  • requests для отправки HTTP-запросов на целевой URL.
  • BeautifulSoup для разбора HTML и извлечения данных из него.
  • SentimentIntensityAnalyzer из vaderSentiment.vaderSentiment для анализа тональности.
  1. Определены две пустые структуры данных:
  • l - пустой список.
  • o - пустой словарь.
  1. Переменная target_url содержит URL страницы отзывов о продукте на Amazon, которую мы собираемся парсить.

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

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

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

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

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

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

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

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

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

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

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

sentiment = SentimentIntensityAnalyzer()
for x in range(0,10):
    sent = sentiment.polarity_scores(l[0]["review{}".format(x+1)])
    print("Тональность отзыва {}".format(x+1))
    print(sent)

После выполнения кода вы получите следующий результат.

  • '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("Настроение отзыва {}".format(x+1))
    print(sent)

Заключение

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

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

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