Extraia Avaliações da App Store & Google Play: Endpoints, Limites, Geo

Avaliações de aplicativos são a pesquisa de produto mais barata que você pode comprar - se conseguir superar os limites de paginação, as barreiras de tokens e as lojas por país. Aqui está o mapa completo.

Avaliações de aplicativos são a pesquisa de cliente mais barata disponível: pedidos de recursos sem filtro, relatórios de bugs vinculados a uma versão específica e uma leitura contínua de sentimento sobre cada concorrente na sua categoria. O problema é o acesso. Ambas as lojas mostram um punhado de avaliações na página e escondem o resto atrás de feeds, tokens e lojas por país. Este guia mapeia como extrair avaliações da App Store e Google Play - os endpoints reais, os limites de paginação que ninguém avisa, e as realidades de geo e limite de taxa que decidem se seu pipeline sobrevive além de algumas centenas de linhas.

Apple, o jeito fácil: o feed RSS

A Apple expõe um feed JSON público de avaliações de clientes que não precisa de token. É a maneira mais rápida de começar e retorna registros limpos e estruturados - classificação, título, corpo, autor, versão do aplicativo. A limitação é um teto rígido: o feed serve no máximo 10 páginas de aproximadamente 50 avaliações, então cerca de 500 avaliações por aplicativo por loja, tendendo para as mais recentes. Para monitorar feedbacks novos, isso geralmente é suficiente; para um histórico completo, não é.

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, o jeito profundo: a API da app-store e seu token

Para passar de 500, você usa o mesmo endpoint que a página web da App Store chama (a API AMP / MZStore). Ela retorna registros mais ricos - id da avaliação, sinalizador de edição, respostas do desenvolvedor - mas exige um token de autenticação que você primeiro extrai da página pública do aplicativo, depois reproduz. As avaliações vêm em lotes de aproximadamente vinte, e você pagina mais fundo com um offset; quanto maior o offset, mais antigas tendem a ser as avaliações, porque a Apple não permite que este endpoint ordene diretamente por data.

A verdadeira restrição aqui é o limite de taxa, e ele chega rápido de um único IP. A solução não é mágica - é um atraso deliberado mais backoff exponencial, e distribuir solicitações entre IPs. Praticantes que adicionaram ambos conseguiram extrair cerca de 15.000 avaliações para um aplicativo sem acionar o limitador. É exatamente aí que um pool rotativo residencial compensa: cada lote pode sair de um IP limpo diferente, então o contador por IP nunca sobe para o território de bloqueio.

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
Comparação do feed RSS de avaliações de clientes da Apple versus a API AMP da app-store mostrando limites de paginação e requisitos de token
O feed RSS é rápido, mas limitado a ~500; a API de token vai fundo, mas limita fortemente a partir de um IP.

Google Play: JSON hidratado, não HTML

As avaliações do Play não estão no HTML da página. A loja as carrega através de um endpoint de lote interno que retorna JSON aninhado, paginado com um token de continuação em vez de números de página, e filtrado por ordem de classificação (mais recente, classificação, utilidade). Reconstruir essas solicitações manualmente é complicado, então a maioria das equipes depende das bem mantidas bibliotecas open-source google-play-scraper (Node e Python), que encapsulam o endpoint e expõem os parâmetros country e lang. Como na Apple, os resultados por país diferem, então defina ambos explicitamente.

# 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])

Em volume real, o endpoint do Play também limita por IP, e a estrutura JSON muda periodicamente. Se você preferir não lidar com essa manutenção, uma Scraper API que renderiza e retorna os dados hidratados como JSON limpo remove ambos os problemas - ela cuida do proxy e da análise para que você consuma uma forma estável. A mesma lógica de trade-off que descrevemos para extração de avaliações de produtos em escala se aplica diretamente aqui.

Um par de campos confunde as pessoas: idioma e país não são o mesmo botão. A loja (país) decide quais avaliações existem; o parâmetro de idioma decide quais delas você recebe de volta. Em um mercado bilíngue como o Canadá ou a Suíça, você frequentemente quer ambos os idiomas, então defina-os independentemente em vez de assumir que um país implica em um único idioma. Do lado da Apple, os registros mais ricos também expõem respostas de desenvolvedores - a resposta pública que um fornecedor publica sob uma avaliação - que é um sinal silenciosamente valioso de como os concorrentes triagem reclamações e quais problemas escolhem responder publicamente.

Lojas geográficas são o ponto principal

Ambas as lojas são organizadas por loja de país, identificadas por um código de duas letras. As avaliações dos EUA de um aplicativo não dizem nada sobre como ele é recebido na Alemanha, Japão ou Brasil - diferentes idiomas, diferentes reclamações, diferentes lacunas de recursos. Para ler cada loja honestamente, você solicita de um IP de saída naquele país; um IP de datacenter na região errada lhe dá uma resposta inconsistente ou bloqueada. Com saídas residenciais em mais de 200 países, você pode passar o mesmo aplicativo por cada mercado e construir um mapa de sentimento por país - a matéria-prima do trabalho sério de ASO.

Pipeline desde a escolha de lojas até a obtenção de avaliações para sinal de otimização de app store
O valor está a jusante: analise classificação e versão, depois agrupe avaliações em temas e regressões por versão.

De avaliações a sinal de ASO

A extração é a metade entediante. O retorno é o que você calcula em cima: agrupe o texto das avaliações em temas recorrentes, acompanhe o sentimento por versão do aplicativo para detectar a versão que derrubou sua classificação, observe concorrentes para pedidos de recursos que seu produto já atende e compare padrões de reclamações entre lojas. Vincule cada avaliação ao seu campo version e você obtém uma linha do tempo de regressão que nenhum painel de análise oferece. O trabalho de reputação relacionado - mineração de avaliações do Trustpilot - se encaixa perfeitamente ao lado dos dados da app-store para uma imagem completa da voz do cliente.

Obtenha IPs residenciais para cada loja de aplicativos

Perguntas frequentes

Como extraio avaliações da App Store em Python?

Comece com o feed JSON público de avaliações de clientes da Apple - sem token, saída estruturada, mas limitado a aproximadamente 500 avaliações recentes por aplicativo por loja. Para ir mais fundo, chame a API AMP da app-store com um token de autenticação extraído da página web do aplicativo, pagine com um offset e adicione atraso mais backoff. Direcione cada loja através de um IP residencial naquele país.

Existe uma API oficial de avaliações da App Store?

O feed RSS público da Apple é o mais próximo de uma fonte oficial de avaliações sem token, mas é limitado. O endpoint AMP mais rico é o que a própria página web da loja usa e requer um token de autenticação extraído. Nenhum é um produto de desenvolvedor documentado para coleta em massa de avaliações de terceiros, então trate limites de taxa e termos com cuidado.

Como extraio avaliações do Google Play?

O Play serve avaliações de um endpoint de lote interno retornando JSON aninhado, paginado por um token de continuação e filtrável por ordem de classificação. As bibliotecas open-source google-play-scraper mantidas encapsulam isso e expõem country e lang. Defina ambos, faça loop no token de continuação para volume e distribua solicitações entre IPs porque o endpoint limita por endereço.

Por que preciso de proxies para extrair avaliações de aplicativos?

Duas razões. Limite de taxa: ambas as lojas limitam rapidamente um único IP, então saídas residenciais rotativas mantêm o contador por IP baixo o suficiente para extrair milhares de avaliações. Geografia: as avaliações são específicas da loja, então ler as avaliações de um país com precisão significa solicitar de um IP naquele país. IPs de datacenter na região errada obtêm respostas inconsistentes ou bloqueadas.

Dados de app-store são uma mina de ouro cercada por três obstáculos simples - limites, tokens e lojas. Saiba qual endpoint acessar, pagine corretamente e saia do país certo em IPs limpos, e você transforma classificações dispersas em um feed de voz do cliente por versão, por mercado.

Deixe a Scraper API retornar dados de avaliações como JSON