Looking for international version of our service? Go to 2captcha.com

Логотип «RuCaptcha»Перейти на главную страницу
Туториалы по обходу капчи

Эта статья была полезной?

Как парсить Google Play

Грегори Фишер
Грегори Фишер

Технический специалист

У Google Play нет публичного API для данных магазина, а его цифры сложнее, чем кажутся: у одного и того же приложения в каждой стране свой рейтинг, а количество оценок общее для всех. В этом руководстве вы будете использовать открытый проект 2scraper/googleplay-scraper, чтобы выгружать в JSON или CSV приложения, результаты поиска, каталоги разработчиков и полную историю отзывов. В каждой строке будут указаны страна и язык.

Парсер работает локально на Playwright, и для базового использования ему не нужны ни аккаунт, ни ключ. Вы также узнаете, что включить, когда Google Play начнёт отказывать в запросах: прокси, решение reCAPTCHA через 2Captcha или удалённый браузер.

Что мы соберём

Один консольный инструмент с пятью режимами:

Режим Что возвращает Для чего
listing Приложения из сетки жанра, по полкам страницы Отслеживание категорий, топы
search Приложения по ключевому слову ASO и подбор ключевых слов
app Полные данные по одному package ID: точное число установок, гистограмма оценок, версия, контакты разработчика Мониторинг конкурентов
developer Весь каталог разработчика Анализ издателей
reviews История отзывов, сначала новые, с пагинацией по continuation-токенам Анализ тональности, работа поддержки

Каждый запуск сохраняет один файл, в котором у приложения может быть до 46 полей: title, brand (разработчик), category, price, currency, installs, installs_min, installs_exact, content_rating, iap_price_range, rating, rating_raw, review_count, review_text_count, histogram_1–histogram_5, version, updated_at, gl, hl и другие. Часть полей заполняется только в режиме app, подробнее в разделе «Ограничения».

Что понадобится

  • Python от 3.9 до 3.13.
  • Playwright с Chromium (рекомендуется). Версии для Selenium и pyppeteer есть для совместимости; pyppeteer фактически больше не поддерживается.
  • Отдельное виртуальное окружение для каждого движка: Playwright и pyppeteer требуют разные версии pyee, а pyppeteer и Selenium конфликтуют по urllib3.
  • По желанию: API-ключ 2Captcha для решения капчи и фингерпринтов, прокси или endpoint Browser API. Если вы впервые работаете с API, начните с Quick start.

Установка

bash Copy
git clone https://github.com/2scraper/googleplay-scraper.git
cd googleplay-scraper
python3 -m venv .venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate

pip install -r requirements.txt -r requirements-playwright.txt
playwright install chromium

cp .env.example .env
python3 env_config.py   # показывает загруженные настройки, не печатая секреты

Храните ключи и данные прокси в .env, а не в командной строке. Для простого локального запуска оставьте файл пустым.

Быстрый старт

bash Copy
# Listing: сетка жанра, 3 страницы полок
python3 playwright_scraper.py --mode listing --category GAME --pages 3

# Search: приложения по ключевому слову
python3 playwright_scraper.py --mode search --query "password manager"

# App: полные данные в немецком магазине
python3 playwright_scraper.py --mode app --app-id com.whatsapp --gl DE --hl de

# Developer: весь каталог разработчика
python3 playwright_scraper.py --mode developer --developer 5700313618786177705

# Reviews: 10 страниц, сначала новые, без имён и аватаров авторов
python3 playwright_scraper.py --mode reviews --app-id com.whatsapp --pages 10 --no-authors

# Вывод: JSON, CSV или оба формата
python3 playwright_scraper.py --mode search --query vpn --format both --out vpn_apps

Значения по умолчанию: --gl US, --hl en, --format json, --out googleplay_apps, --pages 1, --retries 2. Отзывы идут от новых к старым, другой сортировки нет; размер пачки задаёт --reviews-per-call (по умолчанию 200).

Как работает парсер

Рейтинг считается по странам. Google Play вычисляет рейтинг приложения отдельно для каждого рынка, а количество оценок у него одно на весь мир. В тесте из репозитория 22.09.2026 одно приложение (com.rovio.baba) запросили с одного IP, меняя только страну:

Страна (gl) Рейтинг Валюта Число оценок
BR 4.49 BRL 6 312 298
IN 4.13 INR 6 312 298
US 4.08 USD 6 312 298
JP 3.96 JPY 6 312 298
DE 3.90 EUR 6 312 298

Поэтому в каждой строке есть gl и hl. Не усредняйте рейтинги разных рынков и всегда явно указывайте --gl, когда сравниваете приложения.

Оценки — это не отзывы. review_count — число оценок звёздами, review_text_count — число письменных отзывов, оно намного меньше. rating — округлённое значение, которое показывает магазин (4.7), rating_raw — точное число из данных страницы (4.714563).

Данные берутся из встроенных данных страницы, а не из CSS. Парсер читает структурированные данные, которые Google Play встраивает в страницы, поэтому редизайн видимой вёрстки его не ломает. sku — это package ID, он одинаков во всех странах; category — отображаемый текст, он меняется вместе с --hl.

Пагинация зависит от режима:

  • Listing: у полок сетки свои URL. --pages N проходит по ним и останавливается, когда страница не добавляет новых package ID.
  • Search: пагинации нет. В тестах поиск вернул 22 приложения по запросу «game», 30 по «vpn» и 50 по «a». Если указать --pages больше 1, парсер выведет предупреждение.
  • Reviews: строго последовательно по continuation-токенам, поэтому параллельно не запускается. В тестах пачки до 2000 отзывов за запрос возвращались полностью; дубликаты отсекаются по review_id.

Защита от ботов и капча в Google Play

По умолчанию Google Play открыт. В тестах репозитория 22.09.2026 все пять маршрутов отдали HTTP 200 с одного IP дата-центра без cookie и без ключа, и ни в одном из двенадцати снимков не встретилась капча. Это подтверждает ежедневный контрольный запуск с чистого раннера GitHub. Прокси и платные инструменты нужны для объёма и географии: когда вы парсите много или из многих стран.

Если Google всё же начнёт блокировать, у парсера есть четыре инструмента. Все они выключены, пока вы их не включите.

1. Решение reCAPTCHA через 2Captcha. Парсер находит на странице reCAPTCHA v2 и reCAPTCHA v3, отправляет задачу без прокси в 2Captcha и подставляет полученный токен. Когда решать, задаёт --solve-captcha: never, when-blocked (по умолчанию) или always. На каждую страницу даётся одна попытка решения.

bash Copy
python3 playwright_scraper.py --mode listing --category GAME --pages 5 \
  --twocaptcha-key "$TWOCAPTCHA_KEY" --solve-captcha when-blocked --min-score 0.7

--min-score (по умолчанию 0.3) — минимальный запрашиваемый score для reCAPTCHA v3. Параметры задач описаны в документации по reCAPTCHA v2 и reCAPTCHA v3.

2. Прокси. Передайте --proxy или --proxy-file. По умолчанию прокси меняется на каждой странице (--proxy-rotate per-page): каждая страница сетки открывается в новом браузере через следующий прокси. Режим per-run сохраняет один IP на весь запуск; отзывы всегда идут в одной сессии, потому что к ней привязаны continuation-токены. Если страница заблокирована, парсер переходит к следующему прокси и тратит попытку из --proxy-block-retries; если сломан сам прокси (ERR_PROXY, ERR_TUNNEL, HTTP 407), тратится обычная попытка из --retries. Резидентные прокси 2Captcha покрывают страны, которые вы указываете в --gl; как сгенерировать списки, описано в документации Proxy API. Selenium не умеет авторизоваться на прокси и удаляет логин и пароль с предупреждением.

3. Удалённый браузер: 2Captcha Browser API. Browser API запускает Chromium на своей стороне и отдаёт его по CDP. Передайте endpoint через --cdp-endpoint и не совмещайте его с --proxy и --fingerprint: IP и отпечаток браузера удалённый браузер берёт на себя. Настройка описана в документации Browser API. Авторизованные CDP-endpoint'ы поддерживает только Playwright.

4. Фингерпринты. --fingerprint загружает реальный профиль браузера из 2Captcha Browser fingerprints; --fp-tags и --fp-country сужают выбор. Нужен --twocaptcha-key.

Если делаете свою интеграцию, загляните в документацию API, песочницу для отладки и коды ошибок.

Выходные файлы и коды завершения

Каждый запуск сохраняет файл с результатами и рядом файл .meta.json: статус (complete, partial или failed), stop_reason, сколько страниц запрошено, обработано и не удалось, число строк, начальный и конечный URL, время завершения, gl и hl. Файлы записываются атомарно: парсер пишет временный файл в той же папке, сбрасывает его на диск и переименовывает поверх целевого, так что прерванный запуск не оставит половину файла. Если запуск ничего не собрал, он ничего и не пишет, и вчерашний рабочий файл сохраняется.

Код завершения сообщает планировщику, что произошло, без разбора логов:

Код Значение Что делать
0 Готово Данные записаны.
1 Сбой Непредвиденная ошибка; смотрите traceback.
2 Ошибка вызова Исправьте команду: не хватает флага, --concurrency больше 1 для отзывов, отрицательный --retries, --proxy вместе с --cdp-endpoint, --fingerprint без ключа. Сюда же попадает неподдерживаемая страна: Google Play отвечает HTTP 400, и парсер сразу останавливается без повторов.
3 Блокировка Страница проверки до начала разбора. Включите --solve-captcha, добавьте прокси или используйте --cdp-endpoint.
4 Нет приложений Запуск завершился, но ничего не нашёл. Несуществующий package ID попадает сюда (HTTP 404, not_found), а не в код 3.
5 Контент не получен Страницы не загрузились или удалённый браузер отказал в подключении. Файл не записывается.
6 Частичный результат Часть страниц обработана. Смотрите stop_reason в .meta.json.

При выводе в CSV ячейки, похожие на формулы, экранируются, чтобы вредоносное название приложения не выполнилось в Excel; в .meta.json записывается, сколько ячеек экранировано.

Пример вывода

Строка режима listing из файла sample_output.json в репозитории (снята 22.09.2026; показана часть из 46 полей). Поля, которые заполняются только в режиме app, здесь равны null:

json Copy
{
  "source": "play.google.com",
  "scraped_at": "2026-09-22T09:50:58.688595+00:00",
  "url": "https://play.google.com/store/apps/details?id=com.amazon.clouddrive.photos&hl=en&gl=US",
  "sku": "com.amazon.clouddrive.photos",
  "title": "Amazon Photos: Photo & Video",
  "brand": "Amazon Mobile LLC",
  "price": 0.0,
  "currency": "USD",
  "rating": 4.7,
  "rating_raw": 4.714563,
  "review_count": null,
  "category": "Photography",
  "gl": "US",
  "hl": "en",
  "genre_id": null,
  "installs": "50,000,000+",
  "installs_min": 50000000,
  "installs_exact": null,
  "content_rating": "Everyone",
  "iap_price_range": "$0.99 - $11.99 per item",
  "offers_iap": true,
  "histogram_5": null,
  "version": null,
  "screenshot_count": 24,
  "shelf": "Take better photos",
  "shelf_rank": 2
}

Работа с результатами: одно приложение в разных странах

Раз рейтинг зависит от рынка, полезный первый отчёт — рейтинг одного приложения в нескольких странах. Запустите режим app для каждой страны:

bash Copy
for gl in US DE JP IN BR; do
  python3 playwright_scraper.py --mode app --app-id com.whatsapp --gl $gl --out app_$gl
done

Затем соберите строки в одну таблицу:

python Copy
import json
from pathlib import Path

rows = []
for path in sorted(Path(".").glob("app_*.json")):
    if path.name.endswith(".meta.json"):
        continue
    for row in json.loads(path.read_text(encoding="utf-8")):
        rows.append(row)

rows.sort(key=lambda r: r.get("rating_raw") or 0, reverse=True)

print(f"{'Рынок':<8}{'Рейтинг':>8}{'Оценок':>16}{'Отзывов':>12}")
for r in rows:
    print(
        f"{r['gl']:<8}"
        f"{(r.get('rating_raw') or 0):>8.2f}"
        f"{(r.get('review_count') or 0):>16,}"
        f"{(r.get('review_text_count') or 0):>12,}"
    )

Число оценок во всех строках должно совпадать, а рейтинг — нет. Если нужно ранжировать много приложений, запускайте режим app для каждого пакета: в строках listing нет review_count.

Ограничения

  • В строках listing нет genre_id, installs_exact и review_count: плитки сетки их не показывают. Для этих полей используйте режим app.
  • Поиск возвращает только одну страницу результатов (в тестах от 22 до 50 приложений).
  • Отзывы сортируются только от новых к старым; фильтра по оценке нет.
  • Разделы /store/books и /store/movies не поддерживаются; парсер работает с приложениями и играми.
  • Счётчики у популярных приложений постоянно меняются, поэтому два запуска с разницей в минуту могут отличаться.

FAQ

Законно ли парсить Google Play?
Парсер читает публичные страницы магазина без входа в аккаунт. Допустимо ли ваше использование, зависит от законов вашей страны и условий Google Play, поэтому проверьте и то и другое и не превышайте разумную частоту запросов. Это не юридическая консультация.

Есть ли у Google Play официальный API для этого?
Google Play Developer API работает только с приложениями, которые вы публикуете сами. Для рейтингов, установок и отзывов чужих приложений публичного API нет, поэтому парсеры читают страницы магазина.

Почему рейтинг отличается от того, что я вижу на телефоне?
Рейтинг считается по странам. Укажите в --gl ту же страну, что и в магазине на телефоне.

Сколько отзывов можно получить?
Предела пока не нашли: отзывы загружаются последовательно, пока магазин их отдаёт. Увеличьте --pages и --reviews-per-call (в тестах до 2000 за запрос возвращались полностью).

Нужен ли 2Captcha, чтобы парсить Google Play?
Для небольших задач нет. Добавьте прокси, --solve-captcha или Browser API, когда растут объёмы, нужно много стран или начинает появляться код 3.

Заключение

Google Play — один из самых простых магазинов для парсинга и один из самых простых для неверного прочтения данных. Сохраняйте gl и hl в каждой строке, не путайте оценки с письменными отзывами, используйте режим app, когда нужны точные установки, и стройте автоматизацию на кодах завершения. Когда объёмы вырастут, подключите прокси, решение reCAPTCHA или удалённый браузер без изменений в коде.

С чего начать: зарегистрируйтесь в 2Captcha, чтобы получить API-ключ, или попробуйте Browser API. Полный код лежит на GitHub.

Документация