Aurelix

Guides

Export Google Maps search results to CSV or Google Sheets, for many cities at once

Turn "roofing contractor in Calgary" style Google Maps searches into a spreadsheet with phone, website, rating, review count, hours and coordinates, across many cities in one run, without the Places API or a Google account.

Google Maps Phone Scraper: price and examples

Google Maps has no "export" button. If you sell to local businesses (roofers, dentists, restaurants), the usual options are copying listings by hand, or the official Places API, which needs a Google Cloud billing account and returns at most 60 results per text search. For a lead list of every roofing contractor in five cities, neither is pleasant.

This guide exports Google Maps search results straight to CSV, Excel or Google Sheets, for many search terms and cities in one run.

Disclosure: I'm Aurelix, and I built the Google Maps Business Scraper used below. It is a paid tool, priced per place returned; the current price is on its tool page.

The input

{
  "searchTerms": ["dentist", "roofing"],
  "locations": ["Calgary AB", "Austin, TX"],
  "maxResultsPerSearch": 60,
  "language": "en"
}

Each search term runs in each location (here 2 × 2 = 4 searches), up to 300 places per search in Google's own order. A broad city search lists about 260 to 290 places; for more coverage, split a large city into neighbourhoods or use narrower terms ("emergency roof repair", "metal roofing").

It reads Google Maps' public results with no Google account, so there is nothing to sign in to or get blocked.

Real output

Rows from a run of this input:

name category phone website
Downtown Dental - Calgary Dentist +14032641736 downtowndentist.ca
ATX Family Dental Dentist +15127173147 atxfamilydental.com
Calgary Roofing Pro Roofing contractor +15879692720 calgaryroofingpro.ca
Austin Roofing Company Roofing contractor +15126402658 austinroofingcompany.com
Dental at the Met - SW Beltline Calgary Dentist +14038009638 metdental.ca

Every row also has the full address split into street, city, region and postal code, all of Google's categories for the place, rating, review count, opening hours by day, latitude and longitude, time zone, a Google Maps link and the place_id.

To CSV and Google Sheets in Python

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": ["roofing contractor"],
    "locations": ["Calgary AB", "Edmonton AB", "Red Deer AB"],
    "maxResultsPerSearch": 200,
})
places = list(client.dataset(run["defaultDatasetId"]).iterate_items())

fields = ["name", "category", "phone_display", "website", "rating", "review_count",
          "street", "city", "region", "postal_code", "google_maps_url"]
with open("roofers.csv", "w", newline="", encoding="utf-8") as f:
    w = csv.DictWriter(f, fieldnames=fields, extrasaction="ignore")
    w.writeheader()
    w.writerows(places)

no_site = [p for p in places if not p.get("website")]
print(f"{len(places)} places, {len(no_site)} without a website")

Open roofers.csv in Google Sheets with File > Import, or skip the script: run the tool in the Apify console and add Apify's Google Sheets integration so each run's places land in a sheet.

Two filters people use on these rows:

  • No website (website empty): prospects for web designers and agencies.
  • Few reviews (review_count under 20): businesses that may want help with reviews or local marketing.

Only new businesses, every week

Add "incremental": true and a stateKey such as "alberta-roofers", then schedule the run weekly. Places returned before are skipped and not charged, so each run gives only places that are new to your list. "New" means new to your list, not newly opened: an established business that appears in Google's results for the first time also counts.

Emails

Google Maps does not show emails. With enrichWebsiteContacts on, the tool reads each business's own website (home page and up to 4 contact or about pages, robots.txt obeyed) and adds the generic business emails it publishes, such as info@ or sales@, plus extra phones and social links. This is charged per place where something was found. Emails of named people are not returned, and many small businesses publish none.

Limits

  • Up to 300 places per search term and location, in Google's ranking order.
  • No review text, reviewer names or photos; only the average rating and review count.
  • Rating, review count, website and hours are empty when the business has none on Google Maps.

For a deeper walk-through of building a call list with emails, see Google Maps scrapers on Apify compared.

Links

Tools used