Extraire les avis de l'App Store et de Google Play : Points d'accès, Limites, Géolocalisation

Les avis d'applications sont la recherche produit la moins chère que vous puissiez acheter - si vous pouvez dépasser les limites de pagination, les murs de jetons et les vitrines par pays. Voici la carte complète.

Les avis d'applications sont la recherche client la moins chère qui existe : demandes de fonctionnalités non filtrées, rapports de bugs liés à une version spécifique, et une lecture continue du sentiment sur chaque concurrent dans votre catégorie. Le hic, c'est l'accès. Les deux magasins affichent une poignée d'avis sur la page et cachent le reste derrière des flux, des jetons et des vitrines par pays. Ce guide cartographie comment extraire les avis de l'App Store et de Google Play - les vrais points d'accès, les limites de pagination dont personne ne vous avertit, et les réalités géographiques et de limitation de taux qui décident si votre pipeline survit au-delà de quelques centaines de lignes.

Apple, la méthode facile : le flux RSS

Apple expose un flux JSON public des avis clients qui ne nécessite aucun jeton. C'est le moyen le plus rapide de commencer et il renvoie des enregistrements propres et structurés - note, titre, corps, auteur, version de l'application. La limitation est un plafond strict : le flux sert au maximum 10 pages d'environ 50 avis, soit environ 500 avis par application par vitrine, biaisés vers les plus récents. Pour surveiller les retours récents, c'est souvent suffisant ; pour un historique complet, ce ne l'est pas.

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, la méthode approfondie : l'API de l'app store et son jeton

Pour dépasser 500, vous utilisez le même point d'accès que celui appelé par la page web de l'App Store (l'API AMP / MZStore). Il renvoie des enregistrements plus riches - identifiant de l'avis, drapeau d'édition, réponses des développeurs - mais il exige un jeton d'accès que vous devez d'abord extraire de la page web publique de l'application, puis rejouer. Les avis arrivent par lots d'environ vingt, et vous paginez plus profondément avec un offset ; plus l'offset est grand, plus les avis ont tendance à être anciens, car Apple ne permet pas à ce point d'accès de trier directement par date.

La vraie contrainte ici est la limitation de taux, et elle arrive rapidement à partir d'une seule IP. La solution n'est pas magique - c'est un délai délibéré plus un backoff exponentiel, et la répartition des requêtes sur plusieurs IPs. Les praticiens qui ajoutent les deux ont extrait environ 15 000 avis pour une application sans déclencher le limiteur. C'est exactement là qu'un pool résidentiel rotatif est rentable : chaque lot peut sortir d'une IP propre différente, donc le compteur par IP ne grimpe jamais dans le territoire de blocage.

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
Comparaison du flux RSS des avis clients d'Apple par rapport à l'API AMP de l'app store montrant les limites de pagination et les exigences de jeton
Le flux RSS est rapide mais limité à ~500 ; l'API de jeton va en profondeur mais limite sévèrement à partir d'une IP.

Google Play : JSON hydraté, pas HTML

Les avis Play ne se trouvent pas dans le HTML de la page. Le magasin les charge via un point d'accès interne par lots qui renvoie un JSON imbriqué, paginé avec un jeton de continuation plutôt que des numéros de page, et filtré par ordre de tri (le plus récent, note, utilité). Reconstruire ces requêtes à la main est compliqué, donc la plupart des équipes s'appuient sur les bibliothèques open-source bien entretenues google-play-scraper (Node et Python), qui enveloppent le point d'accès et exposent les paramètres country et lang. Comme avec Apple, les résultats par pays diffèrent, donc définissez les deux explicitement.

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

À volume réel, le point d'accès Play limite également par IP, et la structure JSON change périodiquement. Si vous préférez ne pas gérer cette maintenance, une Scraper API qui rend et renvoie les données hydratées sous forme de JSON propre élimine les deux problèmes - elle gère le proxying et le parsing pour que vous consommiez une forme stable. La même logique de compromis que nous décrivons pour l'extraction d'avis produits à grande échelle s'applique directement ici.

Une paire de champs perturbe les gens : langue et pays ne sont pas le même bouton. La vitrine (pays) décide quels avis existent ; le paramètre de langue décide lesquels vous récupérez. Dans un marché bilingue comme le Canada ou la Suisse, vous voulez souvent les deux langues, donc définissez-les indépendamment plutôt que de supposer qu'un pays implique une seule langue. Du côté d'Apple, les enregistrements plus riches exposent également les réponses des développeurs - la réponse publique qu'un fournisseur publie sous un avis - ce qui est un signal discrètement précieux pour savoir comment les concurrents trient les plaintes et quels problèmes ils choisissent de répondre publiquement.

Les vitrines géographiques sont tout l'intérêt

Les deux magasins sont organisés par vitrine de pays, identifiée par un code à deux lettres. Les avis américains d'une application ne vous disent rien sur la façon dont elle est perçue en Allemagne, au Japon ou au Brésil - langues différentes, plaintes différentes, lacunes fonctionnelles différentes. Pour lire chaque vitrine honnêtement, vous devez faire la demande depuis une IP de sortie dans ce pays ; une IP de centre de données dans la mauvaise région vous donne une réponse incohérente ou bloquée. Avec des sorties résidentielles dans plus de 200 pays, vous pouvez faire passer la même application à travers chaque marché et construire une carte de sentiment par pays - la matière première d'un travail sérieux d'ASO.

Pipeline depuis le choix des vitrines jusqu'à la récupération des avis pour signal d'optimisation de l'app store
La valeur est en aval : analysez la note et la version, puis regroupez les avis en thèmes et régressions par version.

Des avis au signal ASO

L'extraction est la moitié ennuyeuse. Le gain est ce que vous calculez par-dessus : regroupez le texte des avis en thèmes récurrents, suivez le sentiment par version d'application pour détecter la version qui a fait chuter votre note, surveillez les concurrents pour les demandes de fonctionnalités auxquelles votre produit répond déjà, et comparez les schémas de plaintes entre les vitrines. Liez chaque avis à son champ version et vous obtenez une chronologie de régression qu'aucun tableau de bord analytique ne vous donne. Le travail de réputation connexe - extraction d'avis Trustpilot - s'aligne parfaitement avec les données de l'app store pour une image complète de la voix du client.

Obtenez des IPs résidentielles pour chaque vitrine d'application

Questions fréquemment posées

Comment extraire les avis de l'App Store en Python ?

Commencez avec le flux JSON public des avis clients d'Apple - pas de jeton, sortie structurée, mais limité à environ 500 avis récents par application par vitrine. Pour aller plus loin, appelez l'API AMP de l'app store avec un jeton d'accès extrait de la page web de l'application, paginez avec un offset, et ajoutez un délai plus un backoff. Routez chaque vitrine à travers une IP résidentielle dans ce pays.

Existe-t-il une API officielle des avis de l'App Store ?

Le flux RSS public d'Apple est ce qui se rapproche le plus d'une source officielle d'avis sans jeton, mais il est limité. Le point d'accès AMP plus riche est celui que la page web du magasin utilise et nécessite un jeton d'accès extrait. Aucun des deux n'est un produit développeur documenté pour la collecte d'avis tiers en vrac, donc traitez les limites de taux et les conditions avec soin.

Comment extraire les avis de Google Play ?

Play sert les avis à partir d'un point d'accès interne par lots renvoyant un JSON imbriqué, paginé par un jeton de continuation et filtrable par ordre de tri. Les bibliothèques open-source maintenues google-play-scraper l'enveloppent et exposent country et lang. Définissez les deux, bouclez le jeton de continuation pour le volume, et répartissez les requêtes sur plusieurs IPs car le point d'accès limite par adresse.

Pourquoi ai-je besoin de proxys pour extraire les avis d'applications ?

Deux raisons. Limitation de taux : les deux magasins limitent rapidement une seule IP, donc les sorties résidentielles rotatives maintiennent le compteur par IP suffisamment bas pour extraire des milliers d'avis. Géographie : les avis sont spécifiques à la vitrine, donc lire correctement les avis d'un pays signifie faire la demande depuis une IP dans ce pays. Les IPs de centre de données dans la mauvaise région donnent des réponses incohérentes ou bloquées.

Les données des app stores sont une mine d'or bloquée par trois obstacles simples - limites, jetons et vitrines. Sachez quel point d'accès frapper, paginez-le correctement, et sortez du bon pays sur des IPs propres, et vous transformez des évaluations dispersées en un flux de voix client par version et par marché.

Laissez la Scraper API renvoyer les données des avis sous forme de JSON