Google Maps Scraper avatar
Google Maps Scraper
Try for free

1 day trial then $25.00/month - No credit card required now

View all Actors
Google Maps Scraper

Google Maps Scraper

onidivo/google-maps-scraper
Try for free

1 day trial then $25.00/month - No credit card required now

Obtain more significant and quicker amounts of data from Google Maps compared to what is available through the official Google Places API.

Google Maps Scraper

Obtain larger and quicker amounts of data from Google Maps compared to what is available through the official Google Places API.

Features

  • Rich and well formatted data extraction
  • Multiple search options
  • Multiple search area options
  • Maximum results beyond the visual ones
  • Advanced proxy, browser, and scraping configuration
  • Full integrations with other tools

Cost of usage

Using the Free plan ($5 free usage credits) and with low complexity of searches, you could get up to 1,200 results.

If you need more data, subscribe to a paid plan. We recommend the $49/month Personal plan that allows you to get up to 20,000 results. For more details about usage credits, see this video guide on ▷ how to choose the right subscription plan.

Bugs, issues, features, and feedback

You can report issues on the Actor tab "Issues" or here and discuss or leave your feedback here.

Input

The Google Maps Scraper has the following input options:

Apify Console scraper input

Or here's its equivalent in JSON:

1{
2    "searchStringsArray": [
3        "dentist in California"
4    ],
5    "maxCrawledPlacesPerSearch": 10,
6    "language": "en",
7    "maxImages": 10,
8    "exportPlaceUrls": false,
9    "maxReviews": 0,
10    "scrapeReviewerName": true,
11    "scrapeReviewerId": true,
12    "scrapeReviewerUrl": true,
13    "scrapeReviewId": true,
14    "scrapeReviewUrl": true,
15    "scrapeResponseFromOwnerText": true,
16    "proxyConfig": {
17        "useApifyProxy": true
18    },
19    "oneReviewPerRow": false,
20    "reviewsSort": "newest",
21    "reviewsTranslation": "originalAndTranslated",
22    "allPlacesNoSearchAction": ""
23}

Output

The output from Google Maps Scraper is stored in a dataset, and it looks like the following Apify Console scraper output

Also, in JSON format:

1[
2    {
3        "title": "Harbour Dental Family & Cosmetic Dentistry",
4        "subTitle": null,
5        "description": null,
6        "price": null,
7        "menu": null,
8        "categoryName": "Dentist",
9        "address": "5219 Warner Ave, Huntington Beach, CA 92649",
10        "locatedIn": "Meadowlark Plaza",
11        "neighborhood": "5219 Warner Ave",
12        "street": "5219 Warner Ave",
13        "city": "Huntington Beach",
14        "postalCode": "92649",
15        "state": "California",
16        "countryCode": "US",
17        "plusCode": "PX86+MM Huntington Beach, California",
18        "website": "https://www.harbourdentaloc.com/",
19        "phone": "(714) 846-0000",
20        "temporarilyClosed": false,
21        "claimThisBusiness": false,
22        "location": {
23            "lat": 33.7167109,
24            "lng": -118.0382981
25        },
26        "permanentlyClosed": false,
27        "totalScore": 4.7,
28        "isAdvertisement": false,
29        "rank": 17,
30        "placeId": "ChIJ7UAhLskl3YARIc4Crpe5Clw",
31        "categories": [
32            "Dentist",
33            "Dental clinic"
34        ],
35        "cid": "6632317462367096353",
36        "url": "https://www.google.com/maps/place/Harbour+Dental+Family+%26+Cosmetic+Dentistry/@33.7167109,-118.0382981,17z/data=!3m1!4b1!4m6!3m5!1s0x80dd25c92e2140ed:0x5c0ab997ae02ce21!8m2!3d33.7167109!4d-118.0382981!16s%2Fg%2F1vv2sjz0?hl=en&entry=ttu",
37        "searchPageUrl": "https://www.google.com/maps/search/dentist/@33.639860649999996,-118.05620131793336,12z?hl=en",
38        "searchPageLoadedUrl": "https://www.google.com/maps/search/dentist/@33.6398606,-118.0562013,12z?hl=en&entry=ttu",
39        "searchString": "dentist",
40        "scrapedAt": "2024-02-20T08:20:35.985Z",
41        "openingHours": [
42            {
43                "day": "Monday",
44                "hours": "9 AM to 5 PM"
45            },
46            {
47                "day": "Tuesday",
48                "hours": "9 AM to 5 PM"
49            },
50            {
51                "day": "Wednesday",
52                "hours": "9 AM to 5 PM"
53            },
54            {
55                "day": "Thursday",
56                "hours": "9 AM to 5 PM"
57            },
58            {
59                "day": "Friday",
60                "hours": "8 AM to 4 PM"
61            },
62            {
63                "day": "Saturday",
64                "hours": "Closed"
65            },
66            {
67                "day": "Sunday",
68                "hours": "Closed"
69            }
70        ],
71        "peopleAlsoSearch": [
72            {
73                "category": "People also search for",
74                "title": "Harbor Smiles / Dental care: Huntington Beach",
75                "reviewsCount": 292,
76                "totalScore": 4.7
77            },
78            {
79                "category": "People also search for",
80                "title": "Sea Breeze Dental of Huntington Beach",
81                "reviewsCount": 12,
82                "totalScore": 4.4
83            },
84            {
85                "category": "People also search for",
86                "title": "Harbour landing",
87                "reviewsCount": 35,
88                "totalScore": 4.4
89            },
90            {
91                "category": "People also search for",
92                "title": "Ford Dental Group",
93                "reviewsCount": 220,
94                "totalScore": 4.9
95            },
96            {
97                "category": "People also search for",
98                "title": "Huntington Beach Dental Center",
99                "reviewsCount": 313,
100                "totalScore": 4.9
101            }
102        ],
103        "additionalInfo": {
104            "Accessibility": [
105                {
106                    "Wheelchair accessible entrance": true
107                },
108                {
109                    "Wheelchair accessible parking lot": true
110                },
111                {
112                    "Wheelchair accessible restroom": true
113                }
114            ],
115            "Amenities": [
116                {
117                    "Restroom": true
118                }
119            ],
120            "Planning": [
121                {
122                    "Accepts new patients": true
123                },
124                {
125                    "Appointments recommended": true
126                }
127            ]
128        },
129        "reviewsCount": 40,
130        "reviewsDistribution": {
131            "oneStar": 3,
132            "twoStar": 0,
133            "threeStar": 0,
134            "fourStar": 0,
135            "fiveStar": 37
136        },
137        "imagesCount": 8,
138        "imageUrls": [
139            "https://lh5.googleusercontent.com/p/AF1QipOsGWwDqrGkCVrLtywdvRzRrf1tCPfpF--_eBTb=w1920-h1080-k-no",
140            "https://lh5.googleusercontent.com/p/AF1QipNMKgUu5G-3C0jm9sWH8xt_gzAFOcq7dgzv_m0M=w1920-h1080-k-no"
141        ],
142        "reviews": [],
143        "reviewsTags": [
144            {
145                "title": "cleaning",
146                "count": 5
147            },
148            {
149                "title": "ngo",
150                "count": 3
151            },
152            {
153                "title": "healthy",
154                "count": 3
155            }
156        ],
157        "orderBy": []
158    }
159]

Additional fields are also extracted for specific cases:

Reviews

1"reviews": [
2  {
3    "name": "H. Matthis",
4    "text": "I’ve been coming here for over 2yrs. As an adult who had braces I needed a dentist who would help take care of my teeth throughout, I wasn’t disappointed and I continue to have my cleanings here post braces.\nThe office staff and hygienists are super friendly & welcoming too.\n\nHighly recommended",
5    "publishAt": "5 months ago",
6    "publishedAtDate": "2023-09-11T06:02:48.569Z",
7    "likesCount": 2,
8    "reviewId": "ChdDSUhNMG9nS0VJQ0FnSUNabnVPUTZBRRAB",
9    "reviewUrl": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sChdDSUhNMG9nS0VJQ0FnSUNabnVPUTZBRRAB!2m1!1s0x0:0x5c0ab997ae02ce21!3m1!1s2@1:CIHM0ogKEICAgICZnuOQ6AE%7CCgwIiNv6pwYQyK_QjwI%7C?hl=en-US",
10    "reviewerId": "106821760734114220999",
11    "reviewerUrl": "https://www.google.com/maps/contrib/106821760734114220999?hl=en-US",
12    "reviewerPhotoUrl": "https://lh3.googleusercontent.com/a/ACg8ocL4w35XFI3hLJg0y6LScNJmo0i9C_qImiUUs_XYKgMw=s120-c-rp-mo-br100",
13    "reviewerNumberOfReviews": 1,
14    "isLocalGuide": false,
15    "stars": 5,
16    "rating": null,
17    "responseFromOwnerDate": "2023-11-30T22:40:22.464Z",
18    "responseFromOwnerText": "Thank you for taking the time to leave a review! We appreciate your continued trust in us and are glad to hear that our team has provided you with friendly and welcoming service. We look forward to continuing to take care of your dental needs.",
19    "reviewImageUrls": []
20  },
21]

Questions and answers

1"questionsAndAnswers": {
2		"question": "Do they take Medicare ",
3		"answer": "I'm not sure! I don't have dental insurance, so I pay cash for my services!",
4		"askDate": "a year ago",
5		"askedBy": {
6			"name": "Fernando Arriola (Freddy)",
7			"url": "https://www.google.com/maps/contrib/108082017962317357964"
8		},
9		"answerDate": "a year ago",
10		"answeredBy": {
11			"name": "Tony Giuffreda",
12			"url": "https://www.google.com/maps/contrib/110769902613957061825"
13		}
14}

Customised search location

Country, state, county, city, and postal code vs. latitude and longitude

You can speed up the search and consume fewer platform credits by reducing the radius of the geographical area to scrape. You can use any combination of the geolocation parameters: country, state, county, city & postalCode. Keep in mind that the first five fields and the coordinate options are mutually exclusive.

Automatic zooming

The scraper automatically zooms the map to ensure maximum results are extracted. Higher zoom ensures more (less known) places are scraped. Logically, the smaller the area is, the higher zoom should be used. Currently, the default zoom values are:

  • no geolocation -> 12
  • country or state -> 12
  • county -> 14
  • city -> 15
  • postalCode -> 16 If you need even more results or a faster run, you can override these values with the zoom input parameter. zoom can be any number between 1 (whole globe) and 21 (few houses).

Custom search area

If you want a very customized location, you can use the custom search area function. As an example, see the geojson field in Nominatim Api ( e.g, Malaga in Spain) .

We recommend using geojson.io to create customGeolocation. You just need to copy the geometry data.

Polygon

The most common type is 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:

1{
2    "type": "Polygon",
3    "coordinates": [
4        [
5            [
6                // similar to the last item
7                5.780379384557904,
8                36.27593557577805
9            ],
10            [
11                2.346303273485148,
12                36.209720849356444
13            ],
14            [
15                2.1355022082646826,
16                34.13965567461064
17            ],
18            [
19                6.307816409423452,
20                34.073316430466164
21            ],
22            [
23                6.158281152270234,
24                35.44634969647147
25            ],
26            [
27                // similar to the first item
28                5.780379384557904,
29                36.27593557577805
30            ]
31        ]
32    ]
33}

MultiPolygon

MultiPolygon can combine more polygons that are not continuous together.

1{
2    "type": "MultiPolygon",
3    "coordinates": [
4        [
5            // first polygon
6            [
7                -4.5878887,
8                36.7841131
9            ],
10            [
11                -4.5775866,
12                36.7171692
13            ]
14            // ...
15        ],
16        [
17            // second polygon
18            // ...
19        ]
20    ]
21}

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.

1{
2    "type": "Point",
3    "coordinates": [
4        "-4.477740795635299",
5        "36.70672976387528"
6    ],
7    "radiusKm": 6
8}
Developer
Maintained by Community
Actor metrics
  • 19 monthly users
  • 84.6% runs succeeded
  • 1.4 days response time
  • Created in Feb 2024
  • Modified 13 days ago