La creación de un monitor de productos de Amazon que rastrea los precios, la clasificación de los más vendidos y el recuento de reseñas brinda a los vendedores y analistas un pulso continuo sobre el rendimiento del producto sin verificaciones manuales. El scraping directo de Amazon no es confiable a escala debido a la detección agresiva de bots y a los diseños de página en constante cambio. La API de búsqueda de Scavio devuelve datos estructurados de productos de Amazon, incluido el precio actual, BSR, calificación y recuento de reseñas para cualquier consulta de ASIN. Este tutorial crea un monitor completo que sondea los ASIN según un cronograma, almacena puntos de datos históricos en una base de datos JSON local e imprime alertas cuando las métricas clave cruzan umbrales.
Requisitos previos
- Python 3.8 o superior instalado
- solicita biblioteca instalada (solicitudes de instalación de pip)
- Una clave API de Scavio de scavio.dev
- Uno o más ASIN de Amazon para rastrear
Guia paso a paso
Paso 1: Configurar ASIN y umbrales de alerta
Defina los ASIN para monitorear junto con los umbrales de caídas de precios, saltos de BSR y revisar los hitos del recuento. Estos umbrales controlan cuándo el monitor imprime alertas.
ASINS = {
'B09G9FPHY6': {
'name': 'Echo Dot 5th Gen',
'price_floor': 30.00,
'bsr_alert_jump': 5000,
'review_milestone': 1000
},
'B07FZ8S74R': {
'name': 'Fire TV Stick 4K',
'price_floor': 25.00,
'bsr_alert_jump': 3000,
'review_milestone': 5000
}
}Paso 2: Obtenga datos de productos de Amazon de Scavio
PUBLICAR en el punto final de Scavio con la plataforma de Amazon y ASIN como consulta. Extraiga el objeto del producto que contiene precio, BSR, calificación y recuento de reseñas.
import requests
import os
API_KEY = os.environ.get('SCAVIO_API_KEY', 'your_scavio_api_key')
def fetch_product(asin: str) -> dict:
response = requests.post(
'https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'amazon', 'query': asin, 'marketplace': 'US'}
)
response.raise_for_status()
data = response.json()
product = data.get('product', {})
return {
'asin': asin,
'title': product.get('title', ''),
'price': product.get('price', ''),
'bsr': product.get('best_sellers_rank', 0),
'rating': product.get('rating', 0),
'reviews': product.get('reviews_count', 0)
}Paso 3: Almacenar puntos de datos históricos
Adjunte cada recuperación de datos a un archivo histórico basado en JSON con clave ASIN y marca de tiempo. Esto crea una serie de tiempo que se puede utilizar para análisis de tendencias o gráficos.
import json
from pathlib import Path
from datetime import datetime
HISTORY_FILE = Path('amazon_monitor_history.json')
def append_history(asin: str, data_point: dict) -> None:
history = json.loads(HISTORY_FILE.read_text()) if HISTORY_FILE.exists() else {}
if asin not in history:
history[asin] = []
data_point['timestamp'] = datetime.now().isoformat()
history[asin].append(data_point)
HISTORY_FILE.write_text(json.dumps(history, indent=2))Paso 4: Verificar umbrales y generar alertas
Compare el punto de datos actual con los umbrales y el punto de datos anterior. Genere alertas de caídas de precios por debajo del nivel mínimo, grandes saltos de BSR y revise los hitos.
def check_alerts(asin: str, current: dict, config: dict, history: list) -> None:
price_val = current.get('price', '')
if price_val:
price_num = float(str(price_val).replace('$', '').replace(',', ''))
if price_num <= config['price_floor']:
print(f' PRICE ALERT: {config["name"]} at ${price_num:.2f} (floor: ${config["price_floor"]})')
if len(history) >= 2:
prev_bsr = history[-2].get('bsr', 0)
curr_bsr = current.get('bsr', 0)
if prev_bsr and curr_bsr and abs(curr_bsr - prev_bsr) > config['bsr_alert_jump']:
direction = 'dropped' if curr_bsr > prev_bsr else 'improved'
print(f' BSR ALERT: {config["name"]} {direction} from {prev_bsr} to {curr_bsr}')
if current.get('reviews', 0) >= config['review_milestone']:
print(f' MILESTONE: {config["name"]} has {current["reviews"]} reviews')Paso 5: Ejecute el monitor e imprima una tabla resumen
Itere todos los ASIN, obtenga datos, almacene el historial, verifique alertas e imprima una tabla de resumen. Programe este script con cron para ejecuciones horarias o diarias.
def run_monitor():
history = json.loads(HISTORY_FILE.read_text()) if HISTORY_FILE.exists() else {}
print(f'Amazon Product Monitor - {datetime.now().strftime("%Y-%m-%d %H:%M")}')
print(f'{"ASIN":<14} {"Product":<25} {"Price":<10} {"BSR":<10} {"Reviews"}')
print('-' * 70)
for asin, config in ASINS.items():
product = fetch_product(asin)
append_history(asin, product)
updated_history = json.loads(HISTORY_FILE.read_text())
check_alerts(asin, product, config, updated_history.get(asin, []))
print(f'{asin:<14} {config["name"]:<25} {product["price"]:<10} {product["bsr"]:<10} {product["reviews"]}')
run_monitor()Ejemplo en Python
import os
import json
import requests
from pathlib import Path
from datetime import datetime
API_KEY = os.environ.get('SCAVIO_API_KEY', 'your_scavio_api_key')
ENDPOINT = 'https://api.scavio.dev/api/v1/search'
HISTORY_FILE = Path('amazon_monitor_history.json')
ASINS = {
'B09G9FPHY6': {'name': 'Echo Dot 5th Gen', 'price_floor': 30.00, 'bsr_alert_jump': 5000, 'review_milestone': 1000},
'B07FZ8S74R': {'name': 'Fire TV Stick 4K', 'price_floor': 25.00, 'bsr_alert_jump': 3000, 'review_milestone': 5000}
}
def fetch_product(asin: str) -> dict:
response = requests.post(
ENDPOINT,
headers={'x-api-key': API_KEY},
json={'platform': 'amazon', 'query': asin, 'marketplace': 'US'}
)
response.raise_for_status()
product = response.json().get('product', {})
return {
'asin': asin,
'title': product.get('title', ''),
'price': product.get('price', ''),
'bsr': product.get('best_sellers_rank', 0),
'rating': product.get('rating', 0),
'reviews': product.get('reviews_count', 0)
}
def append_history(asin: str, data_point: dict) -> None:
history = json.loads(HISTORY_FILE.read_text()) if HISTORY_FILE.exists() else {}
if asin not in history:
history[asin] = []
data_point['timestamp'] = datetime.now().isoformat()
history[asin].append(data_point)
HISTORY_FILE.write_text(json.dumps(history, indent=2))
def check_alerts(asin: str, current: dict, config: dict, history: list) -> None:
price_val = current.get('price', '')
if price_val:
price_num = float(str(price_val).replace('$', '').replace(',', ''))
if price_num <= config['price_floor']:
print(f' PRICE ALERT: {config["name"]} at ${price_num:.2f} (floor: ${config["price_floor"]})')
if len(history) >= 2:
prev_bsr = history[-2].get('bsr', 0)
curr_bsr = current.get('bsr', 0)
if prev_bsr and curr_bsr and abs(curr_bsr - prev_bsr) > config['bsr_alert_jump']:
direction = 'dropped' if curr_bsr > prev_bsr else 'improved'
print(f' BSR ALERT: {config["name"]} {direction} from {prev_bsr} to {curr_bsr}')
if current.get('reviews', 0) >= config['review_milestone']:
print(f' MILESTONE: {config["name"]} has {current["reviews"]} reviews')
def run_monitor():
history = json.loads(HISTORY_FILE.read_text()) if HISTORY_FILE.exists() else {}
print(f'Amazon Product Monitor - {datetime.now().strftime("%Y-%m-%d %H:%M")}')
print(f'{"ASIN":<14} {"Product":<25} {"Price":<10} {"BSR":<10} {"Reviews"}')
print('-' * 70)
for asin, config in ASINS.items():
product = fetch_product(asin)
append_history(asin, product)
updated = json.loads(HISTORY_FILE.read_text())
check_alerts(asin, product, config, updated.get(asin, []))
print(f'{asin:<14} {config["name"]:<25} {product["price"]:<10} {product["bsr"]:<10} {product["reviews"]}')
if __name__ == '__main__':
run_monitor()Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY || 'your_scavio_api_key';
const ENDPOINT = 'https://api.scavio.dev/api/v1/search';
const fs = require('fs');
const HISTORY_FILE = 'amazon_monitor_history.json';
const ASINS = {
B09G9FPHY6: { name: 'Echo Dot 5th Gen', priceFloor: 30.0, bsrAlertJump: 5000 },
B07FZ8S74R: { name: 'Fire TV Stick 4K', priceFloor: 25.0, bsrAlertJump: 3000 }
};
async function fetchProduct(asin) {
const response = await fetch(ENDPOINT, {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ platform: 'amazon', query: asin, marketplace: 'US' })
});
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
const product = data.product || {};
return {
asin,
title: product.title || '',
price: product.price || '',
bsr: product.best_sellers_rank || 0,
rating: product.rating || 0,
reviews: product.reviews_count || 0
};
}
async function main() {
const history = fs.existsSync(HISTORY_FILE) ? JSON.parse(fs.readFileSync(HISTORY_FILE, 'utf-8')) : {};
console.log('Amazon Product Monitor - ' + new Date().toISOString().slice(0, 16));
for (const [asin, config] of Object.entries(ASINS)) {
const product = await fetchProduct(asin);
if (!history[asin]) history[asin] = [];
product.timestamp = new Date().toISOString();
history[asin].push(product);
const priceNum = parseFloat(String(product.price).replace(/[$,]/g, ''));
if (priceNum && priceNum <= config.priceFloor) {
console.log(' PRICE ALERT: ' + config.name + ' at $' + priceNum.toFixed(2));
}
console.log(asin + ' | ' + config.name + ' | ' + product.price + ' | BSR: ' + product.bsr + ' | Reviews: ' + product.reviews);
}
fs.writeFileSync(HISTORY_FILE, JSON.stringify(history, null, 2));
console.log('History saved');
}
main().catch(console.error);Salida esperada
Amazon Product Monitor - 2026-05-12 14:30
ASIN Product Price BSR Reviews
----------------------------------------------------------------------
B09G9FPHY6 Echo Dot 5th Gen $29.99 1234 45678
PRICE ALERT: Echo Dot 5th Gen at $29.99 (floor: $30.0)
MILESTONE: Echo Dot 5th Gen has 45678 reviews
B07FZ8S74R Fire TV Stick 4K $34.99 892 98321
MILESTONE: Fire TV Stick 4K has 98321 reviews
History saved