Scrape App Store & Google Play Reviews: Eindpunten, Limieten, Geo
App-recensies zijn het goedkoopste productonderzoek dat je kunt kopen - als je voorbij de pagineringlimieten, de tokenmuren en de landgebonden winkels kunt komen. Hier is de volledige kaart.
App-recensies zijn het goedkoopste klantenonderzoek dat er is: ongefilterde functieverzoeken, bugrapporten gekoppeld aan een specifieke versie en een doorlopende sentimentanalyse van elke concurrent in jouw categorie. De catch is toegang. Beide winkels tonen een handvol recensies op de pagina en verbergen de rest achter feeds, tokens en landgebonden winkels. Deze gids laat zien hoe je App Store en Google Play recensies kunt scrapen - de echte eindpunten, de pagineringlimieten waar niemand je voor waarschuwt, en de geo- en snelheidslimieten die bepalen of je pijplijn verder komt dan een paar honderd regels.
Apple, de gemakkelijke manier: de RSS-feed
Apple biedt een openbare JSON-feed van klantrecensies die geen token nodig heeft. Het is de snelste manier om te beginnen en levert schone, gestructureerde records op - beoordeling, titel, inhoud, auteur, app-versie. De beperking is een harde limiet: de feed levert maximaal 10 pagina's van ongeveer 50 recensies, dus ongeveer 500 recensies per app per winkel, gericht op de meest recente. Voor het monitoren van nieuwe feedback is dat vaak genoeg; voor een volledige geschiedenis niet.
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, de diepgaande manier: de app-store API en zijn token
Om verder te gaan dan 500, gebruik je hetzelfde eindpunt dat de App Store webpagina aanroept (de AMP / MZStore API). Het levert rijkere records op - review-id, bewerkingsvlag, ontwikkelaarsreacties - maar vereist een bearer token dat je eerst van de openbare webpagina van de app moet scrapen en dan opnieuw moet afspelen. Recensies komen in batches van ongeveer twintig, en je pagineert dieper met een offset; hoe groter de offset, hoe ouder de recensies, omdat Apple dit eindpunt niet direct op datum laat sorteren.
De echte beperking hier is snelheidslimitering, en die komt snel vanaf een enkel IP. De oplossing is geen magie - het is een bewuste vertraging plus exponentiële backoff, en het verspreiden van verzoeken over IP's. Praktijkmensen die beide toevoegen, hebben ongeveer 15.000 recensies voor één app binnengehaald zonder de limiter te activeren. Dat is precies waar een roterend residentieel pool van pas komt: elke batch kan vertrekken vanaf een ander schoon IP, zodat de per-IP teller nooit in blokkeergebied komt.
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: gehydrateerde JSON, geen HTML
Play-recensies staan niet in de HTML van de pagina. De winkel laadt ze via een intern batch-eindpunt dat geneste JSON retourneert, gepagineerd met een voortgangstoken in plaats van paginanummers, en gefilterd op sorteervolgorde (nieuwste, beoordeling, behulpzaamheid). Het handmatig reconstrueren van die verzoeken is lastig, dus de meeste teams vertrouwen op de goed onderhouden open-source google-play-scraper bibliotheken (Node en Python), die het eindpunt omwikkelen en country en lang parameters blootstellen. Net als bij Apple verschillen de resultaten per land, dus stel beide expliciet in.
# 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])
Bij echt volume beperkt het Play-eindpunt ook per IP, en de JSON-structuur verschuift periodiek. Als je dat onderhoud liever niet zelf doet, verwijdert een Scraper API die de gehydrateerde gegevens als schone JSON rendert en retourneert beide problemen - het verzorgt de proxying en het parsen zodat je een stabiele vorm consumeert. Dezelfde afwegingen die we beschrijven voor het scrapen van productrecensies op schaal zijn hier direct van toepassing.
Een veldpaar brengt mensen in de war: taal en land zijn niet dezelfde knop. De winkel (land) bepaalt welke recensies er überhaupt zijn; de taalparameter bepaalt welke je terugkrijgt. In een tweetalige markt zoals Canada of Zwitserland wil je vaak beide talen, dus stel ze onafhankelijk in in plaats van aan te nemen dat een land een enkele taal impliceert. Aan de kant van Apple onthullen de rijkere records ook ontwikkelaarsreacties - het openbare antwoord dat een verkoper onder een recensie plaatst - wat een stille waardevolle aanwijzing is voor hoe concurrenten klachten triëren en welke problemen ze publiekelijk kiezen om te beantwoorden.
Geo-winkels zijn het hele punt
Beide winkels zijn georganiseerd per landwinkel, gesleuteld aan een tweeletterige code. De Amerikaanse recensies van een app vertellen je niets over hoe deze in Duitsland, Japan of Brazilië wordt ontvangen - verschillende talen, verschillende klachten, verschillende functiegaten. Om elke winkel eerlijk te lezen, vraag je vanuit een exit-IP in dat land; een datacenter-IP in de verkeerde regio geeft je een inconsistente of geblokkeerde reactie. Met residentiële exits in meer dan 200 landen kun je dezelfde app door elke markt laten lopen en een per-land sentimentkaart bouwen - het ruwe materiaal van serieus ASO-werk.

Van recensies naar ASO-signaal
De extractie is de saaie helft. De beloning is wat je erbovenop berekent: cluster recensie-tekst in terugkerende thema's, volg sentiment per app-versie om de release te vangen die je beoordeling kelderde, houd concurrenten in de gaten voor functieverzoeken die jouw product al beantwoordt, en vergelijk klachtenpatronen over winkels heen. Koppel elke recensie aan zijn version veld en je krijgt een regressietijdlijn die geen enkel analytisch dashboard je biedt. Gerelateerd reputatiewerk - Trustpilot review mining - stapelt netjes naast app-store data voor een volledig klantstembeeld.
Verkrijg residentiële IP's voor elke app-winkel
Veelgestelde vragen
Hoe scrape ik App Store recensies in Python?
Begin met Apple's openbare RSS-klantrecensies JSON-feed - geen token, gestructureerde output, maar beperkt tot ongeveer 500 recente recensies per app per winkel. Om dieper te gaan, roep de AMP app-store API aan met een bearer token gescrapet van de webpagina van de app, pagineer met een offset, en voeg vertraging plus backoff toe. Routeer elke winkel via een residentieel IP in dat land.
Is er een officiële App Store recensies API?
Apple's openbare RSS-feed is het dichtstbijzijnde aan een officiële, tokenloze recensiebron, maar het is beperkt. Het rijkere AMP-eindpunt is wat de eigen webpagina van de winkel gebruikt en vereist een gescrapet bearer token. Geen van beide is een gedocumenteerd ontwikkelaarsproduct voor bulkverzameling van recensies door derden, dus behandel snelheidslimieten en voorwaarden met zorg.
Hoe scrape ik Google Play recensies?
Play levert recensies van een intern batch-eindpunt dat geneste JSON retourneert, gepagineerd door een voortgangstoken en filterbaar op sorteervolgorde. De onderhouden open-source google-play-scraper bibliotheken omwikkelen het en stellen country en lang bloot. Stel beide in, lus het voortgangstoken voor volume, en verspreid verzoeken over IP's omdat het eindpunt per adres beperkt.
Waarom heb ik proxies nodig om app-recensies te scrapen?
Twee redenen. Snelheidslimitering: beide winkels beperken snel een enkel IP, dus roterende residentiële exits houden de per-IP teller laag genoeg om duizenden recensies binnen te halen. Geografie: recensies zijn winkel-specifiek, dus het nauwkeurig lezen van recensies van een land betekent aanvragen vanaf een IP in dat land. Datacenter IP's in de verkeerde regio geven inconsistente of geblokkeerde reacties.
App-store data is een goudmijn die wordt geblokkeerd door drie simpele obstakels - limieten, tokens en winkels. Weet welk eindpunt je moet raken, pagina correct en vertrek vanuit het juiste land op schone IP's, en je verandert verspreide sterrenbeoordelingen in een per-versie, per-markt klantstemfeed.