Extraer reseñas de App Store y Google Play: Endpoints, Límites, Geo

Las reseñas de aplicaciones son la investigación de producto más barata que puedes comprar, si puedes superar los límites de paginación, las barreras de tokens y las tiendas por país. Aquí tienes el mapa completo.

Las reseñas de aplicaciones son la investigación de clientes más barata que existe: solicitudes de características sin filtrar, informes de errores vinculados a una versión específica y una lectura continua del sentimiento sobre cada competidor en tu categoría. El problema es el acceso. Ambas tiendas muestran un puñado de reseñas en la página y ocultan el resto detrás de feeds, tokens y tiendas por país. Esta guía mapea cómo extraer reseñas de App Store y Google Play: los endpoints reales, los límites de paginación de los que nadie te advierte, y las realidades geográficas y de límites de tasa que deciden si tu canal sobrevive más allá de unas pocas cientos de filas.

Apple, el camino fácil: el feed RSS

Apple expone un feed JSON público de reseñas de clientes que no necesita token. Es la forma más rápida de comenzar y devuelve registros limpios y estructurados: calificación, título, cuerpo, autor, versión de la aplicación. La limitación es un techo rígido: el feed sirve como máximo 10 páginas de aproximadamente 50 reseñas, por lo que alrededor de 500 reseñas por aplicación por tienda, sesgadas hacia las más recientes. Para monitorear comentarios frescos eso suele ser suficiente; para un historial completo no lo es.

import requests

def apple_rss_reviews(app_id, country="us", pages=10):
    out = []
    for page in range(1, pages + 1):  # feed caps out around page 10
        url = (f"https://itunes.apple.com/{country}/rss/customerreviews/"
               f"page={page}/id={app_id}/sortby=mostrecent/json")
        # route through a residential exit in the target storefront's country
        proxy = f"http://USER-country-{country}:PASS@gate.quantumproxies.io:8000"
        r = requests.get(url, proxies={"https": proxy}, timeout=20)
        entries = r.json().get("feed", {}).get("entry", [])
        for e in entries[1:]:  # first entry is app metadata, skip it
            out.append({
                "rating":  e["im:rating"]["label"],
                "version": e["im:version"]["label"],
                "title":   e["title"]["label"],
                "text":    e["content"]["label"],
                "author":  e["author"]["name"]["label"],
            })
        if len(entries) <= 1:
            break
    return out

Apple, el camino profundo: la API de app-store y su token

Para ir más allá de 500, utilizas el mismo endpoint que llama la página web de App Store (la API AMP / MZStore). Devuelve registros más ricos: id de reseña, bandera de edición, respuestas del desarrollador, pero exige un token de portador que primero extraes de la página web pública de la aplicación, luego reproduces. Las reseñas vienen en lotes de aproximadamente veinte, y paginas más profundo con un offset; cuanto mayor es el offset, más antiguas tienden a ser las reseñas, porque Apple no permite que este endpoint ordene directamente por fecha.

La verdadera restricción aquí es el límite de tasa, y llega rápido desde una sola IP. La solución no es mágica: es un retraso deliberado más un retroceso exponencial, y distribuir las solicitudes a través de IPs. Los practicantes que añaden ambos han extraído del orden de 15,000 reseñas para una aplicación sin activar el limitador. Ahí es exactamente donde un pool rotativo residencial da sus frutos: cada lote puede salir desde una IP limpia diferente, por lo que el contador por IP nunca sube a territorio de bloqueo.

import time, requests

# token is scraped once from the app's App Store web page, then reused
HEADERS = {"Authorization": "Bearer TOKEN_FROM_APP_PAGE",
           "Origin": "https://apps.apple.com"}

def apple_deep_reviews(app_id, country="us", target=2000):
    reviews, offset = [], None
    while len(reviews) < target:
        params = {"l": "en-US", "offset": offset} if offset else {"l": "en-US"}
        url = (f"https://amp-api.apps.apple.com/v1/catalog/{country}/apps/"
               f"{app_id}/reviews")
        proxy = f"http://USER:PASS@rotating.quantumproxies.io:8000"
        r = requests.get(url, headers=HEADERS, params=params,
                         proxies={"https": proxy}, timeout=25)
        if r.status_code == 429:            # rate limited
            time.sleep(8); continue          # back off, gateway rotates the IP
        data = r.json()
        reviews += data.get("data", [])
        offset = data.get("next", "").split("offset=")[-1] or None
        if not offset:
            break
        time.sleep(1.5)                      # be a polite client
    return reviews
Comparación del feed RSS de reseñas de clientes de Apple versus la API AMP de app-store mostrando límites de paginación y requisitos de token
El feed RSS es rápido pero está limitado a ~500; la API de token va profundo pero limita fuertemente desde una IP.

Google Play: JSON hidratado, no HTML

Las reseñas de Play no están en el HTML de la página. La tienda las carga a través de un endpoint interno por lotes que devuelve JSON anidado, paginado con un token de continuación en lugar de números de página, y filtrado por orden de clasificación (más reciente, calificación, utilidad). Reconstruir esas solicitudes a mano es complicado, por lo que la mayoría de los equipos se apoyan en las bien mantenidas bibliotecas de código abierto google-play-scraper (Node y Python), que envuelven el endpoint y exponen los parámetros country y lang. Al igual que con Apple, los resultados por país difieren, así que establece ambos explícitamente.

# pip install google-play-scraper
from google_play_scraper import reviews, Sort

result, token = reviews(
    "com.example.app",
    lang="en",       # review language
    country="us",    # storefront
    sort=Sort.NEWEST,
    count=200,       # per call; loop with continuation_token for more
)
for r in result[:3]:
    print(r["score"], r["reviewCreatedVersion"], r["content"][:80])

A volumen real, el endpoint de Play también limita por IP, y la estructura JSON cambia periódicamente. Si prefieres no encargarte de ese mantenimiento, una Scraper API que renderiza y devuelve los datos hidratados como JSON limpio elimina ambos problemas: lleva el proxy y el análisis para que consumas una forma estable. La misma lógica de intercambio que describimos para extraer reseñas de productos a gran escala se aplica directamente aquí.

Un par de campos confunde a la gente: idioma y país no son el mismo control. La tienda (país) decide qué reseñas existen en absoluto; el parámetro de idioma decide cuáles de ellas obtienes. En un mercado bilingüe como Canadá o Suiza a menudo quieres ambos idiomas, así que configúralos independientemente en lugar de asumir que un país implica un solo idioma. En el lado de Apple, los registros más ricos también exponen respuestas de desarrolladores: la respuesta pública que un vendedor publica bajo una reseña, lo cual es una señal valiosa en silencio sobre cómo los competidores manejan las quejas y qué problemas eligen responder públicamente.

Las tiendas geográficas son el punto central

Ambas tiendas están organizadas por tienda de país, identificadas por un código de dos letras. Las reseñas de EE. UU. de una aplicación no te dicen nada sobre cómo se recibe en Alemania, Japón o Brasil: diferentes idiomas, diferentes quejas, diferentes brechas de características. Para leer cada tienda honestamente, solicitas desde una IP de salida en ese país; una IP de centro de datos en la región incorrecta te da una respuesta inconsistente o bloqueada. Con salidas residenciales en más de 200 países puedes pasar la misma aplicación por cada mercado y construir un mapa de sentimiento por país: el material bruto del trabajo serio de ASO.

Canal desde la selección de tiendas hasta la obtención de reseñas para la señal de optimización de la app store
El valor está río abajo: analiza la calificación y la versión, luego agrupa las reseñas en temas y regresiones por versión.

De reseñas a señal de ASO

La extracción es la mitad aburrida. La recompensa es lo que calculas encima: agrupa el texto de las reseñas en temas recurrentes, rastrea el sentimiento por versión de la aplicación para detectar la versión que hundió tu calificación, observa a los competidores para solicitudes de características que tu producto ya responde, y compara patrones de quejas entre tiendas. Vincula cada reseña a su campo version y obtienes una línea de tiempo de regresión que ningún panel de análisis te da. El trabajo de reputación relacionado - minería de reseñas de Trustpilot - se apila ordenadamente junto a los datos de la app-store para una imagen completa de la voz del cliente.

Obtén IPs residenciales para cada tienda de aplicaciones

Preguntas frecuentes

¿Cómo extraigo reseñas de App Store en Python?

Comienza con el feed JSON público de reseñas de clientes de Apple - sin token, salida estructurada, pero limitado a aproximadamente 500 reseñas recientes por aplicación por tienda. Para ir más profundo, llama a la API AMP de app-store con un token de portador extraído de la página web de la aplicación, pagina con un offset, y añade retraso más retroceso. Dirige cada tienda a través de una IP residencial en ese país.

¿Existe una API oficial de reseñas de App Store?

El feed RSS público de Apple es lo más cercano a una fuente oficial de reseñas sin token, pero está limitado. El endpoint AMP más rico es el que usa la propia página web de la tienda y requiere un token de portador extraído. Ninguno es un producto de desarrollador documentado para la recopilación masiva de reseñas de terceros, así que trata los límites de tasa y términos con cuidado.

¿Cómo extraigo reseñas de Google Play?

Play sirve reseñas desde un endpoint interno por lotes que devuelve JSON anidado, paginado por un token de continuación y filtrable por orden de clasificación. Las bibliotecas de código abierto google-play-scraper mantenidas lo envuelven y exponen country y lang. Establece ambos, recorre el token de continuación para volumen, y distribuye las solicitudes a través de IPs porque el endpoint limita por dirección.

¿Por qué necesito proxies para extraer reseñas de aplicaciones?

Dos razones. Límite de tasa: ambas tiendas limitan rápidamente una sola IP, por lo que las salidas residenciales rotativas mantienen el contador por IP lo suficientemente bajo como para extraer miles de reseñas. Geografía: las reseñas son específicas de la tienda, por lo que leer las reseñas de un país con precisión significa solicitar desde una IP en ese país. Las IPs de centro de datos en la región incorrecta obtienen respuestas inconsistentes o bloqueadas.

Los datos de la app-store son una mina de oro bloqueada por tres simples obstáculos: límites, tokens y tiendas. Conoce qué endpoint golpear, páginalo correctamente, y sal desde el país correcto en IPs limpias, y conviertes calificaciones dispersas en un canal de voz del cliente por versión y por mercado.

Deja que la Scraper API devuelva los datos de reseñas como JSON