google-maps-reviews-scraper
Get all Google Maps reviews for any place — free, no API key, no limits.
→ Live dashboard demo (4,370 Taal Vista Hotel reviews)
The Google Places API charges ~$17 per 1,000 reviews and caps at 5 per place. This gets them all for $0.
Scraped 4,370 reviews from a single hotel in under 10 minutes.
Why this exists
If you want Google Maps reviews at scale, your options are:
- Google Places API — capped at 5 reviews per place, costs money beyond the free tier
- Third-party APIs (SerpApi, Outscraper, etc.) — pay per request, no control over your data
- Existing scrapers — most scroll the DOM and silently break after ~900 reviews because the scroll container hits a physical maximum height
This tool takes a different approach: it intercepts the same internal API that Google Maps itself uses, then paginates through all pages with cursor-based requests. No scroll limit. No DOM parsing. No vendor lock-in. Works as long as you have a Google account.
How it's different
Most scrapers break after ~900 reviews because they rely on scrolling, which hits a physical DOM limit. This one intercepts the real batchexecute API that Google Maps uses internally and paginates via cursor — the same way the app does it. No scroll limit. No review cap.
| This tool | Other scrapers | Google Places API | |
|---|---|---|---|
| Review limit | ✅ None | ❌ ~900 | ❌ 5 per place |
| Cost | ✅ Free | ✅ Free | ❌ ~$17/1k reviews |
| API key required | ✅ No | ✅ No | ❌ Yes |
| Breaks on UI changes | ✅ No (API) | ❌ Yes (DOM) | ✅ No |
| Local Guide info | ✅ Yes | ❌ No | ❌ No |
| Estimated dates | ✅ Yes | ❌ No | ❌ No |
| Sort order control | ✅ Yes | ❌ No | ❌ No |
| Multi-place from file | ✅ Yes | ❌ No | ❌ No |
| HTML dashboard | ✅ Yes | ❌ No | ❌ No |
Requirements
- Python ≥ 3.11
- Google Chrome installed (Linux, macOS, or Windows)
- A Google account logged in on Chrome (for session auth)
Install
pip install uv
uv pip install -e .
playwright install chromium
Usage
Scrape a single place
# Scrape all reviews — saves to SQLite
gmaps-reviews scrape "https://www.google.com/maps/place/..."
# Scrape newest reviews first
gmaps-reviews scrape "https://..." --sort newest
# Scrape + export CSV + dashboard in one shot
gmaps-reviews scrape "https://..." --csv reviews.csv --dashboard dashboard.html
# Auto-organize output into a directory
gmaps-reviews scrape "https://..." --output-dir ./data
# → ./data/taal-vista-hotel/reviews.csv
# → ./data/taal-vista-hotel/dashboard.html
# Limit to first 500 reviews
gmaps-reviews scrape "https://..." --limit 500
# Use a different database
gmaps-reviews scrape "https://..." --db hotels.db
Scrape multiple places from a file
# places.txt — one URL per line, # to comment
gmaps-reviews scrape-file places.txt
# With output directory (one subfolder per place)
gmaps-reviews scrape-file places.txt --output-dir ./data --db all_places.db
places.txt format:
# Philippines hotels
https://www.google.com/maps/place/Taal+Vista+Hotel/...
https://www.google.com/maps/place/Shangri-La+Boracay/...
# Madrid restaurants
https://www.google.com/maps/place/DiverXO/...
Export from existing database
# Export CSV + dashboard without scraping again
gmaps-reviews export --db hotels.db --csv all.csv --dashboard all.html
# Filter to one place
gmaps-reviews export --db hotels.db --place 0x....:0x.... --csv taal.csv
Sort options
--sort value |
Description |
|---|---|
relevant (default) |
Google's default ranking |
newest |
Most recent reviews first |
highest |
Highest rated first |
lowest |
Lowest rated (most critical) first |
Chrome path
If Chrome is not auto-detected, set the path via environment variable:
CHROME_PATH="/usr/bin/google-chrome-stable" gmaps-reviews scrape "https://..."
Auto-detected locations by platform:
- Linux:
/usr/bin/google-chrome-stable,/usr/bin/google-chrome,/usr/bin/chromium-browser - macOS:
/Applications/Google Chrome.app/Contents/MacOS/Google Chrome - Windows:
C:\Program Files\Google\Chrome\Application\chrome.exe
Output fields
| Field | Description |
|---|---|
review_id |
Stable Google review ID |
author |
Reviewer name |
local_guide |
True / False |
review_count |
Reviewer's total reviews on Google |
rating |
1–5 stars |
date_relative |
"a year ago", "3 months ago"… |
date_estimated |
YYYY-MM estimated from relative date |
has_photos |
True / False |
review_text |
Full review text (original language) |
owner_reply |
Owner response, if any |
How it works
- Opens your real Chrome profile — inherits your Google session
- Navigates to the Maps URL and clicks the Reviews tab
- Optionally clicks the sort button to set the desired order
- Scrolls once to trigger the first
batchexecuterequest — captures the URL, headers, and session token (x-maps-bgkey) - Loops via in-page XHR with cursor substitution — no scrolling, no DOM parsing, no limits
- Stores raw batches + parsed reviews in SQLite; resumes automatically if interrupted
- Exports CSV and HTML dashboard on demand
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file google_maps_reviews_scraper-0.3.0.tar.gz.
File metadata
- Download URL: google_maps_reviews_scraper-0.3.0.tar.gz
- Upload date:
- Size: 1.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8b492260c21752944c5bc40b6142ab905a65679637178ffd2a7d2749355581f2
|
|
| MD5 |
f88358b6a4399272a08e2b45591b33df
|
|
| BLAKE2b-256 |
4092a413ede0a6103cdc2dabe49438eae0d1d5f667f0fc730896d0857d9dfb3e
|
Provenance
The following attestation bundles were made for google_maps_reviews_scraper-0.3.0.tar.gz:
Publisher:
publish-pypi.yml on aroaxinping/google-maps-reviews-scraper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
google_maps_reviews_scraper-0.3.0.tar.gz -
Subject digest:
8b492260c21752944c5bc40b6142ab905a65679637178ffd2a7d2749355581f2 - Sigstore transparency entry: 2723468635
- Sigstore integration time:
-
Permalink:
aroaxinping/google-maps-reviews-scraper@ea8379e39f081ccb7b09290fd6f28b6be1239d86 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/aroaxinping
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@ea8379e39f081ccb7b09290fd6f28b6be1239d86 -
Trigger Event:
release
-
Statement type:
File details
Details for the file google_maps_reviews_scraper-0.3.0-py3-none-any.whl.
File metadata
- Download URL: google_maps_reviews_scraper-0.3.0-py3-none-any.whl
- Upload date:
- Size: 31.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5aaaf9ecd19c16be6c2a8197c554abd0e6f0728256608b11865db86f6f1cec59
|
|
| MD5 |
58d3760f3fe5baee43431b2b97c1aba6
|
|
| BLAKE2b-256 |
83257ef66061c6a44d47aa5c9c5b9b42b46718fbdbacaf45d751e2aa6ad44214
|
Provenance
The following attestation bundles were made for google_maps_reviews_scraper-0.3.0-py3-none-any.whl:
Publisher:
publish-pypi.yml on aroaxinping/google-maps-reviews-scraper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
google_maps_reviews_scraper-0.3.0-py3-none-any.whl -
Subject digest:
5aaaf9ecd19c16be6c2a8197c554abd0e6f0728256608b11865db86f6f1cec59 - Sigstore transparency entry: 2723468816
- Sigstore integration time:
-
Permalink:
aroaxinping/google-maps-reviews-scraper@ea8379e39f081ccb7b09290fd6f28b6be1239d86 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/aroaxinping
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@ea8379e39f081ccb7b09290fd6f28b6be1239d86 -
Trigger Event:
release
-
Statement type: