Скрапинг отзывов на Amazon с использованием Python

Комментарии: 0

Скрапинг отзывов на Amazon является ценным инструментом для их верификации, анализа конкурентов и исследования рынка. В этом руководстве рассмотрено, как эффективно извлекать отзывы о товарах, используя Python вместе с библиотеками BeautifulSoup и Requests.

Шаг 1. Установка необходимых библиотек

Перед началом процесса скрапинга убедитесь, что у вас установлены необходимые библиотеки Python:


pip install requests
pip install beautifulsoup4

Шаг 2. Настройка процесса скрапинга

Мы сосредоточимся на извлечении отзывов о товарах со страницы Amazon и  пошагово рассмотрим каждый этап процесса скрапинга.

Понимание структуры веб-сайта

Изучите HTML-структуру страницы отзывов, чтобы определить элементы, которые необходимо скрапить: никнеймы рецензентов, оценки и комментарии.

Название товара и его URL:

1.png

Общая оценка:

2.png

Раздел отзывов:

3.png

Имя автора:

4.png

Оценка:

5.png

Комментарий:

6.png

Отправка HTTP-запросов

Используйте библиотеку Requests для отправки HTTP GET-запросов на страницу отзывов. Настройте заголовки, чтобы имитировать поведение реального браузера и избежать обнаружения. Использование прокси и детально настроенных заголовков необходимо, чтобы Amazon не ограничил доступ.

Прокси

Применение прокси позволяет ротировать IP-адреса, что помогает избежать блокировок по IP и ограничений на количество запросов от Amazon. Это особенно важно для масштабного скрапинга, чтобы поддерживать анонимность и предотвращать обнаружение.

Заголовки запроса

Добавление различных заголовков, таких как Accept-Encoding, Accept-Language, Referer, Connection и Upgrade-Insecure-Requests, создает видимость реального браузерного запроса, снижая вероятность того, антиботовые фильтры заблокируют запросы.


import requests

url = "URL-адрес HTTPS"

# Пример прокси с авторизацией по IP
proxy = {
    'http': 'http://your_proxy_ip:your_proxy_port',
    'https': 'https://your_proxy_ip:your_proxy_port'
}

headers = {
    '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',
    'accept-language': 'en-US,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
    'sec-ch-ua-mobile': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# Отправка HTTP GET-запроса на URL с заголовками и прокси
try:
    response = requests.get(url, headers=headers, proxies=proxy, timeout=10)
    response.raise_for_status()  # Установка исключения при плохом статусе ответа
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")

Шаг 3. Извлечение информации о товаре с использованием BeautifulSoup

Используя библиотеку BeautifulSoup, вы можете анализировать HTML-контент, полученный в ответ на ваши запросы, для извлечения важных сведений о товарах. Процесс включает парсинг таких данных, как URL страницы товара, его название и общий рейтинг.


from bs4 import BeautifulSoup

soup = BeautifulSoup(response.content, 'html.parser')

# Извлечение общих сведений о товаре
product_url = soup.find('a', {'data-hook': 'product-link'}).get('href', '')
product_title = soup.find('a', {'data-hook': 'product-link'}).get_text(strip=True)
total_rating = soup.find('span', {'data-hook': 'rating-out-of-text'}).get_text(strip=True)

Шаг 4. Извлечение отзывов с использованием BeautifulSoup

Продолжите парсинг HTML-содержимого для извлечения никнеймов рецензентов, оценок и их комментариев на основе определенных выражений XPath.


reviews = []
review_elements = soup.find_all('div', {'data-hook': 'review'})
for review in review_elements:
    author_name = review.find('span', class_='a-profile-name').get_text(strip=True)
    rating_given = review.find('i', class_='review-rating').get_text(strip=True)
    comment = review.find('span', class_='review-text').get_text(strip=True)

    reviews.append({
        'Product URL': product_url,
        'Product Title': product_title,
        'Total Rating': total_rating,
        'Author': author_name,
        'Rating': rating_given,
        'Comment': comment,
    })

Шаг 5. Сохранение данных в CSV-файл

Используйте встроенный в Python модуль CSV для сохранения извлеченных данных в CSV-файл для дальнейшего анализа.


import csv

# Определение пути к CSV-файлу
csv_file = 'amazon_reviews.csv'

# Определение названий полей для CSV
fieldnames = ['Product URL', 'Product Title', 'Total Rating', 'Author', 'Rating', 'Comment']

# Запись данных в CSV-файл
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()
    for review in reviews:
        writer.writerow(review)

print(f"Data saved to {csv_file}")

Полный код

Ниже представлен полный код для скрапинга данных об отзывах на Amazon и сохранения их в файл CSV:


import requests
from bs4 import BeautifulSoup
import csv
import urllib3

urllib3.disable_warnings()

# URL страницы отзывов товара на Amazon
url = "https://www.amazon.com/Portable-Mechanical-Keyboard-MageGee-Backlit/product-reviews/B098LG3N6R/ref=cm_cr_dp_d_show_all_btm?ie=UTF8&reviewerType=all_reviews"

# Настройка прокси с авторизацией по IP
path_proxy = 'your_proxy_ip:your_proxy_port'
proxy = {
   'http': f'http://{path_proxy}',
   'https': f'https://{path_proxy}'
}

# Заголовки для HTTP-запроса
headers = {
   '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',
   'accept-language': 'en-US,en;q=0.9',
   'cache-control': 'no-cache',
   'dnt': '1',
   'pragma': 'no-cache',
   'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
   'sec-ch-ua-mobile': '?0',
   'sec-fetch-dest': 'document',
   'sec-fetch-mode': 'navigate',
   'sec-fetch-site': 'same-origin',
   'sec-fetch-user': '?1',
   'upgrade-insecure-requests': '1',
   'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# Отправка HTTP GET-запроса на URL с заголовками и обработка исключений
try:
   response = requests.get(url, headers=headers, timeout=10, proxies=proxy, verify=False)
   response.raise_for_status()  # Разбор HTML-содержимого с помощью BeautifulSoup
except requests.exceptions.RequestException as e:
   print(f"Error: {e}")

# Разбор HTML-содержимого с помощью BeautifulSoup
soup = BeautifulSoup(response.content, 'html.parser')

# Извлечение общих сведений о товаре
product_url = soup.find('a', {'data-hook': 'product-link'}).get('href', '')  # Извлечение URL товара
product_title = soup.find('a', {'data-hook': 'product-link'}).get_text(strip=True)  # Извлечение наименования товара
total_rating = soup.find('span', {'data-hook': 'rating-out-of-text'}).get_text(strip=True)  # Извлечение общего рейтинга

# Извлечение отдельных отзывов
reviews = []
review_elements = soup.find_all('div', {'data-hook': 'review'})
for review in review_elements:
   author_name = review.find('span', class_='a-profile-name').get_text(strip=True)  # Извлечение никнейма автора
   rating_given = review.find('i', class_='review-rating').get_text(strip=True)  # Извлечение оценки
   comment = review.find('span', class_='review-text').get_text(strip=True)  # Извлечение текста отзыва

   # Сохранение каждого отзыва в словаре
   reviews.append({
       'Product URL': product_url,
       'Product Title': product_title,
       'Total Rating': total_rating,
       'Author': author_name,
       'Rating': rating_given,
       'Comment': comment,
   })

# Определение пути к файлу CSV
csv_file = 'amazon_reviews.csv'

# Определение названий полей для CSV
fieldnames = ['Product URL', 'Product Title', 'Total Rating', 'Author', 'Rating', 'Comment']

# Запись данных в файл CSV
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
   writer = csv.DictWriter(file, fieldnames=fieldnames)
   writer.writeheader()
   for review in reviews:
       writer.writerow(review)

# Вывод сообщения о подтверждении
print(f"Data saved to {csv_file}")

В заключении отметим, что наиболее важным этапом в написании скрипта является выбор надежных прокси-серверов, которые обеспечат обход блокировок и защиту от срабатывания антибот фильтров. Наиболее оптимальным вариантом для скрапинга считаются резидентские прокси-серверы, обладающие высоким траст-фактором и динамическими IP-адресами, а также статические ISP прокси, которые обеспечивают высокую скорость и стабильность работы.

Комментарии:

0 комментариев