1. 2scraper
  2. Business data & reviews
  3. Google Play
Open source · MITRuns with no key, proxy or account

Google Play Scraper

Apps, installs, rating histograms and unbounded reviews from Google Play — per market, with no key or proxy.

  • Playwright
  • Selenium
  • Puppeteer
  • Scraping Browser API
  • JSON
  • CSV
googleplay-scraper
# Category listing
$ python3 playwright_scraper.py --mode listing --category GAME --pages 3
✓ 10 sample rows · 46 columns in sample_output.json
5modes: listing, search, app, developer, reviews
0keys, proxies or accounts needed
2,000reviews in one call, no ceiling found (Sep 2026)
4interchangeable browser back ends
Available Google Play scrapers

What the Google Play scraper collects

Reads Google Play genre grids, keyword search, full app pages, developer catalogues and review histories into one row schema. Rows carry install buckets and exact installs, rating histograms, in-app-purchase ranges, content ratings and per-market price, with the market (gl/hl) on every row, as JSON or CSV.

Category listing

Input: A genre such as GAME

Follows the genre page's own shelves and emits one app row per tile: title, developer, price, installs, content rating and displayed rating.

Keyword search

Input: A search query

The apps Google Play returns for the query, in the same row class as the listing mode.

App details

Input: A package id

Everything the store page publishes: rating histogram, exact install count, version, update date, developer contacts, privacy policy and chart standing.

Developer catalogue

Input: A developer id

Every app in a developer's grid, one row per app.

Reviews

Input: A package id

Newest-first reviews with score and text, paged by the store's continuation token as far as you ask; --no-authors drops reviewer identity.

Quick start

From zero to Google Play data in 3 steps

  1. Install

    Clone the repository and install one browser engine. Python 3.9+.

    $ git clone https://github.com/2scraper/googleplay-scraper.git && cd googleplay-scraper
    $ pip install -r requirements.txt -r requirements-playwright.txt
    $ playwright install chromium
    $ python3 playwright_scraper.py --mode listing --category GAME --pages 3
  2. Run a scraper

    Pick what you need and run it. Every flag is documented in the README.

    $ python3 playwright_scraper.py --mode listing --category GAME --pages 3
  3. Get structured data

    Rows land in JSON or CSV (--format), with a .meta.json sidecar recording status, pages fetched and why the run stopped.

Output

Google Play data fields

46 columns per row in a predictable schema. The most useful ones:

FieldWhat it holds
skuThe app's package id — the join key across modes and markets
titleApp name
brandThe developer
pricePrice in the market's currency (0.0 for free)
currencyCurrency of the market the row was read in
ratingThe rating the store displays for this market
rating_rawThe unrounded rating from the payload
review_countNumber of ratings (global)
review_text_countNumber of written reviews — a different, much smaller number
installsThe install bucket the store prints, e.g. 1,000,000,000+
installs_exactThe exact install count (app pages only)
histogram_5Five-star count of the rating histogram (histogram_1-5)
content_ratingContent rating, e.g. Everyone
iap_price_rangeIn-app purchase price range
glMarket (country) the row describes
updated_atLast update date (app pages)
[
  {
    "source": "play.google.com",
    "scraped_at": "2026-09-22T09:50:58.688297+00:00",
    "url": "https://play.google.com/store/apps/details?id=com.google.android.apps.photosgo&hl=en&gl=US",
    "sku": "com.google.android.apps.photosgo",
    "title": "Gallery",
    "brand": "Google LLC",
    "price": 0.0,
    "currency": "USD",
    "original_price": null,
    "discount_pct": null,
    "rating": 4.2,
    "review_count": null,
    "in_stock": true,
    "image_url": "https://play-lh.googleusercontent.com/D6U4lgpOifIXSJ_bDGwYqWCfsuc942FenrVUUHOtdlr5O0cNc…",
    "category": "Photography",
    "price_source": "listing",
    "page": 1,
    "position": 1,
    "gl": "US",
    "hl": "en",
    "developer_id": null,
    "genre_id": null,
    "installs": "1,000,000,000+",
    "installs_min": 1000000000,
    "installs_exact": null,
    "content_rating": "Everyone",
    "iap_price_range": null,
    "offers_iap": null,
    "rating_raw": 4.215932,
    "review_text_count": null,
    "histogram_1": null,
    "histogram_2": null,
    "histogram_3": null,
    "histogram_4": null,
    "histogram_5": null,
    "version": null,
    "updated_at": null,
    "description": "Meet Gallery, a smart, light and fast photo and video gallery built by Google to help y…",
    "developer_email": null,
    "developer_website": null
  },
  {
    "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",
    "original_price": null,
    "discount_pct": null,
    "rating": 4.7,
    "review_count": null,
    "in_stock": true,
    "image_url": "https://play-lh.googleusercontent.com/rB_nbtBTBuZ1yqOB7wHm15sdNce0MzmPpPxuxmRJ9_1l11PzF…",
    "category": "Photography",
    "price_source": "listing",
    "page": 1,
    "position": 2,
    "gl": "US",
    "hl": "en",
    "developer_id": null,
    "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,
    "rating_raw": 4.714563,
    "review_text_count": null,
    "histogram_1": null,
    "histogram_2": null,
    "histogram_3": null,
    "histogram_4": null,
    "histogram_5": null,
    "version": null,
    "updated_at": null,
    "description": "Amazon Photos lets you store and share full-resolution photos, keeping favorite moments…",
    "developer_email": null,
    "developer_website": null
  }
]

First 2 of 10 rows from a real run — sample_output.json. Long values shortened here.

Built for Google Play

Handles what breaks naive Google Play scrapers

Ratings are per country, and recorded as such

One app read from one address scored 4.08 in US and 3.90 in DE with an identical ratings count. Every row carries gl and hl, joins across markets on the package id, and never averages one market into another.

Ratings and written reviews kept apart

244,140,056 ratings against 1,952,258 written reviews for one app on one day — review_count and review_text_count are separate columns, not one number.

Exact installs, where the store publishes them

Play prints "10,000,000,000+" and publishes the exact figure beside it on the app page; installs_exact reads it there and is null on listing tiles because none of 330 tiles carried it.

Pagination that stops on data

There is no ?page=N on Play. Grids follow their shelf URLs and stop when a fetch adds no new app; search, which does not paginate at all, warns instead of reporting a quiet success; reviews follow the continuation token.

Everything built in

Scraping infrastructure included

The same tested core runs every 2scraper repository, so the hard parts work the same way on every site.

CAPTCHA handling

Detects the challenge a page really serves and, with a 2Captcha key, solves it only when it blocks the data — a capped number of solves per page.

Proxy rotation

Single proxy or a pool from a file, rotated on blocks with a fresh browser per exit. Credentials stay out of argv and logs.

Fingerprints

Optional complete device identity from the 2Captcha Fingerprint API — user agent, client hints, locale and timezone that agree with each other.

Scraping Browser API

Point --cdp-endpoint at a managed Chromium with its own exit country — no browser infrastructure to run yourself.

Honest run metadata

Every run writes a .meta.json sidecar and distinct exit codes: complete, blocked, empty and partial are never confused, and a failed run never overwrites good data.

Diff two runs

diff_runs.py compares two complete Google Play snapshots by id — new, removed and changed rows for monitoring.

Use cases

What teams do with Google Play data

App store optimisation

Track ranks in genre shelves and search results, ratings and install buckets for your app and its competitors.

Review mining

Pull thousands of newest reviews per app to follow sentiment and bug reports after each release.

Market comparison

Read the same app in several markets with --gl to compare per-country ratings and local prices, all from one address.

Developer and portfolio research

List a publisher's whole catalogue with installs, ratings, in-app-purchase ranges and update dates.

Access & pricing

Free to run. Pay only for what the site requires.

Runs with no key, proxy or account

No key, proxy or account. Measured 2026-09-22 from a datacentre address with plain curl, every route this repo reads answered in full and no captcha appeared in any capture; a daily canary re-tests that from a bare GitHub runner. The paid products buy volume and geography here, not access: many residential addresses for scale, and the Scraping Browser API if you want no browser infrastructure of your own. The captcha solver is wired for reCAPTCHA in case Google ever challenges you.

Optional 2Captcha services — captcha solving, the Scraping Browser API, residential proxies and fingerprints — work behind one key.

Good to know

  • Only newest-first review sorting is implemented; the repo does not implement the other sort orders or a score filter.
  • Books and movies storefronts are not implemented and are refused with that reason.
  • Exact installs, histograms and developer contacts come from --mode app only; listing rows leave them null.

2scraper vs. hosted scraper APIs

2scraperTypical hosted API
CodeOpen source, MIT — read and patch itClosed
CostFree; optional services billed only when usedSubscription or per request / per result
Runs onYour machine, server or CIThe vendor's infrastructure
OutputJSON/CSV files + run metadataAPI responses
When the site changesFix it yourself or open an issue / PRWait for the vendor
FAQ

Google Play scraper FAQ

Do I need a proxy or an API key?

No. Every route answered a plain request from a datacentre address in testing. Proxies help with volume, not access.

Why does an app's rating differ between runs in different countries?

Google Play computes the rating per country while the ratings count is global. Set --gl to choose the market; each row records it.

How many reviews can I get?

As many as you page through: the endpoint returned up to 2,000 per call with a continuation token and no ceiling was found. Only --sort newest is implemented.

Does search paginate?

No — Play returns a fixed set (22 to 50 results in testing) with nothing more on scroll. --pages above 1 in search mode prints a warning saying so.

What output formats are there?

JSON or CSV plus a .meta.json sidecar per run. Listing, search, app and developer modes share one row class keyed on the package id; reviews have their own, deduped on review_id.

Is scraping Google Play legal?

It reads publicly visible store pages. Public data; follow the site's terms and the law — and note reviews concern identifiable people, which --no-authors helps with.