How to Scrape Google Maps Using SERP API

Learn how to use Bright Data’s SERP API to scrape Google Maps in this step by step guide.
13 min read
Google Maps API guide

As one of Google’s most popular services, Google Maps offers immense opportunities for businesses to connect with customers and expand their research. With an extensive database of over 200 million places and businesses, Google Maps provides a rich source of data that can be leveraged for various purposes.

To access the data available on the Google Maps Platform, Google provides the Google Maps API. However, this API can be restrictive and pricey. In this article, you’ll learn how to scrape Google Maps without relying on the Google Maps API, using the Bright Data SERP API.

How to Use the Bright Data SERP API for Scraping Google Maps Data

Getting started with the Bright Data SERP API is simple. In this section, you’ll learn how to set up a new Bright Data account, sign up for the SERP API, and integrate it into your Node.js application.

Signing Up for the SERP API

To get started, head over to the SERP API home page and click on the Start free trial button:

SERP API Start

Next, sign up for a free Bright Data account with your details (or using Google) on the dialog that opens up:

Once you’re done with the registration, you are redirected to your Bright Data dashboard. Click on the View proxy products button under the Proxies & Scraping Infrastructure section:

Bright Data dashboard

On the Proxies & Scraping Infrastructure page, click on the Get Started button on the SERP API card:

On the next page, you are shown the details of the SERP API, with an estimated monthly cost that you’ll be charged. Your trial account should have enough credits to cover your initial requests.

On this page, choose a name for your API instance (something like “maps” works fine). For the Ads mode question, leave it set to Off. The Ads mode option comes in handy when you want to include or exclude ads from the Google Search result pages.

Additionally, leave Asynchronous request off for the sake of this tutorial. When implementing the API in your app, you could consider turning it on if your system supports async processing. It can help improve your system’s efficiency, especially when working with large data objects.

Once you’re done, click on the Add button:

At this point, you’ve created a new instance of the SERP API. Now, you can see the credentials that you can use to access the API. The portal also provides you with a sample curl request that you can copy and use in your terminal to test the new set of credentials right away:

This completes the setup on the Bright Data platform. Make sure to note down the proxy host, username, and password provided on this screen, as you need them to access the SERP API from your Node.js/Python apps.

Using the SERP API in Node.js

To use the SERP API in Node.js, start by creating a new directory and initializing a new Node.js project in it:

mkdir serp-node

cd serp-node

npm init

Choose the default values for creating the project. Once the project is created, create a new file, index.js, to store your Node.js script in:

touch index.js

Before saving the script, install the request-promise module to help make HTTP requests easily by running the following command:

npm install request-promise

Store the following code in it (make sure to update the proxy details with your SERP API instance values):

const request = require('request-promise');


// Define parameters to pass into the API request
const keyword = process.argv[2]
const username = 'xxxx';    // your proxy username
const password = 'xxxx';    // your proxy password
const port = 0000;          // your proxy port
const host = 'xxxx'         // your proxy host
const session_id = (1000000 * Math.random())|0;
const super_proxy = 'http://'+username+'-session-'+session_id+':'+password+'@'+ host + ':'+port;
const options = {
    url: 'https://www.google.com/maps/search/' + keyword.replace(' ', '+') + '/?gl=us&lum_json=1',
    proxy: super_proxy,
    rejectUnauthorized: false
};

// Send request to the Maps search API
request(options)
.then(function(data){ 
    
    // Parse the response as JSON
    const result = JSON.parse(data)

    // Print the response JSON
    console.log("Printing Maps search results...")
    console.log(result)

    // Extract the  f_id of the first search result
    const f_id = result.organic[0].fid

    // Define API request parameters for retrieving reviews for the search result
    var options = {
        url: 'https://www.google.com/reviews?fid=' + f_id + '&lum_json=1',
        proxy: super_proxy,
        rejectUnauthorized: false
    };


    // Send request to the Reviews API
    request(options)
    .then(function(data){ 
        console.log("Printing Google Reviews results...")

        // Parse and print the response
        console.log(JSON.stringify(JSON.parse(data), null, 2)) 
    },
    function(err){ console.error(err); })

},
    function(err){ console.error(err); });

The script takes in the search keywords as command line arguments. After saving the file, run it using the following command:

node index.js "hotels california"

Here’s what the output looks like:

Printing Maps search results...
{
  general: {
    query: 'hotels california',
    language: 'en',
    country: 'United States',
    country_code: 'US',
    gl: 'US'
  },
  organic: [
    {
      "title": "Freehand Los Angeles",
      "display_link": "freehandhotels.com",
      "link": "https://freehandhotels.com/los-angeles/?utm_source=google-my-business&utm_medium=organic&utm_campaign=hotel-los-angeles",
      "address": "416 W 8th St, Los Angeles, CA 90014",
      "phone": "+12136120021",
      "category": [
        {
          "title": "4-star hotel"
        },
        {
          "id": "hotel",
          "title": "Hotel"
        }
      ],
      "tags": [
        {
          "group_id": "hotel_amenities",
          "group_title": "Hotel amenities",
          "key_id": 21,
          "value_title": "Pool"
        },
        {
          "group_id": "hotel_amenities",
          "group_title": "Hotel amenities",
          "key_id": 22,
          "value_title": "Free Wi-Fi"
        },
        {
          "group_id": "hotel_amenities",
          "group_title": "Hotel amenities",
          "key_id": 2,
          "value_title": "Air-conditioned"
        },
        {
          "group_id": "hotel_amenities",
          "group_title": "Hotel amenities",
          "key_id": 10,
          "value_title": "Breakfast"
        }
      ],
      "summary": "Hip hotel with a rooftop pool & bar",
      "description": "Trendy dorms & rooms in a funky lodging with dining & breakfast, plus a rooftop pool & bar.",
      "rating": 4.1,
      "reviews_cnt": 2263,
      "latitude": 34.044755099999996,
      "longitude": -118.2564556,
      "claimed": true,
      "fid": "0x80c2c7b58e08cd13:0xb74eac0b89b08e66",
      "map_id_encoded": "ChIJE80IjrXHwoARZo6wiQusTrc",
      "map_id": "0x80c2c7b58e08cd13:0xb74eac0b89b08e66",
      "map_link": "https://www.google.com/maps/place/data=!3m1!4b1!4m2!3m1!1s0x80c2c7b58e08cd13:0xb74eac0b89b08e66",
      "original_image": "https://lh5.googleusercontent.com/p/AF1QipOmiTy09SlFk0wu-kXofG9Nfu_sz0Pg6ffFjBry=w408-h272-k-no",
      "image": "https://lh5.googleusercontent.com/p/AF1QipOmiTy09SlFk0wu-kXofG9Nfu_sz0Pg6ffFjBry=w137-h92-k-no",
      "thumbnail": "https://lh5.googleusercontent.com/p/AF1QipOmiTy09SlFk0wu-kXofG9Nfu_sz0Pg6ffFjBry=w128-h86-k-no",
      "icon": "https://lh5.googleusercontent.com/-1FySCxGYcRE/AAAAAAAAAAI/AAAAAAAAAAA/cD1i5xM2CPs/s44-p-k-no-ns-nd/photo.jpg",
      "image_url": "https://lh5.googleusercontent.com/p/AF1QipOmiTy09SlFk0wu-kXofG9Nfu_sz0Pg6ffFjBry=w137-h92-k-no",
      "rank": 1
    }
    // 19 records omitted
  ],
  ads: [
    {
      title: 'Hampton Inn & Suites Rohnert Park - Sonoma County',
      address: '6248 Redwood Dr, Rohnert Park, CA 94928',
      category: [Array],
      tags: [Array],
      summary: 'Low-key hotel with a pool & a gym',
      description: 'Unpretentious hotel offering an outdoor pool & a fitness room, plus parking & breakfast.',
      rating: 4.4,
      reviews_cnt: 215,
      latitude: 38.350170999999996,
      longitude: -122.71469599999999,
      claimed: true,
      fid: '0x80844a0972b561ed:0x1d15c4c13ac0e7cc',
      map_id_encoded: 'ChIJ7WG1cglKhIARzOfAOsHEFR0',
      map_id: '0x80844a0972b561ed:0x1d15c4c13ac0e7cc',
      map_link: 'https://www.google.com/maps/place/data=!3m1!4b1!4m2!3m1!1s0x80844a0972b561ed:0x1d15c4c13ac0e7cc',
      original_image: 'https://lh3.googleusercontent.com/gps-proxy/AE4_-5FpvLkXD1XpPW4nu3lyfKyKBIRFpSq4eqdABiJhNpxR3mm1nXC2a4WD-CxpFwGIe3FZqXr1gnRJd-QpgqE-sRCE8zu7LeRXzUdGWCSr3yTJURar4MS0duJxol4JQ9e3LR6jFWxtzwrvAuXmasAdUhefZSQzU3_OM1K46SyCXrX819IcmStXtSqzYw=w408-h272-k-no',
      image: 'https://lh3.googleusercontent.com/gps-proxy/AE4_-5FpvLkXD1XpPW4nu3lyfKyKBIRFpSq4eqdABiJhNpxR3mm1nXC2a4WD-CxpFwGIe3FZqXr1gnRJd-QpgqE-sRCE8zu7LeRXzUdGWCSr3yTJURar4MS0duJxol4JQ9e3LR6jFWxtzwrvAuXmasAdUhefZSQzU3_OM1K46SyCXrX819IcmStXtSqzYw=w138-h92-k-no',
      thumbnail: 'https://lh3.googleusercontent.com/gps-proxy/AE4_-5FpvLkXD1XpPW4nu3lyfKyKBIRFpSq4eqdABiJhNpxR3mm1nXC2a4WD-CxpFwGIe3FZqXr1gnRJd-QpgqE-sRCE8zu7LeRXzUdGWCSr3yTJURar4MS0duJxol4JQ9e3LR6jFWxtzwrvAuXmasAdUhefZSQzU3_OM1K46SyCXrX819IcmStXtSqzYw=w129-h86-k-no',
      image_url: 'https://lh3.googleusercontent.com/gps-proxy/AE4_-5FpvLkXD1XpPW4nu3lyfKyKBIRFpSq4eqdABiJhNpxR3mm1nXC2a4WD-CxpFwGIe3FZqXr1gnRJd-QpgqE-sRCE8zu7LeRXzUdGWCSr3yTJURar4MS0duJxol4JQ9e3LR6jFWxtzwrvAuXmasAdUhefZSQzU3_OM1K46SyCXrX819IcmStXtSqzYw=w138-h92-k-no',
      rank: 1
    },
    // 1 record omitted
  ]
}
Printing Google Reviews results...
{
  "reviews": [
    {
      "reviewer": {
        "profile_photo_url": "https://lh3.googleusercontent.com/a-/AD_cMMTCnapnhVKwImX7-W1lGGDw8-jYDbjZ7bi7EQcRjQ=s40-c-c0x00000000-cc-rp-mo-ba3-br100",
        "display_name": "Leroy T"
      },
      "rating": "4/5",
      "review_reply": "Thank you for your review, Leroy! It is great to see that you enjoyed your time with us. …",
      "comment": "Overall it was a great stay, i had the deluxe king corner one. Which I suggest go to their website to book where you can select a corner unit.I rated 4 out of 5 because i feel that they can improve by having breakfast included, kettle/coffee maker, complimentary water, toothbrush toothpaste but I guess since I'm writing this review at least future clients will be aware.As far as safety, the elevator and 24/7 door by the elevator is card key access. So felt pretty safe.Costumer service was great smooth checkin and out even the housekeeper was nice.Facilities are nice the pool hours are in the pictures didn't use the gym so I can't speak about that.",
      "photos": [
        "https://lh5.googleusercontent.com/p/AF1QipPfJceU9nK8p0FhUDl0mIObGUC1AoEF2bZMDDs6=w100-h100-p-n-k-no",
        "https://lh5.googleusercontent.com/p/AF1QipPCpi4ED4kk7FFvDxdh9HrsB60Pr01sUkL3FP_o=w100-h100-p-n-k-no",
        "https://lh5.googleusercontent.com/p/AF1QipMjNO_OAG8QA74JszAAE2K6gicxbGEMAQbRXtwt=w100-h100-p-n-k-no",
        "https://lh5.googleusercontent.com/p/AF1QipMjDjq7wP8iUbUiFeBNFHjzOFBr6aVUPDcfDSHe=w100-h100-p-n-k-no",
        "https://lh5.googleusercontent.com/p/AF1QipNcccwmp8K24QID0jU9PcyWq2QswyyK6oc6gf1d=w100-h100-p-n-k-no",
        "https://lh5.googleusercontent.com/p/AF1QipNCnCfWeAdQ7JUbZHzFL_myn_S9Uv6rIiq7e6bV=w100-h100-p-n-k-no",
        "https://lh5.googleusercontent.com/p/AF1QipNtFZMp7PZNr7e9OabzzVeGWzadGsgW7DUY2pcC=w100-h100-p-n-k-no"
      ],
      "created": "5 months ago on Google",
      "star_rating": "4/5"
    },
    // More records omitted
  ]

Understanding the Information You Retrieved

The script used in this example follows this structure:

  1. Retrieve the Google Maps search results for the given keywords
  2. Access and retrieve the reviews for the first search result for the given keyword

Here’s what a search result from the SERP API looks like:

{
  "title": "Freehand Los Angeles",
  "display_link": "freehandhotels.com",
  "link": "https://freehandhotels.com/los-angeles/?utm_source=google-my-business&utm_medium=organic&utm_campaign=hotel-los-angeles",
  "address": "416 W 8th St, Los Angeles, CA 90014",
  "phone": "+12136120021",
  "category": [
    {
      "title": "4-star hotel"
    },
    {
      "id": "hotel",
      "title": "Hotel"
    }
  ],
  "tags": [
    {
      "group_id": "hotel_amenities",
      "group_title": "Hotel amenities",
      "key_id": 21,
      "value_title": "Pool"
    },
    {
      "group_id": "hotel_amenities",
      "group_title": "Hotel amenities",
      "key_id": 22,
      "value_title": "Free Wi-Fi"
    },
    {
      "group_id": "hotel_amenities",
      "group_title": "Hotel amenities",
      "key_id": 2,
      "value_title": "Air-conditioned"
    },
    {
      "group_id": "hotel_amenities",
      "group_title": "Hotel amenities",
      "key_id": 10,
      "value_title": "Breakfast"
    }
  ],
  "summary": "Hip hotel with a rooftop pool & bar",
  "description": "Trendy dorms & rooms in a funky lodging with dining & breakfast, plus a rooftop pool & bar.",
  "rating": 4.1,
  "reviews_cnt": 2263,
  "latitude": 34.044755099999996,
  "longitude": -118.2564556,
  "claimed": true,
  "fid": "0x80c2c7b58e08cd13:0xb74eac0b89b08e66",
  "map_id_encoded": "ChIJE80IjrXHwoARZo6wiQusTrc",
  "map_id": "0x80c2c7b58e08cd13:0xb74eac0b89b08e66",
  "map_link": "https://www.google.com/maps/place/data=!3m1!4b1!4m2!3m1!1s0x80c2c7b58e08cd13:0xb74eac0b89b08e66",
  "original_image": "https://lh5.googleusercontent.com/p/AF1QipOmiTy09SlFk0wu-kXofG9Nfu_sz0Pg6ffFjBry=w408-h272-k-no",
  "image": "https://lh5.googleusercontent.com/p/AF1QipOmiTy09SlFk0wu-kXofG9Nfu_sz0Pg6ffFjBry=w137-h92-k-no",
  "thumbnail": "https://lh5.googleusercontent.com/p/AF1QipOmiTy09SlFk0wu-kXofG9Nfu_sz0Pg6ffFjBry=w128-h86-k-no",
  "icon": "https://lh5.googleusercontent.com/-1FySCxGYcRE/AAAAAAAAAAI/AAAAAAAAAAA/cD1i5xM2CPs/s44-p-k-no-ns-nd/photo.jpg",
  "image_url": "https://lh5.googleusercontent.com/p/AF1QipOmiTy09SlFk0wu-kXofG9Nfu_sz0Pg6ffFjBry=w137-h92-k-no",
  "rank": 1
}

As you can see, the API returns all basic information about a search result (ie a place), which includes its title, link, address, and contact details. Additionally, the API also returns other details, such as amenities, a review summary, rating, coordinates, images, and category details.

Here’s what a review retrieved using the SERP looked like:

{
      "reviewer": {
        "profile_photo_url": "https://lh3.googleusercontent.com/a-/AD_cMMTCnapnhVKwImX7-W1lGGDw8-jYDbjZ7bi7EQcRjQ=s40-c-c0x00000000-cc-rp-mo-ba3-br100",
        "display_name": "Leroy T"
      },
      "rating": "4/5",
      "review_reply": "Thank you for your review, Leroy! It is great to see that you enjoyed your time with us. …",
      "comment": "Overall it was a great stay, i had the deluxe king corner one. Which I suggest go to their website to book where you can select a corner unit.I rated 4 out of 5 because i feel that they can improve by having breakfast included, kettle/coffee maker, complimentary water, toothbrush toothpaste but I guess since I'm writing this review at least future clients will be aware.As far as safety, the elevator and 24/7 door by the elevator is card key access. So felt pretty safe.Costumer service was great smooth checkin and out even the housekeeper was nice.Facilities are nice the pool hours are in the pictures didn't use the gym so I can't speak about that.",
      "photos": [
        "https://lh5.googleusercontent.com/p/AF1QipPfJceU9nK8p0FhUDl0mIObGUC1AoEF2bZMDDs6=w100-h100-p-n-k-no",
        "https://lh5.googleusercontent.com/p/AF1QipPCpi4ED4kk7FFvDxdh9HrsB60Pr01sUkL3FP_o=w100-h100-p-n-k-no",
        "https://lh5.googleusercontent.com/p/AF1QipMjNO_OAG8QA74JszAAE2K6gicxbGEMAQbRXtwt=w100-h100-p-n-k-no",
        "https://lh5.googleusercontent.com/p/AF1QipMjDjq7wP8iUbUiFeBNFHjzOFBr6aVUPDcfDSHe=w100-h100-p-n-k-no",
        "https://lh5.googleusercontent.com/p/AF1QipNcccwmp8K24QID0jU9PcyWq2QswyyK6oc6gf1d=w100-h100-p-n-k-no",
        "https://lh5.googleusercontent.com/p/AF1QipNCnCfWeAdQ7JUbZHzFL_myn_S9Uv6rIiq7e6bV=w100-h100-p-n-k-no",
        "https://lh5.googleusercontent.com/p/AF1QipNtFZMp7PZNr7e9OabzzVeGWzadGsgW7DUY2pcC=w100-h100-p-n-k-no"
      ],
      "created": "5 months ago on Google",
      "star_rating": "4/5"
    },

Each review retrieved by the SERP API carries complete details of the review, including the review message, replies to the reviews, images (if any), rating, and basic reviewer details, such as name and photo. This data object is sufficient to help you understand how a business is doing based on the reviews that users leave for it on Google Maps.

Conclusion

While the Google Maps API is a great tool for embedding Google Maps in your app, it’s not the best option for accessing Google Maps data. With issues like rate limiting, high pricing, and limited data points, it makes sense to go for a dedicated API that can provide you with a better experience at a lower cost.

In this article, you saw how the Bright Data SERP API is better than the Places API offered as a part of the Google Maps API for retrieving Google Maps data. You also saw how to set it up in your own project.

This article should help you easily and efficiently extract the information you need from Google Maps. Make sure to sign up for your free trial of the SERP API today.

You might also be interested in

Best web scraping services
Web Data

How To Choose the Best Web Scraping Service: A Complete Guide

Best web scraping services guide. Read about what you should consider when evaluating a web scraping provider and 5 don’ts when selecting scraping services
10 min read
Best proxy provider
Proxy 101

How To Choose the Best Proxy Provider

What should you look for when looking for the best proxy provider? Read this guide to gain insights when comparing proxy providers,
9 min read
API for dummies
Web Data

APIs for Dummies: Learning About APIs

Application programming interfaces (APIs) define the standards and protocols that allow different software components to communicate with each other. They let applications request data and actions from independent systems. APIs are everywhere. They underpin virtually all interactions with your devices and software. For instance, the apps on your phone use APIs to fetch data from […]
16 min read
Proxy 101

Datacenter Proxies Vs. Residential Proxies: A deep dive comparison

‘How fast are the IPs?’; ‘How effective are they in circumventing target site blockades?’; ‘How unique are the IPs?’; ‘How many locations are available?’; ‘How costly are they to the end user?’ – All your questions answered.
9 min read
Proxy 101

Guide on How to Bypass an IP Ban in 2023

Learn how to change your MAC, use a VPN to change your IP address, clear your computer’s cache, as well as discovering tools and tips on how to use proxy solutions
6 min read

More from Bright Data

Datasets Icon
Get immediately structured data
Access reliable public web data for any use case. The datasets can be downloaded or delivered in a variety of formats. Subscribe to get fresh records of your preferred dataset based on a pre-defined schedule.
Web scraper IDE Icon
Build reliable web scrapers. Fast.
Build scrapers in a cloud environment with code templates and functions that speed up the development. This solution is based on Bright Data’s Web Unlocker and proxy infrastructure making it easy to scale and never get blocked.
Web Unlocker Icon
Implement an automated unlocking solution
Boost the unblocking process with fingerprint management, CAPTCHA-solving, and IP rotation. Any scraper, written in any language, can integrate it via a regular proxy interface.

Ready to get started?