← All reviews

Repo review · Tested August 7, 2026

Google Maps Scrapper puts one Python file between Maps and CSV

This open-source Google Maps scraper drives a browser and exports local listings to CSV. The code is compact; keeping the dataset trustworthy is your job.

Verdict: adopt with care
View repository ↗
A wide-eyed blue pigeon in a flat cap and waistcoat strides past three storefronts as two blank cards drift behind and a third slips from its satchel.
Google Maps Scrapper goes door to door for local listings, mapping the neighborhood into a CSV one storefront card at a time.

Google Maps is good at finding a place. It is less eager to hand over a tidy local directory. Google Maps Scrapper bridges that gap with one Python file that opens a visible browser, runs a category search, visits the listings, and writes their details to CSV.

That is the appeal of this open-source Google Maps scraper. There is no API account, hosted extractor, or sprawling data pipeline to configure. There is also no service standing behind the output. The script can save an afternoon of copying listings; the CSV still needs adult supervision.

Tested: commit c7024881358b3bfb138dcd51dd0101aa69db4afa on August 7, 2026. Setup: Python 3.12.3, Playwright 1.44.0, and Chromium in a disposable Ubuntu VM. Useful result: ten rows in about 25 seconds after setup. The catch: fresh exports need inspection, and the append and one-result paths were unreliable. Verdict: adopt with care.

A Python Google Maps scraper in one file

The project drives a visible Playwright browser through Google Maps, follows place results, extracts fields such as names, addresses, websites, phone numbers, ratings, categories, hours, and introductions, then writes the batch through Pandas. There is no API key or persistent browser profile in the documented workflow.

This is a replacement for manual copy and paste on a bounded search, not a stable Places API or durable collection system. Its output can feed a spreadsheet, local research pass, or cleaning step. Browser compatibility, result validation, and the CSV afterward all belong to the user.

The repository was created in October 2023 and is MIT-licensed. At our August 7 check it had 1,267 stars, 274 forks, three contributor entries, and no tags or releases. Its latest commit was from May 18, 2026. Those numbers show continuing attention. They do not include a support contract.

The architecture is correspondingly compact: one main.py, pinned dependencies, and no automated test suite or CI workflow. Open pull request #19 already describes the two CSV defects we reproduced, while other open work addresses result scrolling and locale-sensitive hours. Important fixes exist, but they were not on the tested main revision.

Ten libraries, one useful directory

We ran the unmodified CLI against a realistic category query:

$ python main.py -s "public libraries in Toronto Canada" -t 10 -o primary.csv
Currently Found: 16
Total Found: 10
Saved 10 places to primary.csv (append=False)

The command completed in 25 seconds after setup. Its 1,892-byte CSV had a nine-column header and ten correctly shaped rows. All ten names were populated and distinct, all ten addresses were populated, and every record contained a website or phone number.

A separate browser process, which did not import the project code, opened the first three deterministic records. The Toronto Reference Library, City Hall Branch, and Fort York Branch names and addresses all matched what the CSV recorded, and no CAPTCHA or unusual-traffic page appeared.

Google Maps showing the Toronto Reference Library name, 789 Yonge Street address, website, phone number, and rating used to verify the first CSV record.

The first sampled record matched the independently opened Maps listing.

This is the repository’s defining job, and this revision produced a useful small directory. Merely proving that the browser opened would have missed the point; the records had to survive independent checking.

Fresh exports are the sweet spot

Before writing a batch, the script removes every column containing only one unique value. A field therefore survives because its values differ within that particular search, not because it belongs to the Place model. The CSV schema is a property of the current batch.

That rule left nine useful columns in the ten-library run. It also means the safest workflow is a fresh export that you inspect before using downstream. We checked two nearby paths to understand that boundary.

First, we copied the valid file and used the advertised --append option for three bookstores. The command extracted three records, logged Saved 3 places, and exited normally, but the new batch retained a different set of columns:

The combined file was malformed:

primary.csv: 9-column header, ten 9-column rows
appended.csv: same 9-column header, then three 11-column rows

Lines 12 through 14 each had eleven fields beneath the existing nine-field header. The default count of one exposed the same batch-dependent cleaning rule from the other direction: the scraper logged Saved 1 places, but every populated column had one unique value and was removed, leaving a blank file.

A direct query for Toronto Reference Library found another boundary: the command timed out after 30 seconds waiting for result-list links. We did not establish support for direct place-name searches on page shapes that bypass the expected category-results flow.

Where this scraper is the right size

Use this revision for an occasional small category snapshot when you are comfortable running a visible browser, overwriting a fresh file, and inspecting its shape immediately. The source is also approachable if you want to study a compact Playwright extraction loop.

Skip it when you need to append across searches, promise a fixed schema to downstream code, collect at scale, or rely on documented service guarantees. The official Places APIs, a larger maintained scraper, a hosted extractor, or manual directory research each cost something different, but they move different maintenance and policy risks away from this script.

Google’s current Maps Platform terms explicitly restrict scraping and saving Maps content. The repository’s MIT license does not override upstream service terms, and this evaluation does not decide whether a particular use is permitted. Anyone considering production or commercial collection needs to assess that constraint independently.

We also did not test more than ten results, sustained runs, rate limits, proxies, other desktop platforms, non-English locales, or authenticated behavior. The initial browser setup required current Ubuntu libraries because Playwright 1.44’s dependency helper requested an obsolete package name. The script is small. Reliable recurring ownership is not.

Use it as a fresh-export tool

Adopt Google Maps Scrapper with care for supervised, overwrite-only batches. It produced a useful ten-row directory, and independent checks matched three sampled records.

Treat this revision as a compact fresh-export utility rather than a system for accumulating a long-lived dataset. The two edge paths we checked show why each output deserves a quick shape and content check before it feeds another tool.

PR #19, or an equivalent stable-schema fix with regression fixtures, would materially change this verdict. Direct-place handling and a current installation path would strengthen it further. For now, let the scraper make a list, inspect the list, and keep each run as a fresh snapshot.