Google Maps Scraper

  • compass/crawler-google-places
  • Modified
  • Users 34.9k
  • Runs 3.7M
  • Created by Author's avatarCompass

Extract data from hundreds of Google Maps businesses and locations in seconds. Get Google Maps data including reviews, images, opening hours, location, popular times & more. Go beyond the limits of the official Google Places API. Download data with Google Maps extractor in JSON, CSV, Excel and more.

What is Google Maps Scraper and what does it do?

This Google Maps scraper lets you get more and faster data from Google Places than the official Google Places API. Our unofficial Google Maps API enables you to extract all of the following data from Google Maps:

🔗 Title, subtitle, category, place ID, and URL

📍 Address, location, plus code and exact coordinates

☎️ Phone and website, if available

🏷 Menu and price, if available

🔒 Temporarily or permanently closed status

⌚️ Popular times - histogram & live occupancy

⭐️ Average rating (totalScore), review count, and review distribution

🍔 List of images (optional)

➕ List of detailed characteristics (additionalInfo, optional)

🧑‍🍳 Opening hours (optional)

🔍 People also search (optional)

🏨 Hotel booking URL and price + nearby hotels

🌐 Web results

🙋 Updates from customers & Questions and answers

The scraper also supports the scraping of all detailed information about reviews:

✅ Review text

✅ Published date

✅ Stars

✅ Review ID & URL

✅ Response from the owner - text and published date

✅ List of review images

✅ Review context and detailed rating per service

Personal data extraction about reviewers has to be explicitly enabled in input (see Personal data section):

  • Reviewer name
  • Reviewer ID, URL & photo
  • Reviewer number of reviews
  • Is Local Guide

Google Maps Scraper also provides other handy features:

🗺 Define search area - allows you to define the geographical area to scrape to a country, state, county, city, or postal code (or to arbitrary location if present on OpenStreetMap), thus speeding up the search (integration with Nomatim Maps API)

🔍 Automatic zooming by searched area - ensures maximum results

🌏 Language & translation settings

🗂 Reviews sorting and filtering

💻 Browser & scraping configuration

How does Google Maps Scraper work?

It works exactly as if you were searching through Google Maps and copying information from each page you find. It opens Google Maps website, goes to a specified location, then writes your search query into the search bar. Then it scrolls down until it reaches the final page or maxCrawledPlacesPerSearch. It enqueues all the places as separate pages and then copypastes all visible data into an organized document. To understand the process fully, just try it out in your browser - the scraper does exactly the same thing, only much faster.

How much will scraping Google Maps cost you?

When it comes to scraping, it can be challenging to estimate the resources needed to extract data as use cases may vary significantly. That's why the best course of action is to run a test scrape with a small sample of input data and limited output. You’ll get your price per scrape, which you’ll then multiply by the number of scrapes you intend to do. In our experience you can get between 15 and 20 thousand results within the $49 plan.

Watch this video for a few helpful tips. And don't forget that choosing a higher plan will save you money in the long run.

What are the advantages over the Google Maps API?

With the Google Maps API, you get $200 worth of credit usage every month free of charge. That means 28,500 maploads per month. However, the Google Maps API caps your search results to 60, regardless of the radius you specify. So, if you want to scrape data for bars in New York, for example, you'll get results for only 60 of the thousands of bars in the area.

Google Maps Scraper imposes no rate limits or quotas and provides more cost-effective, comprehensive results, and also scrapes histograms for popular times, which aren't available in the official API.

Web scraping is legal if you are extracting publicly available data which is most data on Google Maps. However, you should respect boundaries such as personal data and intellectual property regulations. You should only scrape personal data if you have a legitimate reason to do so, and you should also factor in Google's Terms of Use.

How do I use Google Maps Scraper?

To understand how to configure and run the scraper, follow our step-by-step guide on how to scrape Google Maps or watch a short video tutorial ▷ on YouTube.

You can also follow along our extended guide on how to use the Google Maps Scraper geolocation features 🔗 .

What can I use the extracted data from Google Maps for?

You can use the extracted data to:

👉🏽 create a potential customer base and prospection files

👉🏽 find new clients

👉🏽 generate leads

👉🏽 search and analyze businesses similar to yours

👉🏽 monitor brand sentiment and service quality, and identify fake reviews

👉🏽 find where to buy products

👉🏽 analyze geo-spatial data for scientific or engineering work

👉🏽 develop a working market strategy

For more ideas on how to use the extracted data, check out our industries pages for concrete ways web scraping results are already being used across many projects and businesses of all types and sizes - in travel and logistics, for instance.

Want more options?

Google Maps with Contact Details 📩

Enhance your Google Maps Scraper results with contact details. Scan websites of chosen Google Maps places for contact details and merge them into a single dataset. Get email address, website, location, address, phone number, and relevant social media links. Google Maps with Contact Details is set up and configured to get more from Google Maps super easily.

Google Maps Reviews Scraper ⭐️

If you only want to scrape reviews, this targeted data scraper is a great option. Google Maps Reviews Scraper extracts all reviews for a single place on Google Maps.

All you need to do is enter the URL of the location you want to scrape, and you'll get a dataset of all reviews, which you can download for business analysis and market research.

To use this tool, you need to acquire your own Google API key, as you would use the official Google API. So, why use Google Places API Radar Search instead of the API?

Nearby search with the official API returns only 60 results. Google Places API Radar Search overrides this limit and gets all places in a specified location.

Gas Prices Scraper ⛽️

Use Gas Prices Scraper to find the lowest gas prices and timestamps of price updates from gas stations in your area.

Not your cup of tea? Build your own scraper

Google Maps Scraper doesn’t exactly do what you need? You can always build your own! We have various scraper templates in Python, JavaScript, and TypeScript to get you started. Alternatively, you can write it from scratch using our open-source library Crawlee. You can keep the scraper to yourself or make it public by adding it to Apify Store (and find users for it).

Or let us know if you need a custom scraping solution.

Input

Input example

The Google Maps Scraper has the following input options:

Apify  -  G Maps  Scraper  input

Or here's its equivalent in JSON:

{ "searchStringsArray": [ "pet shelter in Prague", "place_id:ChIJ8_JBApXMDUcRDzXcYUPTGUY", ], "maxCrawledPlacesPerSearch": 10, "language": "en", "maxImages": 10, "onlyDataFromSearchPage": false, "deeperCityScrape": true, "maxReviews": 0, "scrapeReviewerName": true, "scrapeReviewerId": true, "scrapeReviewerUrl": true, "scrapeReviewId": true, "scrapeReviewUrl": true, "scrapeResponseFromOwnerText": true, "oneReviewPerRow": false, "reviewsSort": "newest", "allPlacesNoSearchAction": "" }

Output

The output from Google Maps Scraper is stored in a dataset. After the run is finished, you can download the dataset in various data formats (JSON, CSV, XML, RSS, HTML Table).

Output example

Simplified tabulated example: Apify  -  G Maps  Scraper  input

Or here's its equivalent in JSON for a single place:

{ "title": "Sdružení na ochranu zvířat v krajní nouzi", "description": "Naše zraněné přírůstky po výstavě – poškozené ouško u 6letého Pouziho, vykloubená nožka 5měsíčního bílomouratého Míši, 8měsíční černý dlouhosrstý Mikulka se zraněnou nožkou, holýma zadníma nožkama a holým ocáskem, Cyril sražený autem, neovládá zadní nožky.", "subTitle": null, "price": null, "menu": null, "categoryName": "Pet adoption service", "address": "Na Pláni 2006, 150 00 Praha 5, Czechia", "locatedIn": null, "neighborhood": "Na Pláni 2006", "street": "Na Pláni 2006", "city": "Prague 5", "postalCode": "150 00", "state": null, "countryCode": "CZ", "plusCode": "397W+49 Prague 5, Czechia", "website": "https://www.kocici-utulek.cz/", "phone": "+420 603 225 948", "temporarilyClosed": false, "claimThisBusiness": true, "location": { "lat": 50.062872, "lng": 14.3958755 }, "permanentlyClosed": false, "totalScore": 4.3, "isAdvertisement": false, "rank": 9, "placeId": "ChIJuxlGAU6UC0cRI_jkTCUIboA", "categories": [ "Pet adoption service" ], "cid": "9254343240589834275", "url": "https://www.google.com/maps/place/Sdru%C5%BEen%C3%AD+na+ochranu+zv%C3%AD%C5%99at+v+krajn%C3%AD+nouzi/@50.062872,14.3958755,17z/data=!3m1!4b1!4m5!3m4!1s0x470b944e014619bb:0x806e08254ce4f823!8m2!3d50.0628787!4d14.3958708?hl=en", "popularTimesLiveText": "Not too busy", "popularTimesLivePercent": 38, "popularTimesHistogram": {}, // See section below "openingHours": [], // See section below "additionalInfo": {}, // See section below "searchPageUrl": "https://www.google.com/maps/search/pet+shelter+in+Prague/@37.6,-95.665,4z?hl=en", "searchPageLoadedUrl": "https://www.google.com/maps/search/pet+shelter+in+Prague/@37.6,-95.665,4z?hl=en", "searchString": "pet shelter in Prague", "scrapedAt": "2022-07-28T12:42:10.969Z", "reviewsCount": 40, "reviewsDistribution": { "oneStar": 6, "twoStar": 0, "threeStar": 1, "fourStar": 2, "fiveStar": 31 }, "imageUrls": [ "https://lh5.googleusercontent.com/p/AF1QipOeEWgXD8Jjmj3DpIa7U9VeJ3E83xaRpefxbYZh=w1920-h1080-k-no", "https://lh5.googleusercontent.com/p/AF1QipN2XNEQQrjtpMIHLe0WlJHYWd4nhniifUiy9BYq=w1920-h1080-k-no", "https://lh5.googleusercontent.com/p/AF1QipOShH8UZgA-gtJlc83n2uBLhgkd5HRacPIOx_V6=w1920-h1080-k-no", "https://lh5.googleusercontent.com/p/AF1QipPrcwuF0i7y32PUwX-ff-jdkRovD7XQ6fmBWHmr=w1920-h1080-k-no" ], "imagesCount": 7, "reviews": [], "reviewsTags": [ { "title": "facebook", "count": 10 }, ], "placesTags": [ { "title": "Parking", "count": 142 } ], "orderBy": [], "peopleAlsoSearch": [ { "category": "Czech restaurants", "title": "Restaurant Mlýnec", "reviewsCount": 2561, "totalScore": 4.7 } ], "googleFoodUrl": "https://food.google.com/chooseprovider?restaurantId=/g/11hfvkwdgg&g2lbs=ADZRdks7YEfR3so8mfaIvxzxIBfhj30edVasvqVLbfhKcBJvKOet7xVoQdb2e4Fec3KE_TIOmL_bbKvopcN_U9WD4tjF-q0EeS7Pne3vmHfe3kT5b3gcraE5TVEddjqfP5a0mVdhsCri&hl=en-US&gl=us&fo_m=MfohQo559jFvMWvkddHzV46uMT_RFPQ05bfKMQVr5-7IofUJMU_hT8vrWuwRMUv3d8yCO4PgMUOzJVpjPL1YMfZ3bInYwBDuMfaXTPp5KXh-&utm_source=tactile&gei=kw8sZP6wLsibsAefq5b4DA&ei=kw8sZP6wLsibsAefq5b4DA&fo_s=OA,AH,SOE", "webResults": [] // See section below, }

Additional fields are also extracted for specific cases:

"popularTimesHistogram": { "Su": [ { "hour": 6, "occupancyPercent": 0 }, // etc... ], "Mo": [ { "hour": 6, "occupancyPercent": 0 }, // etc... ], // etc... },

Opening hours

"openingHours": [ { "day": "Monday", "hours": "10:30 AM to 11 PM" }, { "day": "Tuesday", "hours": "10:30 AM to 11 PM" }, { "day": "Wednesday", "hours": "10:30 AM to 11 PM" }, { "day": "Thursday", "hours": "10:30 AM to 11 PM" }, { "day": "Friday", "hours": "10:30 AM to 12 AM" }, { "day": "Saturday", "hours": "11 AM to 12 AM" }, { "day": "Sunday", "hours": "11 AM to 10 PM" } ]

Additional info

"additionalInfo": { "Service options": [ { "Outdoor seating": true }, { "Delivery": true }, { "Takeout": true }, { "Dine-in": true } ], "Accessibility": [ { "Wheelchair accessible entrance": true }, { "Wheelchair accessible parking lot": true }, { "Wheelchair accessible restroom": true }, { "Wheelchair accessible seating": true } ], "Offerings": [ { "Alcohol": true }, { "Beer": true }, { "Coffee": true }, { "Happy hour food": true }, { "Hard liquor": true }, { "Wine": true } ], "Dining options": [ { "Lunch": true }, { "Dinner": true }, { "Dessert": true }, { "Seating": true } ], "Amenities": [ { "Bar onsite": true }, { "Good for kids": true }, { "Restroom": true }, { "Free Wi-Fi": true } ], "Atmosphere": [ { "Casual": true }, { "Cozy": true } ], "Crowd": [ { "Groups": true } ], "Planning": [ { "Accepts reservations": true } ], "Payments": [ { "Debit cards": true }, { "NFC mobile payments": true }, { "Credit cards": true } ] }

Reviews

"reviews": [ { "name": "What’s in your pantry?", "text": "One of the best pizza place in Pardubice. Great selection of pizzas for good value of money.", "textTranslated": null, "publishAt": "4 years ago", "publishedAtDate": "2018-08-26T15:21:22.259Z", "likesCount": 0, "reviewId": "ChdDSUhNMG9nS0VJQ0FnSUN3aU5mS3Z3RRAB", "reviewUrl": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sChdDSUhNMG9nS0VJQ0FnSUN3aU5mS3Z3RRAB!2m1!1s0x0:0x79ba84b5e3261fea!3m1!1s2@1:CIHM0ogKEICAgICwiNfKvwE%7CCgsI8oqL3AUQ-KHBew%7C?hl=en-US", "reviewerId": "117322307728195096581", "reviewerUrl": "https://www.google.com/maps/contrib/117322307728195096581?hl=en-US", "reviewerPhotoUrl": "https://lh3.googleusercontent.com/a-/AD5-WCmhximZjAUEJaQ3T-z36al5yqCsyk_VhpBZ5zv3pqs=s120-c-c0x00000000-cc-rp-mo-ba3-br100", "reviewerNumberOfReviews": 45, "isLocalGuide": true, "stars": 4, "rating": null, "responseFromOwnerDate": null, "responseFromOwnerText": null, "reviewImageUrls": [ "https://lh5.googleusercontent.com/p/AF1QipMn71E_8-sqjiLKYJbbI5gqrYhVn3n3ueHpGknt=w150-h150-k-no-p", "https://lh5.googleusercontent.com/p/AF1QipOHWWSXkDgNn_d8kbpPxMmmb7PaHQKMULJggIMe=w150-h150-k-no-p", "https://lh5.googleusercontent.com/p/AF1QipMpm926guA2_yc6hamEVQpp0GWkePyv0e6OXwgU=w150-h150-k-no-p" ], "reviewContext": { "Service": "Dine in", "Meal type": "Lunch" }, "reviewDetailedRating": { "Food": 5, "Service": 3, "Atmosphere": 4 } } ]

Hotels

"moreHotelsOptions": [ { "url": "https://www.booking.com/hotel/us/pittsburgh-3454-forbes.html?&checkin=2023-03-10&checkout=2023-03-11&group_adults=2&req_adults=2&show_room=33940104_356536769_2_2_0&lang=en&selected_currency=USD&exrt=1.00000000&ext_price_total=345.21&ext_price_tax=42.39&xfc=USD&group_children=0&req_children=0&&exfcam=_2&ts=1673860104&no_rooms=1&utm_source=metagha&utm_medium=mapresults&utm_campaign=US&utm_term=hotel-339401&utm_content=dev-desktop_los-1_bw-53_dow-Friday_defdate-1_room-0_gstadt-2_rateid-public_aud-0_gacid-_mcid-10_ppa-0_clrid-0_ad-0_gstkid-0_checkin-20230310_&aid=2127489&label=metagha-link-MRUS-hotel-339401_dev-desktop_los-1_bw-53_dow-Friday_defdate-1_room-0_gstadt-2_rateid-public_aud-0_gacid-_mcid-10_ppa-0_clrid-0_ad-0_gstkid-0_checkin-20230310_", "title": "Booking.com", "price": "$303" }, { "url": "https://www.hotels.com/Hotel-Search?selected=118998&startDate=2023-03-10&endDate=2023-03-11&", "title": "Hotels.com", "price": "$303" }, ], "similarHotelsNearby": [ { "name": "Residence U Malvaz", "rating": 4.3, "reviews": 406, "description": "Cozy hotel offering a restaurant", "price": "$70" }, { "name": "Hotel U Zlatého Stromu", "rating": 3.6, "reviews": 656, "description": "Refined rooms, plus breakfast & dining", "price": "$64" }, ]

Updates from customers

"updatesFromCustomers": { "text": "Disneyland California Adventure small area with large park all inclusive celebrations. This is a glimpse into Los Reyes parade. I'm a true fan. Thanks", "language": "en", "postDate": "a week ago", "postedBy": { "name": "Kayla Arredondo", "url": "https://www.google.com/maps/contrib/102968882116587973980?hl=en-US", "title": "Local Guide", "totalReviews": 225 }, "media": [ { "link": "https://lh3.googleusercontent.com/ggms/AF1QipNNaoT0NSbcWOPSduvZNqJ0kSqUs-dod32FeBtr=m18", "postTime": "a week ago" } ] }

Questions and answers

"questionsAndAnswers": { "question": "Which is the best easier way to drop off a family to Disneyland Park", "answer": "best way for drop off family is at down town Disney. Drop them off then you can take a short walk to the park. ", "askDate": "5 years ago", "askedBy": { "name": "Cecilia Salcedo", "url": "https://www.google.com/maps/contrib/109041536347893604294" }, "answerDate": "5 years ago", "answeredBy": { "name": "Gabby Lujan", "url": "https://www.google.com/maps/contrib/105966144333216697667" } }

Web results

"webResults": [ { "title": "Hotel & restaurant SIGNAL, Pardubice – Updated 2023 Prices", "displayedUrl": "https://www.booking.com › hotel › signal", "description": "Located 1.2 mi from Pardubice city center, this hotel offers a ... Josefa Janáčka 708, Pardubice, 53012, Czech Republic – Great location - show map." }, { "title": "Hotel & restaurant SIGNAL, Pardubice - Booking.com", "displayedUrl": "https://www.booking.com › signal.en-gb.html", "description": "Located 2 km from Pardubice city centre, this hotel offers a traditional ... Josefa Janáčka 708, Pardubice, 53012, Czech Republic – Great location - show ..." }, { "title": "Hotel & restaurant SIGNAL, Pardubice - 2023 Reviews ...", "displayedUrl": "https://www.agoda.com › ... › Pardubice Hotels", "description": "Hotel & restaurant SIGNAL. Josefa Janáčka 708, Pardubice III, Pardubice, Czech Republic, 53012 - See map." } ],

Tips and tricks: define a search area

This step-by-step guide🔗 will show you the ways you can customize geolocation features and overcome the 120 results limit.

Location, country, state, county, city, and postal code

Easily check the location matching your geolocation input on the official Open Stree Map page. This is the API the scraper uses for geolocation.

Using free text locationQuery should set you up but you can instead use a combination of country, state, city, etc if locationQuery doesn't work for your search.

Automatic zooming

The scraper automatically zooms the map to ensure the most efficient scraping based on the size of the scraped area. Locations with a smaller area have a higher zoom than bigger locations. Higher zoom can find more places but it also takes significantly longer to run and is more computationally expensive. Generally, there are diminishing returns for increasing zoom.

Currently, example zoom values for various locations are (maximum for automatic is 17):

  • United States - 10 zoom (10,371,139 km2)
  • Germany - 12 zoom (380,878 km2)
  • London - 15 zoom (1,595 km2)
  • Manhattan - 16 zoon (87.5 km2)
  • Soho - 17 zoom (0.35 km2)

You can override the zoom input parameter. zoom can be any number between 1 (a whole globe) and 21 (a few houses).

Deeper city scrape

Enabling deeperCityScrape option extracts significantly more places from larger areas because each city inside the region is more focused. It also helps the scraper to skip areas without any population like deserts, mountains or oceans. This is especially important for countries with larger areas without population like Australia or Canada.

Be aware that enabling this feature increases the runtime (by extracting more places).

This feature will likely become a default setting in the near future but is currently opt-in to allow for a smooth transition.

Custom search area

If your location can’t be found or you want to customize it, you can use the custom search area function for the creation of start URLs. As an example, see the geojson field in Nominatim Api (see here for the example of Cambridge in Great Britain). There are several types of search area geometry that you can use. All follow the official Geo Json RFC.

  • Keep note that the order of longitude and latitude is reversed in GeoJson compared to the Google Maps website. The first field must be longitude, the second field must be latitude.

https://geojson.io is an excelent tool to create customGeolocation of any type with the correct format.

Ale GeoJson types are supported but the most useful are Polygon, MultiPolygon and Point (Circle).

Polygon

The most common type is a polygon, which is a set of points that define the location. The first and last coordinate must be equal (to close the polygon). customGeolocation should have this format:

This example covers most of the city of London, UK.

{ "type": "Polygon", "coordinates": [ [ [ // Must be the same as last one -0.322813, // Longitude 51.597165 // Latitude ], [ -0.314990, 51.388023 ], [ 0.060493, 51.389199 ], [ 0.051936, 51.600360 ], [ // Must be the same as first one -0.322813, 51.597165 ] // ... ] ] }

MultiPolygon

MultiPolygon can combine more polygons that are not continuous together.

{ "type": "MultiPolygon", "coordinates": [ [ // first polygon [ [ 12.0905752, // Longitude 50.2524063 // Latitude ], [ 12.1269337, 50.2324336 ], // ... ] ], [ // second polygon // ... ] ] }

Circle

For a circle, we can use the Point type with our custom parameter radiusKm. Don't forget to change the radius to fit your needs. This example covers the city of Basel in Switzerland.

{ "type": "Point", "coordinates": ["7.5503", "47.5590"], "radiusKm": 8 }

Advanced configuration

One review per row

Normally, each result item contains data about a single place. Each item is displayed as one row in tabulated formats. There is a lot of data about each place, so the tabulated formats get very messy and hard to analyze. Fortunately, there is a solution.

You can tick on the oneReviewPerRow input toggle to get one review per row as output. If you already have a dataset and need to adjust its format, read further.

For example, if you need to analyze reviews, you can configure the download to only contain the data you need and adjust the row/column format. Here's how to get a list of reviews with a place title one review per row: copy the download link in the format you need, paste it to a different tab, and add &unwind=reviews&fields=reviews,title to the end of the link URL, and then press Enter to download it. unwind=reviews means that each review will be on its own row. fields=reviews,title means that only reviews and title will be downloaded, skipping the other data. Otherwise, the output would be very big, but it's also no problem if you don't use fields at all.

The whole download link for, e.g. CSV would look like this (with dataset ID):https://api.apify.com/v2/datasets/DATASET_ID/items?clean=true&format=csv&attachment=true&unwind=reviews&fields=reviews,title

If you don't use oneReviewPerRow, each output place item can contain a maximum of 5000 reviews so in case there are more reviews for that place, a duplicate place is stored with the next 5000 reviews and so on. E.g. in the case of 50,000 reviews, the resulting dataset will have 10 items with the same place. This limitation is due to the size limit of a single item in the Apify dataset.

Changelog

This scraper is under active development. We are always implementing new features and fixing bugs. If you would like to see a new feature or report a bug, please submit an issue on the Apify Console Google Maps actor page. Check the Changelog for a list of recent updates.

Resources on how to scrape Google Maps

Integrations and Google Maps Scraper

Last but not least, Google Maps Scraper can be connected with almost any cloud service or web app thanks to integrations on the Apify platform. You can integrate with Make, Zapier, Slack, Airbyte, GitHub, Google Sheets, Google Drive, and more. Or you can use webhooks to carry out an action whenever an event occurs, e.g. get a notification whenever Google Maps Scraper successfully finishes a run.

Using Google Maps Scraper with the Apify API

The Apify API gives you programmatic access to the Apify platform. The API is organized around RESTful HTTP endpoints that enable you to manage, schedule, and run Apify actors. The API also lets you access any datasets, monitor actor performance, fetch results, create and update versions, and more.

To access the API using Node.js, use the apify-client NPM package. To access the API using Python, use the apify-client PyPI package.

Check out the Apify API reference docs for full details or click on the API tab for code examples.

Your feedback

We’re always working on improving the performance of our Actors. So if you’ve got any technical feedback for Google Maps Scraper or simply found a bug, please create an issue on the Actor’s Issues tab in Apify Console.