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

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

Как парсить 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.

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