Scraping Google maps search result links with Puppeteer

Viewed 1532

This is what I would like to scrape.

I enter a search query to "www.google.com/maps" such as "flower shop chicago". When all flower shops in chicago listed on Google maps result, I would like to console log [name of the shop] and [link of the shop, e.g href link] as an array.

I use puppeteer.js for this project. My code is able to open Chromium type my search query and enters to get the list of the shops. But, I fail to console log just the name of the shop and links. Here is my code. Basically, I think I am having a hard time finding the correct css selector.

I will be happy if you can help. here is my code

const puppeteer = require('puppeteer');
const xlsx = require("xlsx");

// Get the data
async function getPageData (url,page) {

  await page.goto(url);
 
  //Shop Name
  await page.waitForSelector(".x3AX1-LfntMc-header-title-title span");
  const shopName = await page.$eval(".x3AX1-LfntMc-header-title-title span", span => span.textContent);
  
  //Shop Address
  await page.waitForSelector(".QSFF4-text.gm2-body-2:nth-child(1)");
  const address = await page.$eval(".QSFF4-text.gm2-body-2:nth-child(1)", address => address.textContent);
  
  //Website
  await page.waitForSelector(".HY5zDd");
  const website = await page.$eval(".HY5zDd", website => website.innerText);

  return {
      shop: shopName,
      address: address,
      website: website
  }


  //await browser.close();
};

//Get Links

async function getLinks() {
    const searchQuery = "flower shop chicago";

    browser = await puppeteer.launch({ headless: false });
    const [page] = await browser.pages();

    await page.goto("https://www.google.com/maps/?q=" + searchQuery);
    await page.waitForNavigation({ waitUntil: "load" });

    // Scrolling to bottom of page
    let newScrollHeight = 0;
    let scrollHeight = 1000;

    while (true) {
        await page.waitForSelector("#pane > div > div > div > div > div");

        await page.evaluate(
            (scrollHeight) =>
                document
                    .querySelectorAll("#pane > div > div > div > div > div")[3]
                    .querySelector("div")
                    .scrollTo(0, scrollHeight),
            scrollHeight
        );

        await page.waitForTimeout(200);

        newScrollHeight = await page.evaluate(
            () =>
                document
                    .querySelectorAll("#pane > div > div > div > div > div")[3]
                    .querySelector("div").scrollHeight
        );

        if (scrollHeight === newScrollHeight) {
            break;
        } else {
            scrollHeight = newScrollHeight;
        }
    }

    // Get results
    const searchResults = await page.evaluate(() =>
        Array.from(document.querySelectorAll("a"))
            .map((el) => [el.getAttribute("aria-label"), el.href])
            .filter((el) => {
                if (!el[0]) return false;
                if (el[0] === "Clear search") return false;
                return true;
            })
    );

    return searchResults;
    
}

async function main() {


    const allLinks = await getLinks();
    //console.log(allLinks);

    const browser = await puppeteer.launch({ headless: false });
    const page = await browser.pages();
    const scrapedData = [];

    for(let link of allLinks){

        const data = getPageData (link,page);
        scrapedData.push(data);
    }

     console.log(scrapedData);  
   
}

main();

2 Answers

I think this is what you are asking for,

I made a couple changes:

  • Inject the searchQuery directly into the url
  • Look for all <a> tags instead of specific selectors, then filter those tags and only return the valid ones.
  • use page.waitForNavigation this is helpful if you need to allow cookies
  • The script will continue scrolling until the bottom of the page is reached.

Full code below:

const puppeteer = require("puppeteer"); /// import puppeteer from "puppeteer";
const xlsx = require("xlsx");

// Get the data
async function getPageData(url, page) {
    await page.goto(url);

    //Shop Name
    await page.waitForSelector(".x3AX1-LfntMc-header-title-title span");
    const shopName = await page.$eval(
        "#pane > div > div > div > div > div > div > div > div > h1",
        (name) => name?.textContent
    );

    //Shop Address
    await page.waitForSelector(".QSFF4-text.gm2-body-2:nth-child(1)");
    let address = await page.$$eval(
        "#pane > div > div > div > div > div > div > button > div > div > div",
        (divs) =>
            Array.from(divs)
                .map((div) => div?.innerText)
                .find((address) => /United States/g.test(address))
    );

    if (address === undefined) {
        address = await page.$$eval(
            "#pane > div > div > div > div > div > div > button > div > div > div",
            (divs) => divs[1]
        );
    }

    //Website
    await page.waitForSelector(".HY5zDd");
    const website = await page.$$eval(
        "#pane > div > div > div > div > div > div > button > div > div > div",
        (divs) =>
            Array.from(divs)
                .map((div) => div?.innerText)
                .find((link) =>
                    /^((https?|ftp|smtp):\/\/)?(www.)?[a-z0-9]+(\.[a-z]{2,}){1,3}(#?\/?[a-zA-Z0-9#]+)*\/?(\?[a-zA-Z0-9-_]+=[a-zA-Z0-9-%]+&?)?$/.test(
                        link
                    )
                )
    );

    let returnObj = {
        shop: shopName?.trim(),
        address: address?.trim(),
        website: website?.trim(),
    };

    console.log(returnObj);

    return returnObj;
    //await browser.close();
}

//Get Links

async function getLinks(page) {
    // Scrolling to bottom of page
    let newScrollHeight = 0;
    let scrollHeight = 1000;
    let divSelector = "#pane > div > div > div > div > div:nth-child(4) > div";

    while (true) {
        await page.waitForSelector(divSelector);

        await page.evaluate(
            (scrollHeight, divSelector) =>
                document.querySelector(divSelector).scrollTo(0, scrollHeight),
            scrollHeight,
            divSelector
        );

        await page.waitForTimeout(300);

        newScrollHeight = await page.$eval(
            divSelector,
            (div) => div.scrollHeight
        );

        if (scrollHeight === newScrollHeight) {
            break;
        } else {
            scrollHeight = newScrollHeight;
        }
    }

    // Get results
    const searchResults = await page.evaluate(() =>
        Array.from(document.querySelectorAll("a"))
            .map((el) => el.href)
            .filter(
                (link) =>
                    link.match(/https:\/\/www.google.com\/maps\//g, link) &&
                    !link.match(/\=https:\/\/www.google.com\/maps\//g, link)
            )
    );

    return searchResults;
}

async function main(searchQuery = "flower shop chicago") {
    const browser = await puppeteer.launch({ headless: false });
    const [page] = await browser.pages();

    await page.goto("https://www.google.com/maps/?q=" + searchQuery);
    await page.waitForNavigation({ waitUntil: "domcontentloaded" });
    await page.waitForTimeout(4000);

    let allLinks = [];

    while (
        // Check if the 'Next page' button has been disabled
        !(await page.$$eval(
            "#pane > div > div > div > div > div > div > div",
            (elements) =>
                Array.from(elements).some(
                    (el) => el?.innerText === "No results found"
                )
        ))
    ) {
        // If it hasn't go to the next page
        allLinks.push(...(await getLinks(page)));

        await page.$$eval("button", (elements) =>
            Array.from(elements)
                .find((el) => el.getAttribute("aria-label") === " Next page ")
                .click()
        );

        await page.waitForNavigation({ waitUntil: "load" });
    }

    console.log(allLinks);

    const scrapedData = [];

    for (let link of allLinks) {
        const data = await getPageData(link, page);
        scrapedData.push(data);
    }

    console.log(scrapedData);
}

main();

Output below: (The output is an array of 200 items, I can't show all of them here)

{
  shop: "Donna's Garden Flower Shop - Chicago, IL",
  address: '4155 W Peterson Ave, Chicago, IL 60646, United States',
  website: 'donnasgarden.com'
}
{
  shop: 'Bunches (a flower shop)',
  address: '1501 W Fullerton Ave, Chicago, IL 60614, United States',
  website: 'buncheschicago.com'
}
{
  shop: 'The Flower Shop of Chicago',
  address: '2246 W Taylor St, Chicago, IL 60612, United States',
  website: 'flowershopofchicago.com'
}
{
  shop: "Kelly's Flower Shop",
  address: '175 W Jackson Blvd, Chicago, IL 60604, United States',
  website: 'kellysflowershop.com'
}
{
  shop: 'Chicago Florist - Send Flowers',
  address: undefined,
  website: 'samedayflowerdeliverychicago.com'
}
{
  shop: 'Chicago Flower',
  address: '541 N Fairbanks Ct, Chicago, IL 60611, United States',
  website: 'chicagosmarcelflorist.com'
}
{
  shop: "Steve's Flower Market",
  address: '1039 W Grand Ave, Chicago, IL 60642, United States',
  website: 'pos.floranext.com'
}
{
  shop: 'Bloom Floral Shop | Same Day Flower Delivery Chicago, IL | Best Chicago Florist',    
  address: undefined,
  website: 'bloomfloralshop.com'
}
{
  shop: 'Ashland Addison Florist - Lakeview',
  address: '3118 N Lincoln Ave, Chicago, IL 60613, United States',
  website: 'ashaddflorist.com'
}
{
  shop: "Goldie's Flower Shop",
  address: '901 W Irving Park Rd, Chicago, IL 60613, United States',
  website: 'goldiesflowershop.com'
}
{
  shop: 'Tea Rose Flower Shop',
  address: '5203 N Kimball Ave, Chicago, IL 60625, United States',
  website: 'tearosechicago.com'
}
{
  shop: 'Designs by Ming: Florist & Flower Delivery - Chicago IL Florist, Wedding Flowers Arrangement, Custom Design Flower Shop',
  address: '230 E Ontario St #2401, Chicago, IL 60611, United States',
  website: 'yellowpages.com'
}
{
  shop: 'Crystal Flower Shop, Inc.',
  address: '2815 S Kedzie Ave, Chicago, IL 60623, United States',
  website: 'doordash.com'
}
{
  shop: "Wall's Flower Shop, Inc.",
  address: '5862 W Higgins Ave, Chicago, IL 60630, United States',
  website: 'wallsflowershop.com'
}
{
  shop: 'Fleur de Lis Florist',
  address: '715 N Franklin St, Chicago, IL 60654, United States',
  website: 'fleurdelischicago.com'
}
{
  shop: 'Secret Garden Flower Shop',
  address: '3910 W 71st St, Chicago, IL 60629, United States',
  website: 'secretgardenflowershopil.com'
}
{
  shop: 'Marguerite Gardens Florist',
  address: '2444 W Chicago Ave, Chicago, IL 60622, United States',
  website: 'flowerpowerchicgo.com'
}
{
  shop: "Leo's Metropolitan Florist",
  address: '407 E 71st St, Chicago, IL 60619, United States',
  website: 'doordash.com'
}
{
  shop: 'Bonnie Flower Shop Inc',
  address: '3400 W Irving Park Rd, Chicago, IL 60618, United States',
  website: 'doordash.com'
}
{
  shop: 'Flora Chicago',
  address: '2835 N Southport Ave, Chicago, IL 60657, United States',
  website: 'florachicago.com'
}
{
  shop: "Donna's Garden Flower Shop - Chicago, IL",
  address: '4155 W Peterson Ave, Chicago, IL 60646, United States',
  website: 'donnasgarden.com'
}
{
  shop: 'Bunches (a flower shop)',
  address: '1501 W Fullerton Ave, Chicago, IL 60614, United States',
  website: 'buncheschicago.com'
}
{
  shop: 'The Flower Shop of Chicago',
  address: '2246 W Taylor St, Chicago, IL 60612, United States',
  website: 'flowershopofchicago.com'
}
{
  shop: "Kelly's Flower Shop",
  address: '175 W Jackson Blvd, Chicago, IL 60604, United States',
  website: 'kellysflowershop.com'
}
{
  shop: 'Chicago Florist - Send Flowers',
  address: undefined,
  website: 'samedayflowerdeliverychicago.com'
}
{
  shop: 'Chicago Flower',
  address: '541 N Fairbanks Ct, Chicago, IL 60611, United States',
  website: 'chicagosmarcelflorist.com'
}
{
  shop: "Steve's Flower Market",
  address: '1039 W Grand Ave, Chicago, IL 60642, United States',
  website: 'pos.floranext.com'
}
{
  shop: 'Bloom Floral Shop | Same Day Flower Delivery Chicago, IL | Best Chicago Florist',    
  address: undefined,
  website: 'bloomfloralshop.com'
}
{
  shop: 'Ashland Addison Florist - Lakeview',
  address: '3118 N Lincoln Ave, Chicago, IL 60613, United States',
  website: 'ashaddflorist.com'
}
{
  shop: "Goldie's Flower Shop",
  address: '901 W Irving Park Rd, Chicago, IL 60613, United States',
  website: 'goldiesflowershop.com'
}
{
  shop: 'Tea Rose Flower Shop',
  address: '5203 N Kimball Ave, Chicago, IL 60625, United States',
  website: 'tearosechicago.com'
}
{
  shop: 'Designs by Ming: Florist & Flower Delivery - Chicago IL Florist, Wedding Flowers Arrangement, Custom Design Flower Shop',
  address: '230 E Ontario St #2401, Chicago, IL 60611, United States',
  website: 'yellowpages.com'
}
{
  shop: 'Crystal Flower Shop, Inc.',
  address: '2815 S Kedzie Ave, Chicago, IL 60623, United States',
  website: 'doordash.com'
}
{
  shop: "Wall's Flower Shop, Inc.",
  address: '5862 W Higgins Ave, Chicago, IL 60630, United States',
  website: 'wallsflowershop.com'
}
{
  shop: 'Fleur de Lis Florist',
  address: '715 N Franklin St, Chicago, IL 60654, United States',
  website: 'fleurdelischicago.com'
}
{
  shop: 'Secret Garden Flower Shop',
  address: '3910 W 71st St, Chicago, IL 60629, United States',
  website: 'secretgardenflowershopil.com'
}
{
  shop: 'Marguerite Gardens Florist',
  address: '2444 W Chicago Ave, Chicago, IL 60622, United States',
  website: 'flowerpowerchicgo.com'
}
{
  shop: "Leo's Metropolitan Florist",
  address: '407 E 71st St, Chicago, IL 60619, United States',
  website: 'doordash.com'
}
{
  shop: 'Bonnie Flower Shop Inc',
  address: '3400 W Irving Park Rd, Chicago, IL 60618, United States',
  website: 'doordash.com'
}
{
  shop: 'Flora Chicago',
  address: '2835 N Southport Ave, Chicago, IL 60657, United States',
  website: 'florachicago.com'
}
{
  shop: "Donna's Garden Flower Shop - Chicago, IL",
  address: '4155 W Peterson Ave, Chicago, IL 60646, United States',
  website: 'donnasgarden.com'
}
{
  shop: 'Bunches (a flower shop)',
  address: '1501 W Fullerton Ave, Chicago, IL 60614, United States',
  website: 'buncheschicago.com'
}
{
  shop: 'The Flower Shop of Chicago',
  address: '2246 W Taylor St, Chicago, IL 60612, United States',
  website: 'flowershopofchicago.com'
}
{
  shop: "Kelly's Flower Shop",
  address: '175 W Jackson Blvd, Chicago, IL 60604, United States',
  website: 'kellysflowershop.com'
}
{
  shop: 'Chicago Florist - Send Flowers',
  address: undefined,
  website: 'samedayflowerdeliverychicago.com'
}
{
  shop: 'Chicago Flower',
  address: '541 N Fairbanks Ct, Chicago, IL 60611, United States',
  website: 'chicagosmarcelflorist.com'
}
{
  shop: "Steve's Flower Market",
  address: '1039 W Grand Ave, Chicago, IL 60642, United States',
  website: 'pos.floranext.com'
}
{
  shop: 'Bloom Floral Shop | Same Day Flower Delivery Chicago, IL | Best Chicago Florist',    
  address: undefined,
  website: 'bloomfloralshop.com'
}
{
  shop: 'Ashland Addison Florist - Lakeview',
  address: '3118 N Lincoln Ave, Chicago, IL 60613, United States',
  website: 'ashaddflorist.com'
}
{
  shop: "Goldie's Flower Shop",
  address: '901 W Irving Park Rd, Chicago, IL 60613, United States',
  website: 'goldiesflowershop.com'
}
{
  shop: 'Tea Rose Flower Shop',
  address: '5203 N Kimball Ave, Chicago, IL 60625, United States',
  website: 'tearosechicago.com'
}
{
  shop: 'Designs by Ming: Florist & Flower Delivery - Chicago IL Florist, Wedding Flowers Arrangement, Custom Design Flower Shop',
  address: '230 E Ontario St #2401, Chicago, IL 60611, United States',
  website: 'yellowpages.com'
}
{
  shop: 'Crystal Flower Shop, Inc.',
  address: '2815 S Kedzie Ave, Chicago, IL 60623, United States',
  website: 'doordash.com'
}
{
  shop: "Wall's Flower Shop, Inc.",
  address: '5862 W Higgins Ave, Chicago, IL 60630, United States',
  website: 'wallsflowershop.com'
}
{
  shop: 'Fleur de Lis Florist',
  address: '715 N Franklin St, Chicago, IL 60654, United States',
  website: 'fleurdelischicago.com'
}
{
  shop: 'Secret Garden Flower Shop',
  address: '3910 W 71st St, Chicago, IL 60629, United States',
  website: 'secretgardenflowershopil.com'
}
{
  shop: 'Marguerite Gardens Florist',
  address: '2444 W Chicago Ave, Chicago, IL 60622, United States',
  website: 'flowerpowerchicgo.com'
}
{
  shop: "Leo's Metropolitan Florist",
  address: '407 E 71st St, Chicago, IL 60619, United States',
  website: 'doordash.com'
}
{
  shop: 'Bonnie Flower Shop Inc',
  address: '3400 W Irving Park Rd, Chicago, IL 60618, United States',
  website: 'doordash.com'
}
{
  shop: 'Flora Chicago',
  address: '2835 N Southport Ave, Chicago, IL 60657, United States',
  website: 'florachicago.com'
}
{
  shop: "Donna's Garden Flower Shop - Chicago, IL",
  address: '4155 W Peterson Ave, Chicago, IL 60646, United States',
  website: 'donnasgarden.com'
}
{
  shop: 'Bunches (a flower shop)',
  address: '1501 W Fullerton Ave, Chicago, IL 60614, United States',
  website: 'buncheschicago.com'
}
{
  shop: 'The Flower Shop of Chicago',
  address: '2246 W Taylor St, Chicago, IL 60612, United States',
  website: 'flowershopofchicago.com'
}
{
  shop: "Kelly's Flower Shop",
  address: '175 W Jackson Blvd, Chicago, IL 60604, United States',
  website: 'kellysflowershop.com'
}
{
  shop: 'Chicago Florist - Send Flowers',
  address: undefined,
  website: 'samedayflowerdeliverychicago.com'
}
{
  shop: 'Chicago Flower',
  address: '541 N Fairbanks Ct, Chicago, IL 60611, United States',
  website: 'chicagosmarcelflorist.com'
}
{
  shop: "Steve's Flower Market",
  address: '1039 W Grand Ave, Chicago, IL 60642, United States',
  website: 'pos.floranext.com'
}
{
  shop: 'Bloom Floral Shop | Same Day Flower Delivery Chicago, IL | Best Chicago Florist',    
  address: undefined,
  website: 'bloomfloralshop.com'
}
{
  shop: 'Ashland Addison Florist - Lakeview',
  address: '3118 N Lincoln Ave, Chicago, IL 60613, United States',
  website: 'ashaddflorist.com'
}
{
  shop: "Goldie's Flower Shop",
  address: '901 W Irving Park Rd, Chicago, IL 60613, United States',
  website: 'goldiesflowershop.com'
}
{
  shop: 'Tea Rose Flower Shop',
  address: '5203 N Kimball Ave, Chicago, IL 60625, United States',
  website: 'tearosechicago.com'
}
{
  shop: 'Designs by Ming: Florist & Flower Delivery - Chicago IL Florist, Wedding Flowers Arrangement, Custom Design Flower Shop',
  address: '230 E Ontario St #2401, Chicago, IL 60611, United States',
  website: 'yellowpages.com'
}
{
  shop: 'Crystal Flower Shop, Inc.',
  address: '2815 S Kedzie Ave, Chicago, IL 60623, United States',
  website: 'doordash.com'
}
{
  shop: "Wall's Flower Shop, Inc.",
  address: '5862 W Higgins Ave, Chicago, IL 60630, United States',
  website: 'wallsflowershop.com'
}
{
  shop: 'Fleur de Lis Florist',
  address: '715 N Franklin St, Chicago, IL 60654, United States',
  website: 'fleurdelischicago.com'
}
{
  shop: 'Secret Garden Flower Shop',
  address: '3910 W 71st St, Chicago, IL 60629, United States',
  website: 'secretgardenflowershopil.com'
}
{
  shop: 'Marguerite Gardens Florist',
  address: '2444 W Chicago Ave, Chicago, IL 60622, United States',
  website: 'flowerpowerchicgo.com'
}
{
  shop: "Leo's Metropolitan Florist",
  address: '407 E 71st St, Chicago, IL 60619, United States',
  website: 'doordash.com'
}
{
  shop: 'Bonnie Flower Shop Inc',
  address: '3400 W Irving Park Rd, Chicago, IL 60618, United States',
  website: 'doordash.com'
}
{
  shop: 'Flora Chicago',
  address: '2835 N Southport Ave, Chicago, IL 60657, United States',
  website: 'florachicago.com'
}
{
  shop: "Donna's Garden Flower Shop - Chicago, IL",
  address: '4155 W Peterson Ave, Chicago, IL 60646, United States',
  website: 'donnasgarden.com'
}
{
  shop: 'Bunches (a flower shop)',
  address: '1501 W Fullerton Ave, Chicago, IL 60614, United States',
  website: 'buncheschicago.com'
}
{
  shop: 'The Flower Shop of Chicago',
  address: '2246 W Taylor St, Chicago, IL 60612, United States',
  website: 'flowershopofchicago.com'
}
{
  shop: "Kelly's Flower Shop",
  address: '175 W Jackson Blvd, Chicago, IL 60604, United States',
  website: 'kellysflowershop.com'
}
{
  shop: 'Chicago Florist - Send Flowers',
  address: undefined,
  website: 'samedayflowerdeliverychicago.com'
}
{
  shop: 'Chicago Flower',
  address: '541 N Fairbanks Ct, Chicago, IL 60611, United States',
  website: 'chicagosmarcelflorist.com'
}
{
  shop: "Steve's Flower Market",
  address: '1039 W Grand Ave, Chicago, IL 60642, United States',
  website: 'pos.floranext.com'
}
{
  shop: 'Bloom Floral Shop | Same Day Flower Delivery Chicago, IL | Best Chicago Florist',    
  address: undefined,
  website: 'bloomfloralshop.com'
}
{
  shop: 'Ashland Addison Florist - Lakeview',
  address: '3118 N Lincoln Ave, Chicago, IL 60613, United States',
  website: 'ashaddflorist.com'
}
{
  shop: "Goldie's Flower Shop",
  address: '901 W Irving Park Rd, Chicago, IL 60613, United States',
  website: 'goldiesflowershop.com'
}
{
  shop: 'Tea Rose Flower Shop',
  address: '5203 N Kimball Ave, Chicago, IL 60625, United States',
  website: 'tearosechicago.com'
}

Additional Changes

  • Use more generic selectors for getting the name address and website
  • Keep getting results until data has been taken from all pages
  • Verify fields to make sure data is accurate
  • Move everything to do with the current puppeteer instance into main
  • Set address to undefined if the shop does not explicitly provide an address

I don't know how Google showed search results earlier, but now there is no website link for the search query flower shop chicago.

flower shop

But for example, for the search query car wash chicago, the website link is available.

car wash

Anyway you can get all shop's names, addresses, and website links (if it present) using my scraper example (check full parser in the online IDE):

const puppeteer = require("puppeteer-extra");
const StealthPlugin = require("puppeteer-extra-plugin-stealth");

puppeteer.use(StealthPlugin());

const requestParams = {
  baseURL: `http://google.com`,
  query: "flower shop chicago",                                                   // what we want to search
  hl: "en",                                                             // parameter defines the language to use for the Google maps search
};

async function scrollPage(page, scrollContainer) {
  let lastHeight = await page.evaluate(`document.querySelector("${scrollContainer}").scrollHeight`);

  while (true) {
    await page.evaluate(`document.querySelector("${scrollContainer}").scrollTo(0, document.querySelector("${scrollContainer}").scrollHeight)`);
    await page.waitForTimeout(5000);
    let newHeight = await page.evaluate(`document.querySelector("${scrollContainer}").scrollHeight`);
    if (newHeight === lastHeight) {
      break;
    }
    lastHeight = newHeight;
  }
}

async function fillDataFromPage(page) {
  const dataFromPage = await page.evaluate(() => {
    return Array.from(document.querySelectorAll(".bfdHYd")).map((el) => {
      return {
        shop: el.querySelector(".qBF1Pd")?.textContent.trim(),
        address: el.querySelector(".W4Efsd:last-child > .W4Efsd:nth-of-type(1) > span:last-child")?.textContent.replaceAll("·", "").trim(),
        website: el.querySelector("a[data-value]")?.getAttribute("href"),
      };
    });
  });
  return dataFromPage;
}

async function getLocalPlacesInfo() {
  const browser = await puppeteer.launch({
    headless: false,
    args: ["--no-sandbox", "--disable-setuid-sandbox"],
  });

  const page = await browser.newPage();

  const URL = `${requestParams.baseURL}/maps/search/${requestParams.query}?hl=${requestParams.hl}`;

  await page.setDefaultNavigationTimeout(60000);
  await page.goto(URL);

  await page.waitForNavigation();

  const scrollContainer = ".m6QErb[aria-label]";

  const localPlacesInfo = [];

  await page.waitForTimeout(2000);
  await scrollPage(page, scrollContainer);
  localPlacesInfo.push(...(await fillDataFromPage(page)));

  await browser.close();

  return localPlacesInfo;
}

getLocalPlacesInfo().then(console.log);

Output:

[
   {
      "shop":"Phillip's Flowers & Gifts",
      "address":"515 N La Grange Rd"
   },
   {
      "shop":"Ode à la Rose Chicago",
      "address":"2010 W Fulton St F108"
   },
   {
      "shop":"Bunches (a flower shop)",
      "address":"1501 W Fullerton Ave"
   },
   {
      "shop":"The Flower Shop of Chicago",
      "address":"2246 W Taylor St"
   },
   {
      "shop":"Steve's Flower Market",
      "address":"1039 W Grand Ave"
   },
   {
      "shop":"City Scents Floral & Home",
      "address":"209 E Ohio St"
   },
   ...and other results
]

Have a look at Web Scraping Google Maps Places with Nodejs blog post of mine if you want to know more about this topic.

Related