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

Comentarios: 0

El scrapeo de reseñas de Amazon con Python es útil para realizar análisis de la competencia, comprobar reseñas y hacer estudios de mercado. Esto demuestra cómo raspar reseñas de productos en Amazon de manera eficiente con Python, BeautifulSoup y bibliotecas Requests.

Paso 1. Instalar las librerías necesarias

Antes de sumergirte en el proceso de scraping, asegúrate de tener instaladas las librerías Python necesarias:

pip install requests
pip install beautifulsoup4

Paso 2. Configurar el proceso de scraping

Nos centraremos en la extracción de reseñas de productos de la página de Amazon y examinaremos paso a paso cada etapa del proceso de scraping.

Entendiendo la estructura de la página web

Inspecciona la estructura HTML de la página de reseñas de productos de Amazon para identificar los elementos que queremos raspar: nombres de los reseñadores, valoraciones y comentarios.

Título del producto y URL:

1.png

Valoración total:

2.png

Sección de revisión:

3.png

Nombre del autor:

4.png

Clasificación:

5.png

Comentario:

6.png

Envío de peticiones HTTP

Utiliza la librería Requests para enviar peticiones HTTP GET a la página de reseñas de productos de Amazon. Configura las cabeceras para imitar el comportamiento legítimo del navegador y evitar ser detectado. Los proxies y las cabeceras de petición completas son esenciales para evitar ser bloqueado por Amazon.

Proxies

El uso de proxies ayuda a rotar las direcciones IP para evitar las prohibiciones de IP y los límites de velocidad de Amazon. Es crucial para el scraping a gran escala para mantener el anonimato y evitar la detección. Aquí, los detalles del proxy son proporcionados por el servicio de proxy.

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"

# Ejemplo de proxy proporcionado por el servicio proxy
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',
}

# Enviar solicitud HTTP GET a la URL con cabeceras y proxy
try:
    response = requests.get(url, headers=headers, proxies=proxy, timeout=10)
    response.raise_for_status()  # Raise an exception for bad response status
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")

Paso 3. Extraer los detalles del producto utilizando BeautifulSoup

Analiza el contenido HTML de la respuesta utilizando BeautifulSoup para extraer detalles comunes del producto como la URL, el título y la calificación total.


from bs4 import BeautifulSoup

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

# Extracción de detalles comunes de los productos
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. Extraer los datos de las reseñas utilizando BeautifulSoup

Continúe analizando el contenido HTML para extraer los nombres de los revisores, las calificaciones y los comentarios en función de las expresiones XPath identificadas.


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

Utilice el módulo CSV incorporado de Python para guardar los datos extraídos en un archivo CSV para su posterior análisis.


import csv

# Definir la ruta del archivo CSV
csv_file = 'amazon_reviews.csv'

# Definir nombres de campo CSV
fieldnames = ['Product URL', 'Product Title', 'Total Rating', 'Author', 'Rating', 'Comment']

# Escritura de datos en un archivo 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}")

Código completo

Aquí está el código completo para scrapear datos de reseñas de Amazon y guardarlos en un archivo CSV:


import requests
from bs4 import BeautifulSoup
import csv
import urllib3

urllib3.disable_warnings()

# URL de la página de reseñas de productos de 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"

# Proxy proporcionado por el servicio proxy con autorización IP
path_proxy = 'your_proxy_ip:your_proxy_port'
proxy = {
   'http': f'http://{path_proxy}',
   'https': f'https://{path_proxy}'
}

# Cabeceras de la solicitud 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',
}

# Enviar petición HTTP GET a la URL con cabeceras y manejar excepciones
try:
   response = requests.get(url, headers=headers, timeout=10, proxies=proxy, verify=False)
   response.raise_for_status()  # Raise an exception for bad response status
except requests.exceptions.RequestException as e:
   print(f"Error: {e}")

# Analiza el contenido HTML con BeautifulSoup
soup = BeautifulSoup(response.content, 'html.parser')

#  Extracción de detalles comunes de los productos
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

# Extracción de reseñas individuales
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

   # Almacenar cada revisión en un diccionario
   reviews.append({
       'Product URL': product_url,
       'Product Title': product_title,
       'Total Rating': total_rating,
       'Author': author_name,
       'Rating': rating_given,
       'Comment': comment,
   })

# Definir la ruta del archivo CSV
csv_file = 'amazon_reviews.csv'

# Definir nombres de campo CSV
fieldnames = ['Product URL', 'Product Title', 'Total Rating', 'Author', 'Rating', 'Comment']

# Escritura de datos en un archivo 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)

# Imprimir mensaje de confirmación
print(f"Data saved to {csv_file}")

En conclusión, es crucial destacar que la selección de servidores proxy fiables es un paso clave en la escritura de scripts para el web scraping. De este modo, se garantiza la elusión eficaz de los bloqueos y la protección contra los filtros anti-bot. Las opciones más adecuadas para el scraping son los servidores proxy residenciales, que ofrecen un alto factor de confianza y direcciones IP dinámicas, junto con los proxies ISP estáticos que proporcionan alta velocidad y estabilidad operativa.

Comentarios:

0 Comentarios