es
English
中國人
Tiếng Việt
Deutsch
Українська
Português
Français
भारतीय
Türkçe
한국인
Italiano
Gaeilge
اردو
Indonesia
Polski 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.
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
Nos centraremos en las reseñas de amazon con python y examinaremos paso a paso cada etapa del proceso de scraping.
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:
Valoración total:
Sección de revisión:
Nombre del autor:
Clasificación:
Cómo:
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.
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.
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}")
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)
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,
})
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}")
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.
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