Scraping delle recensioni su App Store e Google Play: Endpoint, Limiti, Geolocalizzazione
Le recensioni delle app sono la ricerca di prodotto più economica che puoi acquistare - se riesci a superare i limiti di paginazione, i muri di token e i negozi per paese. Ecco la mappa completa.
Le recensioni delle app sono la ricerca clienti più economica in circolazione: richieste di funzionalità non filtrate, segnalazioni di bug legate a una versione specifica e una lettura continua del sentimento su ogni concorrente nella tua categoria. La difficoltà è l'accesso. Entrambi gli store mostrano una manciata di recensioni sulla pagina e nascondono il resto dietro feed, token e negozi per paese. Questa guida mappa come scrapare le recensioni su App Store e Google Play - i veri endpoint, i limiti di paginazione di cui nessuno ti avverte, e le realtà di geolocalizzazione e limitazione di velocità che decidono se la tua pipeline sopravvive oltre qualche centinaio di righe.
Apple, il modo facile: il feed RSS
Apple espone un feed JSON pubblico delle recensioni dei clienti che non richiede token. È il modo più veloce per iniziare e restituisce record puliti e strutturati - valutazione, titolo, corpo, autore, versione dell'app. La limitazione è un tetto rigido: il feed serve al massimo 10 pagine di circa 50 recensioni, quindi circa 500 recensioni per app per negozio, sbilanciate verso le più recenti. Per monitorare feedback freschi è spesso sufficiente; per una storia completa non lo è.
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, il modo approfondito: l'API dell'app store e il suo token
Per superare le 500, usi lo stesso endpoint che la pagina web dell'App Store chiama (l'API AMP / MZStore). Restituisce record più ricchi - id recensione, flag di modifica, risposte degli sviluppatori - ma richiede un token bearer che prima devi estrarre dalla pagina web pubblica dell'app, poi riprodurre. Le recensioni arrivano in lotti di circa venti, e puoi paginare più in profondità con un offset; più grande è l'offset, più vecchie tendono ad essere le recensioni, perché Apple non permette a questo endpoint di ordinare direttamente per data.
Il vero vincolo qui è la limitazione di velocità, e arriva rapidamente da un singolo IP. La soluzione non è magica - è un ritardo deliberato più un backoff esponenziale, e la distribuzione delle richieste su più IP. I professionisti che aggiungono entrambi hanno estratto circa 15.000 recensioni per un'app senza attivare il limitatore. È esattamente qui che un pool residenziale rotante si ripaga: ogni lotto può uscire da un IP pulito diverso, quindi il contatore per IP non sale mai in territorio di blocco.
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

Google Play: JSON idratato, non HTML
Le recensioni di Play non si trovano nell'HTML della pagina. Lo store le carica tramite un endpoint batch interno che restituisce JSON annidato, paginato con un token di continuazione anziché numeri di pagina, e filtrato per ordine di classificazione (più recenti, valutazione, utilità). Ricostruire quelle richieste manualmente è complicato, quindi la maggior parte dei team si affida alle librerie open-source google-play-scraper ben mantenute (Node e Python), che avvolgono l'endpoint ed espongono i parametri country e lang. Come con Apple, i risultati per paese differiscono, quindi impostali entrambi esplicitamente.
# 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 volumi reali l'endpoint Play limita anche per IP, e la struttura JSON cambia periodicamente. Se preferisci non occuparti di quella manutenzione, un Scraper API che rende e restituisce i dati idratati come JSON pulito elimina entrambi i problemi - gestisce il proxying e il parsing così consumi una forma stabile. La stessa logica di compromesso che descriviamo per scraping delle recensioni di prodotto su larga scala si applica direttamente qui.
Una coppia di campi confonde le persone: lingua e paese non sono la stessa manopola. Il negozio (paese) decide quali recensioni esistono; il parametro lingua decide quali di esse ottieni. In un mercato bilingue come il Canada o la Svizzera spesso vuoi entrambe le lingue, quindi impostale indipendentemente piuttosto che assumere che un paese implichi una sola lingua. Sul lato Apple, i record più ricchi espongono anche le risposte degli sviluppatori - la risposta pubblica che un venditore pubblica sotto una recensione - che è un segnale silenziosamente prezioso per come i concorrenti gestiscono i reclami e quali problemi scelgono di rispondere pubblicamente.
I negozi geolocalizzati sono il punto centrale
Entrambi gli store sono organizzati per negozio paese, identificati da un codice a due lettere. Le recensioni statunitensi di un'app non ti dicono nulla su come viene accolta in Germania, Giappone o Brasile - lingue diverse, lamentele diverse, lacune di funzionalità diverse. Per leggere onestamente ogni negozio richiedi da un IP di uscita in quel paese; un IP datacenter nella regione sbagliata ti dà una risposta incoerente o bloccata. Con uscite residenziali in oltre 200 paesi puoi far passare la stessa app attraverso ogni mercato e costruire una mappa del sentimento per paese - la materia prima del lavoro serio di ASO.

Dalle recensioni al segnale ASO
L'estrazione è la metà noiosa. Il guadagno è ciò che calcoli sopra: raggruppa il testo delle recensioni in temi ricorrenti, traccia il sentimento per versione dell'app per individuare il rilascio che ha abbassato la tua valutazione, osserva i concorrenti per richieste di funzionalità che il tuo prodotto già soddisfa, e confronta i modelli di reclamo tra i negozi. Collega ogni recensione al suo campo version e ottieni una linea temporale di regressione che nessun dashboard analitico ti offre. Il lavoro di reputazione correlato - estrazione delle recensioni Trustpilot - si integra perfettamente con i dati dell'app store per un quadro completo della voce del cliente.
Ottieni IP residenziali per ogni negozio app
Domande frequenti
Come faccio a fare scraping delle recensioni su App Store in Python?
Inizia con il feed JSON delle recensioni dei clienti pubbliche di Apple - nessun token, output strutturato, ma limitato a circa 500 recensioni recenti per app per negozio. Per andare più a fondo, chiama l'API AMP dell'app store con un token bearer estratto dalla pagina web dell'app, pagina con un offset, e aggiungi ritardo più backoff. Instrada ogni negozio attraverso un IP residenziale in quel paese.
Esiste un'API ufficiale per le recensioni su App Store?
Il feed RSS pubblico di Apple è la cosa più vicina a una fonte ufficiale di recensioni senza token, ma è limitato. L'endpoint AMP più ricco è quello che la pagina web dello store utilizza e richiede un token bearer estratto. Nessuno dei due è un prodotto sviluppatore documentato per la raccolta di recensioni di terze parti in massa, quindi tratta i limiti di velocità e i termini con attenzione.
Come faccio a fare scraping delle recensioni su Google Play?
Play serve le recensioni da un endpoint batch interno che restituisce JSON annidato, paginato da un token di continuazione e filtrabile per ordine di classificazione. Le librerie open-source google-play-scraper mantenute lo avvolgono ed espongono country e lang. Impostali entrambi, cicla il token di continuazione per volume, e distribuisci le richieste su più IP perché l'endpoint limita per indirizzo.
Perché ho bisogno di proxy per fare scraping delle recensioni delle app?
Due motivi. Limitazione di velocità: entrambi gli store limitano rapidamente un singolo IP, quindi le uscite residenziali rotanti mantengono il contatore per IP abbastanza basso da estrarre migliaia di recensioni. Geografia: le recensioni sono specifiche per negozio, quindi leggere accuratamente le recensioni di un paese significa richiedere da un IP in quel paese. Gli IP datacenter nella regione sbagliata ottengono risposte incoerenti o bloccate.
I dati degli app store sono una miniera d'oro bloccata da tre semplici ostacoli - limiti, token e negozi. Conosci quale endpoint colpire, paginalo correttamente, ed esci dal paese giusto su IP puliti, e trasformi valutazioni sparse in un feed di voce del cliente per versione e per mercato.
Lascia che lo Scraper API restituisca i dati delle recensioni come JSON