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.
Antes de sumergirte en el proceso de scraping, asegúrate de tener instaladas las librerías Python necesarias:
pip install requests
pip install beautifulsoup4
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.
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:
Valoración total:
Sección de revisión:
Nombre del autor:
Clasificación:
Comentario:
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.
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.
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}")
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)
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,
})
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}")
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.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Comentarios: 0