Guía para scrapear reseñas de Amazon usando Python

Comentarios: 0

El scraping de reseñas de Amazon con Python puede ser útil, ya sea para analizar a la competencia, comprobar lo que dicen los clientes reales o indagar en las tendencias del mercado. Si te preguntas cómo hacer scraping de reseñas de Amazon con Python, este breve tutorial te guía a través de un proceso práctico que utiliza el paquete Requests y BeautifulSoup para obtener contenido de reseñas mediante programación.

Paso 1. Instalación de las bibliotecas necesarias Instalación de las bibliotecas necesarias

Antes de nada, necesitarás instalar un par de librerías. Las dos dependencias principales, Requests para las llamadas de red y BeautifulSoup para el recorrido del árbol HTML, pueden asegurarse ambas en una sola línea de terminal:

pip install requests
pip install beautifulsoup4

Paso 2. Configurar el proceso de raspado Configurar el proceso de raspado

Nos centraremos en las reseñas de amazon con python y examinaremos paso a paso cada etapa del proceso de scraping.

Comprender la estructura del sitio web

Comprender la estructura HTML del sitio es esencial para identificar los elementos de la reseña. La sección de opiniones incluye campos como el nombre del usuario, la puntuación con estrellas y comentarios escritos, que deben localizarse mediante herramientas de inspección del navegador.

Título y URL del producto:

1.png

Valoración total:

2.png

Sección de revisión:

3.png

Nombre del autor:

4.png

Clasificación:

5.png

Cómo:

6.png

Envío de solicitudes HTTP

Las cabeceras desempeñan un papel importante. Las cadenas User-Agent y otras cabeceras se configuran para imitar a un navegador normal y reducir la posibilidad de detección. Si quieres hacer esto bien, siguiendo una guía de Amazon scraping python te mostrará cómo configurar estas cabeceras junto con proxies para mantener tus peticiones sin problemas y bajo el radar.

Apoderados

Los proxies permiten la rotación de IP para reducir el riesgo de prohibiciones y límites de tarifa. Son especialmente importantes para el scraping a gran escala.

Cabeceras de solicitud completas

Incluir varias cabeceras como Accept-Encoding, Accept-Language, Referer, Connection y Upgrade-Insecure-Requests imita una petición legítima del navegador, reduciendo la posibilidad de ser marcado como bot.

import requests

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"

# Example of a proxy provided by the proxy service
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',
}

# Send HTTP GET request to the URL with headers and proxy
try:
    response = requests.get(url, headers=headers, proxies=proxy, timeout=10)
    response.raise_for_status()  # Raise an error if the request failed

except requests.exceptions.RequestException as e:
    print(f"Error: {e}")

Paso 3. Extraer los detalles del producto utilizando BeautifulSoup

Una vez cargada la página, BeautifulSoup convierte el HTML en bruto en un árbol en el que se pueden realizar búsquedas. A partir de esa estructura, el rascador extrae los enlaces canónicos de los productos, los títulos de las páginas y los agregados de valoraciones visibles.

from bs4 import BeautifulSoup

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

# Extracting common product details
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)

Paso 4. Extracción de los datos de revisión utilizando BeautifulSoup

Volvemos a la misma estructura HTML, esta vez centrándonos en recopilar los nombres de los revisores, las puntuaciones con estrellas y los comentarios escritos, todo ello utilizando Python para scrapear las reseñas de Amazon de forma eficiente con selectores predefinidos.

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,
    })

Paso 5. Guardar los datos en CSV Guardar datos en CSV

El csv.writer incorporado en Python puede guardar los datos de revisión recopilados en un archivo .csv para su posterior análisis.

import csv

# Define CSV file path
csv_file = 'amazon_reviews.csv'

# Define CSV fieldnames
fieldnames = ['Product URL', 'Product Title', 'Total Rating', 'Author', 'Rating', 'Comment']

# Writing data to CSV file
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}")

Código completo

Se presenta un bloque de código que une los pasos de creación de solicitudes, análisis sintáctico y salida de archivos, encapsulando todo el flujo de trabajo de scraping en un único script ejecutable:

import requests
from bs4 import BeautifulSoup
import csv
import urllib3

urllib3.disable_warnings()

# URL of the Amazon product reviews page
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"

# Proxy provided by the proxy service with IP-authorization
path_proxy = 'your_proxy_ip:your_proxy_port'
proxy = {
   'http': f'http://{path_proxy}',
   'https': f'https://{path_proxy}'
}

# Headers for the HTTP request
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',
}

# Send HTTP GET request to the URL with headers and handle exceptions
try:
   response = requests.get(url, headers=headers, timeout=10, proxies=proxy, verify=False)
   response.raise_for_status()  # Raise an error if the request failed

except requests.exceptions.RequestException as e:
   print(f"Error: {e}")

# Use BeautifulSoup to parse the HTML and grab the data you need
soup = BeautifulSoup(response.content, 'html.parser')

# Extracting common product details
product_url = soup.find('a', {'data-hook': 'product-link'}).get('href', '')  # Extract product URL
product_title = soup.find('a', {'data-hook': 'product-link'}).get_text(strip=True)  # Extract product title
total_rating = soup.find('span', {'data-hook': 'rating-out-of-text'}).get_text(strip=True)  # Extract total rating

# Extracting individual reviews
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)  # Extract author name
   rating_given = review.find('i', class_='review-rating').get_text(strip=True)  # Extract rating given
   comment = review.find('span', class_='review-text').get_text(strip=True)  # Extract review comment

   # Store each review in a dictionary
   reviews.append({
       'Product URL': product_url,
       'Product Title': product_title,
       'Total Rating': total_rating,
       'Author': author_name,
       'Rating': rating_given,
       'Comment': comment,
   })

# Define CSV file path
csv_file = 'amazon_reviews.csv'

# Define CSV fieldnames
fieldnames = ['Product URL', 'Product Title', 'Total Rating', 'Author', 'Rating', 'Comment']

# Writing data to CSV file
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 confirmation message
print(f"Data saved to {csv_file}")

Los proxies fiables mejoran las posibilidades de eludir los bloqueos y ayudan a reducir la detección por parte de los filtros anti-bot. Para el scraping, se suelen preferir los proxies residenciales por su factor de confianza, mientras que los proxies estáticos de ISP aportan velocidad y estabilidad.

Conclusión

El scraping de opiniones de productos de Amazon usando Python es totalmente posible, y Python proporciona las herramientas necesarias para lograrlo. Con unas pocas librerías y una cuidadosa exploración de la página, puedes obtener todo tipo de información útil: desde lo que realmente piensan los clientes hasta detectar dónde se equivocan tus competidores.

Claro, hay algunos obstáculos: Amazon no ama exactamente a los scrapers. Así que si estás tratando de scrapear reseñas de productos de Amazon al estilo Python a escala, necesitarás proxies para permanecer bajo el radar. Las opciones más fiables son los proxies residenciales (gran puntuación de confianza, IPs rotativas) o proxies ISP estáticos (rápidos y estables).

Comentarios:

0 Comentarios