# Scrape Google Maps from a Python script with requests

Skip Selenium and Playwright. From Python, one requests.post to https://api.routergrowth.com/v1/run with capability local.places, a query and a City,State,Country location returns the Google Maps listings as JSON: name, category, address, website, rating, review count and place ID, ready for pandas.

HTML page: https://www.routergrowth.com/tools/google-maps/scraper-python
Part of: [Google Maps tools](https://www.routergrowth.com/tools/google-maps.md)

## The call

[`local.places`](https://www.routergrowth.com/catalog/local.places): Businesses on Google Maps for a query and location: name, category, address, phone, website, rating and review count.

Price on this network: $0.0035 per search. The exact quote is shown before every run.

## What a real run returned

Run on 2026-10-19: 20 records in 4.1 s for $0.0035. Personal fields are masked. Bike shops in Portland, Oregon: 20 listings came back, shops mixed with rentals and bike share stations that the script can filter on category.

| name | category | address | rating | reviews_count |
|---|---|---|---|---|
| River City Bicycles | Bicycle Shop | 706 SE Martin Luther King Jr Blvd, Portland, OR 97214 | 4.7 | 591 |
| Cyclepath PDX | Bicycle Shop | 2436 NE Martin Luther King Jr Blvd, Portland, OR 97212 | 4.9 | 216 |
| Splendid Cycles | Electric bicycle store | 407 SE Ivon St, Portland, OR 97202 | 4.9 | 110 |

## How to do it

1. **Store the key.** Put ROUTERGROWTH_API_KEY in the environment and send it as Authorization: Bearer.
2. **Send the search.** requests.post to /v1/run with capability local.places and input query, location and limit. Add routing.max_cost as a ceiling.
3. **Build a DataFrame.** pandas.DataFrame(response.json()['result']['places']) gives one row per listing with every field as a column.
4. **Loop the cities.** Run the same query for each city in a list and drop duplicates on place_id.

## Ask it like this

- Write a Python script that scrapes bike shops in Portland, Seattle and Vancouver from Google Maps and saves a CSV. (`local.places`)
- Extend it: for each shop with a website, look up a work email for the owner from the domain. (`local.places`, `contact.find`)

## Connect

MCP server: `https://api.routergrowth.com/mcp`

```bash
claude mcp add --transport http routergrowth https://api.routergrowth.com/mcp
```

```bash
npm install -g routergrowth && routergrowth setup
routergrowth run -c local.places -i '{"query": "bike shop", "location": "Portland,Oregon,United States", "limit": 10}'
```

```bash
curl -X POST https://api.routergrowth.com/v1/run \
  -H "Authorization: Bearer $ROUTERGROWTH_API_KEY" \
  -d '{"capability": "local.places", "input": {"query": "bike shop", "location": "Portland,Oregon,United States", "limit": 10}}'
```

## Worth knowing

- **No browser to drive.** There is no headless Chrome, no scrolling the results panel and no selectors that break.
- **Filter on category.** The search returns related places too: in this run bike share stations and a city office. Keep the categories you want.
- **Same fields every time.** The place object keeps the same keys whichever provider answered, so the script does not branch.

## Questions

### Do I need Selenium or a proxy?

No. The HTTP call returns the listings; the fetching runs on RouterGrowth's providers.

### Is there a Python package?

Not required. requests or httpx is enough, and the CLI covers shell scripts.

### How do I get more than one page?

Run more specific searches (neighbourhoods, nearby cities) and merge on place_id.

### Can I get the reviews from Python too?

Yes. Post reviews.search with the place_id from each listing.

## Related

- [Get Google Maps listings as JSON with one API call](https://www.routergrowth.com/tools/google-maps/scraper-api.md)
- [Scrape a business's Google Maps reviews without a browser](https://www.routergrowth.com/tools/google-maps/reviews-scraper.md)
- [Turn a Google Maps search into a lead list with websites and phones](https://www.routergrowth.com/tools/google-maps/lead-scraper.md)
- [Fetch the recent Google Maps reviews of any place through one API](https://www.routergrowth.com/tools/google-maps/api-reviews.md)
- [A Google Maps scraper your agent runs: every business for a search, as rows](https://www.routergrowth.com/tools/google-maps/scraper.md)
