Scrapowanie recenzji z App Store i Google Play: Endpointy, Limity, Geo
Recenzje aplikacji to najtańsze badanie produktu, jakie możesz kupić - jeśli uda ci się pokonać limity paginacji, ściany tokenów i sklepy w poszczególnych krajach. Oto cała mapa.
Recenzje aplikacji to najtańsze badanie klientów: nieprzefiltrowane prośby o funkcje, raporty o błędach powiązane z konkretną wersją i bieżące odczyty nastrojów dotyczące każdego konkurenta w twojej kategorii. Haczyk tkwi w dostępie. Oba sklepy pokazują garść recenzji na stronie i ukrywają resztę za kanałami, tokenami i sklepami w poszczególnych krajach. Ten przewodnik mapuje, jak scrapować recenzje z App Store i Google Play - prawdziwe endpointy, limity paginacji, o których nikt ci nie mówi, oraz rzeczywistości geo i limitów, które decydują, czy twoja linia przetrwa więcej niż kilka setek wierszy.
Apple, łatwa droga: kanał RSS
Apple udostępnia publiczny kanał JSON z recenzjami klientów, który nie wymaga tokenu. To najszybszy sposób na rozpoczęcie i zwraca czyste, ustrukturyzowane rekordy - ocena, tytuł, treść, autor, wersja aplikacji. Ograniczenie to twardy limit: kanał obsługuje maksymalnie 10 stron po około 50 recenzji, więc około 500 recenzji na aplikację na sklep, z przewagą najnowszych. Do monitorowania świeżych opinii to często wystarcza; do pełnej historii już nie.
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, głęboka droga: API app-store i jego token
Aby przejść poza 500, używasz tego samego endpointu, który wywołuje strona internetowa App Store (API AMP / MZStore). Zwraca bogatsze rekordy - id recenzji, flaga edycji, odpowiedzi dewelopera - ale wymaga tokenu dostępu, który najpierw musisz zeskrobać ze strony internetowej aplikacji, a następnie odtworzyć. Recenzje przychodzą w partiach po około dwadzieścia, a paginujesz głębiej za pomocą offset; im większy offset, tym starsze recenzje, ponieważ Apple nie pozwala na sortowanie tego endpointu bezpośrednio według daty.
Prawdziwym ograniczeniem tutaj jest limitowanie szybkości, które pojawia się szybko z jednego adresu IP. Rozwiązanie to nie magia - to celowe opóźnienie plus wykładnicze wycofanie i rozłożenie żądań na różne adresy IP. Praktycy, którzy dodali oba, zdołali pobrać około 15 000 recenzji dla jednej aplikacji bez przekroczenia limitu. To dokładnie tam, gdzie rotacyjna pula rezydencyjna się opłaca: każda partia może wychodzić z innego czystego IP, więc licznik na IP nigdy nie wspina się do poziomu blokady.
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: nawodniony JSON, nie HTML
Recenzje Play nie znajdują się w HTML strony. Sklep ładuje je przez wewnętrzny endpoint batch, który zwraca zagnieżdżony JSON, paginowany za pomocą tokenu kontynuacji zamiast numerów stron i filtrowany według kolejności sortowania (najnowsze, ocena, przydatność). Ręczne odtwarzanie tych żądań jest skomplikowane, więc większość zespołów opiera się na dobrze utrzymanych bibliotekach open-source google-play-scraper (Node i Python), które opakowują endpoint i udostępniają parametry country i lang. Podobnie jak w przypadku Apple, wyniki w poszczególnych krajach różnią się, więc ustaw oba parametry jawnie.
# 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])
Przy rzeczywistej objętości endpoint Play również ogranicza szybkość na IP, a struktura JSON zmienia się okresowo. Jeśli wolisz nie zajmować się tą konserwacją, Scraper API, który renderuje i zwraca nawodnione dane jako czysty JSON, usuwa oba problemy - zajmuje się zarówno proxy, jak i parsowaniem, więc konsumujesz stabilny kształt. Ta sama logika kompromisu, którą opisujemy dla scrapowania recenzji produktów na dużą skalę, ma tutaj bezpośrednie zastosowanie.
Jedna para pól wprowadza ludzi w błąd: język i kraj to nie to samo pokrętło. Sklep (kraj) decyduje, które recenzje w ogóle istnieją; parametr języka decyduje, które z nich otrzymasz. Na rynku dwujęzycznym, takim jak Kanada czy Szwajcaria, często chcesz oba języki, więc ustawiaj je niezależnie, zamiast zakładać, że kraj oznacza jeden język. Po stronie Apple bogatsze rekordy również ujawniają odpowiedzi dewelopera - publiczną odpowiedź, którą sprzedawca zamieszcza pod recenzją - co jest cennym sygnałem, jak konkurenci radzą sobie z reklamacjami i które problemy wybierają do publicznej odpowiedzi.
Sklepy geo to cały sens
Oba sklepy są zorganizowane według sklepów krajowych, oznaczonych dwuliterowym kodem. Recenzje aplikacji w USA nie mówią ci nic o tym, jak odbierana jest w Niemczech, Japonii czy Brazylii - różne języki, różne skargi, różne luki w funkcjach. Aby uczciwie przeczytać każdy sklep, musisz żądać z adresu IP w tym kraju; adres IP centrum danych w niewłaściwym regionie daje ci niespójną lub zablokowaną odpowiedź. Dzięki rezydencyjnym wyjściom w ponad 200 krajach możesz przepuścić tę samą aplikację przez każdy rynek i zbudować mapę nastrojów dla każdego kraju - surowy materiał do poważnej pracy ASO.

Od recenzji do sygnału ASO
Ekstrakcja to nudna połowa. Nagroda to to, co obliczasz na górze: grupuj tekst recenzji w powtarzające się tematy, śledź nastroje według wersji aplikacji, aby uchwycić wydanie, które obniżyło twoją ocenę, obserwuj konkurentów pod kątem próśb o funkcje, na które twój produkt już odpowiada, i porównuj wzorce skarg w różnych sklepach. Powiąż każdą recenzję z polem version, a otrzymasz oś czasu regresji, której nie daje ci żaden pulpit analityczny. Powiązana praca nad reputacją - wydobywanie recenzji Trustpilot - łączy się z danymi ze sklepu z aplikacjami, tworząc pełny obraz głosu klienta.
Uzyskaj rezydencyjne IP dla każdego sklepu z aplikacjami
Często zadawane pytania
Jak scrapować recenzje z App Store w Pythonie?
Zacznij od publicznego kanału JSON z recenzjami klientów Apple - bez tokenu, ustrukturyzowane wyjście, ale ograniczone do około 500 najnowszych recenzji na aplikację na sklep. Aby pójść głębiej, wywołaj API AMP app-store z tokenem dostępu zeskrobanym ze strony internetowej aplikacji, paginuj za pomocą offset i dodaj opóźnienie plus wycofanie. Przekieruj każdy sklep przez rezydencyjne IP w tym kraju.
Czy istnieje oficjalne API recenzji App Store?
Publiczny kanał RSS Apple to najbliższa rzecz do oficjalnego źródła recenzji bez tokenu, ale jest ograniczony. Bogatszy endpoint AMP to to, co używa strona internetowa sklepu i wymaga zeskrobanego tokenu dostępu. Żaden z nich nie jest udokumentowanym produktem deweloperskim do masowego zbierania recenzji przez strony trzecie, więc traktuj limity szybkości i warunki z ostrożnością.
Jak scrapować recenzje z Google Play?
Play obsługuje recenzje z wewnętrznego endpointu batch, zwracającego zagnieżdżony JSON, paginowany za pomocą tokenu kontynuacji i filtrowany według kolejności sortowania. Utrzymywane biblioteki open-source google-play-scraper opakowują go i udostępniają country i lang. Ustaw oba, pętlij token kontynuacji dla objętości i rozłóż żądania na IP, ponieważ endpoint ogranicza szybkość na adres.
Dlaczego potrzebuję proxy do scrapowania recenzji aplikacji?
Dwa powody. Limitowanie szybkości: oba sklepy szybko ograniczają jedno IP, więc rotacyjne wyjścia rezydencyjne utrzymują licznik na IP na tyle nisko, aby pobrać tysiące recenzji. Geografia: recenzje są specyficzne dla sklepu, więc aby dokładnie odczytać recenzje z danego kraju, musisz żądać z IP w tym kraju. Adresy IP centrum danych w niewłaściwym regionie dają niespójne lub zablokowane odpowiedzi.
Dane ze sklepów z aplikacjami to kopalnia złota zablokowana przez trzy proste przeszkody - limity, tokeny i sklepy. Wiedz, który endpoint uderzyć, paginuj go poprawnie i wychodź z właściwego kraju na czystych IP, a zamienisz rozproszone oceny gwiazdkowe w strumień głosu klienta na wersję i rynek.