Supervise las reseñas de aplicaciones buscando en Google páginas de reseñas de la tienda de aplicaciones, extrayendo fragmentos de reseñas y datos de calificación de los resultados de búsqueda, y realizando un seguimiento de los cambios a lo largo del tiempo. Las API de las tiendas de aplicaciones son restrictivas y a menudo requieren cuentas de desarrollador, pero Google indexa las páginas de revisión de aplicaciones tanto de Apple App Store como de Google Play Store. Al buscar el nombre de su aplicación más palabras clave relacionadas con reseñas, puede capturar fragmentos de reseñas, menciones de calificaciones y datos de reseñas de la competencia a través de una única API de búsqueda.
Requisitos previos
- Python 3.8+ instalado
- solicita biblioteca instalada
- Una clave API de Scavio de scavio.dev
- Nombres de aplicaciones para monitorear
Guia paso a paso
Paso 1: Buscar reseñas de aplicaciones
Consulta en Google páginas de reseñas de aplicaciones para capturar contenido de reseñas indexadas.
import os, requests, re, json, datetime
API_KEY = os.environ['SCAVIO_API_KEY']
def search_app_reviews(app_name: str) -> list:
queries = [
f'{app_name} app reviews 2026',
f'{app_name} app store rating',
f'{app_name} user reviews',
]
all_results = []
for query in queries:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google', 'query': query}, timeout=15)
results = resp.json().get('organic_results', [])
all_results.extend(results[:3])
return all_results
reviews = search_app_reviews('Slack')
print(f'Found {len(reviews)} review-related results')
for r in reviews[:3]:
print(f" {r.get('title', '')[:60]}")Paso 2: Extraer datos de calificación
Analice los resultados de búsqueda para determinar los números de calificación y el recuento de reseñas.
def extract_ratings(results: list) -> dict:
ratings = []
for r in results:
text = (r.get('title', '') + ' ' + r.get('snippet', '')).lower()
# Look for rating patterns like "4.5/5", "4.5 stars", "rated 4.5"
rating_matches = re.findall(r'(\d+\.?\d*)\s*(?:/5|stars?|out of 5|rating)', text)
for match in rating_matches:
try:
val = float(match)
if 1 <= val <= 5:
ratings.append(val)
except ValueError:
pass
# Look for review counts like "10K reviews", "5,000 reviews"
count_matches = re.findall(r'([\d,]+[KkMm]?)\s*reviews?', text)
if count_matches:
pass # Store for tracking
avg_rating = round(sum(ratings) / len(ratings), 1) if ratings else 0
return {
'ratings_found': len(ratings),
'average': avg_rating,
'min': min(ratings) if ratings else 0,
'max': max(ratings) if ratings else 0,
}
rating_data = extract_ratings(reviews)
print(f"Average rating: {rating_data['average']} (from {rating_data['ratings_found']} mentions)")Paso 3: Detectar señales de sentimiento
Analice fragmentos de reseñas en busca de palabras clave de sentimiento positivo y negativo.
POSITIVE = ['love', 'great', 'excellent', 'best', 'amazing', 'fast', 'easy', 'reliable', 'intuitive']
NEGATIVE = ['slow', 'buggy', 'crash', 'expensive', 'terrible', 'worst', 'broken', 'frustrating', 'unusable']
def analyze_sentiment(results: list) -> dict:
positive_count = 0
negative_count = 0
positive_snippets = []
negative_snippets = []
for r in results:
text = r.get('snippet', '').lower()
pos = sum(1 for w in POSITIVE if w in text)
neg = sum(1 for w in NEGATIVE if w in text)
if pos > neg:
positive_count += 1
positive_snippets.append(r.get('snippet', '')[:100])
elif neg > pos:
negative_count += 1
negative_snippets.append(r.get('snippet', '')[:100])
total = positive_count + negative_count
return {
'positive': positive_count,
'negative': negative_count,
'sentiment_ratio': round(positive_count / total, 2) if total > 0 else 0,
'top_positive': positive_snippets[:2],
'top_negative': negative_snippets[:2],
}
sentiment = analyze_sentiment(reviews)
print(f"Sentiment: {sentiment['positive']} positive, {sentiment['negative']} negative")
print(f"Ratio: {sentiment['sentiment_ratio']}")Paso 4: Seguimiento de los cambios a lo largo del tiempo
Almacene datos de reseñas diarias y detecte cambios significativos en las calificaciones o el sentimiento.
HISTORY_FILE = 'app_review_history.json'
def store_review_data(app: str, rating_data: dict, sentiment: dict):
history = []
try:
with open(HISTORY_FILE) as f:
history = json.load(f)
except FileNotFoundError:
pass
entry = {
'app': app,
'date': datetime.date.today().isoformat(),
'rating': rating_data,
'sentiment': sentiment,
}
history.append(entry)
with open(HISTORY_FILE, 'w') as f:
json.dump(history, f, indent=2)
return entry
def detect_changes(app: str) -> dict:
try:
with open(HISTORY_FILE) as f:
history = json.load(f)
except FileNotFoundError:
return {'change': 'no history'}
entries = [h for h in history if h['app'] == app]
if len(entries) < 2:
return {'change': 'insufficient data'}
prev = entries[-2]
curr = entries[-1]
rating_change = curr['rating']['average'] - prev['rating']['average']
sentiment_change = curr['sentiment']['sentiment_ratio'] - prev['sentiment']['sentiment_ratio']
return {
'rating_change': round(rating_change, 1),
'sentiment_change': round(sentiment_change, 2),
'alert': abs(rating_change) > 0.3 or abs(sentiment_change) > 0.2,
}
store_review_data('Slack', rating_data, sentiment)
changes = detect_changes('Slack')
print(f"Changes: {changes}")Ejemplo en Python
import requests, os, re
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def app_reviews(app):
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': f'{app} app reviews 2026'}).json()
results = data.get('organic_results', [])[:5]
return [{'title': r.get('title', ''), 'snippet': r.get('snippet', '')[:80]} for r in results]
print(app_reviews('Slack'))Ejemplo en JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function appReviews(app) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H,
body: JSON.stringify({platform: 'google', query: `${app} app reviews 2026`})
});
return ((await r.json()).organic_results || []).slice(0, 5)
.map(r => ({title: r.title, snippet: (r.snippet || '').slice(0, 80)}));
}
appReviews('Slack').then(console.log);Salida esperada
An app review monitoring system that tracks ratings, sentiment, and review changes over time by querying Google for app store review content.