A star rating and a review count tell you how a business is doing, not why. The "why" is in the short review quotes Google shows on every place: "Super fast response time", "Does this company still exist?". If you sell to local businesses, or you are sizing up a market, those few lines are often enough to decide who to call first and what to say.
This post pulls businesses from Google Maps into Python with their review snippets attached, and turns them into a call list you can sort and filter.
Disclosure: I'm Aurelix, and I built the Google Maps Phone Scraper. It's a paid tool (prices below); the review snippets cost nothing extra.
What each row holds
One row per business, from Google Maps' public results, logged out:
-
name,category,categories,place_id,cid,google_maps_url. -
addressplusstreet,city,region,postal_code,country_code,latitude,longitude,timezone. -
phonein E.164,phone_display,websitewithout tracking parameters. -
rating,review_count,hoursfor all 7 days. -
review_snippets: up to 3 short review quotes Google shows on the place, each with its star rating.
Here is one place from a real run on plumber in Toronto ON:
{ "name": "Toronto Plumber Done 24/7", "rating": 4.9, "review_count": 44, "review_snippets": [ {"text": "Great profession work", "rating": 5}, {"text": "They diagnosed on time and the plumber did excellent work for me.", "rating": 5}, {"text": "Does this company still exist?", "rating": 2} ] } These are Google's top snippets for the place, not its full review history: there is no paging, no dates and no reviewer names. When Google shows none (common for places with only a handful of reviews), the list is empty. In our test runs in Toronto, Austin and Berlin, 212 of 220 places came back with snippets.
Businesses and their snippets, as a sheet
pip install apify-client import csv import os from apify_client import ApifyClient client = ApifyClient(os.environ["APIFY_TOKEN"]) run = client.actor("aurelix/google-maps-scraper").call( run_input={ "searchTerms": ["plumber", "drain cleaning"], "locations": ["Toronto ON", "Mississauga ON"], "maxResultsPerSearch": 60, } ) places = list(client.dataset(run["defaultDatasetId"]).iterate_items()) fields = ["name", "phone", "website", "rating", "review_count", "snippet_1", "snippet_2", "snippet_3", "google_maps_url"] with open("plumbers.csv", "w", newline="", encoding="utf-8") as f: w = csv.DictWriter(f, fieldnames=fields, extrasaction="ignore") w.writeheader() for p in places: quotes = [f'{s["rating"] or "?"}★ {s["text"]}' for s in p["review_snippets"] or []] w.writerow({**p, **{f"snippet_{i + 1}": q for i, q in enumerate(quotes)}}) Every term runs in every location, and a business found by two searches comes back once and is charged once.
Who to call first
A snippet with a low star rating is a complaint Google chose to show. For an agency selling reputation or review management, that is the opening line. For a supplier, a run of "fast", "on time" and "fair price" marks the busy, well-run shops:
def low(p): return [s for s in p["review_snippets"] or [] if s["rating"] and s["rating"] <= 3] needs_help = sorted((p for p in places if low(p)), key=lambda p: p["review_count"] or 0, reverse=True) for p in needs_help[:10]: print(f'{p["name"][:35]:35} {p["phone"] or "":14} {p["rating"]}★ ({p["review_count"]}) "{low(p)[0]["text"]}"') words = ("fast", "quick", "on time", "fair", "honest") praised = [p for p in places if any(w in s["text"].lower() for s in p["review_snippets"] or [] for w in words)] print(len(praised), "places praised for speed or fairness") Only new businesses, every week
run_input = { "searchTerms": ["plumber"], "locations": ["Toronto ON"], "maxResultsPerSearch": 200, "incremental": True, "stateKey": "toronto-plumbers", } With incremental on, each later run with the same stateKey returns only places earlier runs did not, and places seen before are not charged. Save it as a task in the Apify Console and schedule it weekly: new businesses arrive with their snippets, ready to read before the first call.
Why this tool
- Up to 3 Google review snippets per place, free, on by default.
- Phones in E.164, clean websites, ratings, review counts and 7-day hours in the same row.
- Many search terms in many locations in one run, each place returned once.
- Optional website emails and social links, charged only when found.
- What it doesn't cover: full review histories, review dates, reviewer names and photos.
Limits
- Snippets are Google's choice. At most 3 per place, the ones Google shows to a logged-out visitor; empty when it shows none.
- Up to 300 places per search term and location, fewer when Google lists fewer; split big cities into neighbourhoods for more.
- Snippets add a moment per place (one extra request, 0.2 seconds apart); set
includeReviewSnippetstofalsefor the fastest runs.
Cost
$0.85 per 1,000 places on Apify's free plan, cheaper than the leading tools, plus a small start fee per run. Review snippets add nothing to that. The current prices are on the Store page; Apify's free plan includes $5 of credit a month.