Como extrair resultados do Google Maps com Python

Locais, avaliações, reviews e contatos do Google Maps em JSON, por que a Places API oficial fica cara, e quanto custa de verdade uma busca no Maps.

Você quer os estabelecimentos que o Google Maps mostra para uma busca: nomes, avaliações, número de reviews, endereços, telefones, sites. Este post cobre as três formas de conseguir isso, com números reais do que cada uma custa, e um exemplo em Python que rodamos antes de publicar.

Por que não usar a Places API oficial?

O caminho oficial existe e é a resposta certa para alguns produtos, mas três características surpreendem as pessoas justamente no momento em que já é tarde demais para mudar de rota:

  1. Preço. A Text Search da Places API custa $32,00 por 1.000 requisições no tier Pro, verificado na página de preços do Google em 20 de outubro de 2026, com 5.000 chamadas gratuitas por mês. O preço unitário só começa a cair de forma significativa acima de 100.000 requisições mensais.
  2. Limites de resultado. Uma Text Search retorna no máximo 60 locais em três páginas. Para buscas do tipo “restaurantes em uma cidade” a interface do mapa conhece muito mais lugares do que a API vai te entregar.
  3. Licenciamento. Os dados do Places vêm com restrições sobre armazenamento e exibição. Se o seu caso de uso é montar uma lista de leads ou um dataset, os termos de uso são a restrição real, não o código.

A alternativa DIY, guiar um navegador headless pela interface do Maps, quebra pelos mesmos motivos que o scraping do Google Search quebra: bloqueios de IP, markup ofuscado que muda o tempo todo, e um painel de resultados com scroll para carregar que precisa de uma sessão de navegador real por busca. É um projeto de manutenção, não um script.

A versão que funciona

Mande a busca para uma API que já tem os navegadores e o parsing, e receba JSON de volta:

import requests

API_KEY = "faf_live_..."  # sua chave FastAF

resp = requests.get(
    "https://api.fastaf.co/v1/maps",
    params={
        "query": "best pizza in Naples Italy",
        "page": 0,
    },
    headers={"Authorization": f"Bearer {API_KEY}"},
    timeout=60,
)
resp.raise_for_status()

for place in resp.json()["search_results"]:
    print(f'{place["rating"]}  ({place["reviews"]:>6})  {place["title"]}')

Rodamos exatamente essa requisição enquanto escrevíamos este post (agosto de 2026). Ela retornou 20 locais por 5 créditos, o primeiro sendo L’Antica Pizzeria da Michele: avaliação 4,3, 54.724 reviews, faixa de preço, endereço, telefone, site, status de funcionamento e coordenadas GPS, tudo como campos JSON simples. Sem navegador, sem proxies, sem parsing.

Quais campos você recebe por local?

Cada item em search_results traz os dados do negócio que o painel do Maps mostra:

Campo Exemplo da nossa execução de teste
title L’Antica Pizzeria da Michele
rating / reviews 4.3 / 54724
type, types Pizza restaurant, Italian restaurant, …
price €1–10
address Via Cesare Sersale, 1, 80139 Napoli NA, Italy
phone +39 392 …
website o site do próprio negócio
open_state Closed · Opens 10:30 AM
gps_coordinates latitude / longitude
place_id, data_id identificadores estáveis para buscas futuras

Dois parâmetros que valem a pena conhecer além de query: ll fixa a busca em coordenadas e zoom (@40.85,14.26,14z), para você controlar a área do mapa em vez de deixar o texto da busca adivinhar, e page percorre as páginas de resultado, cerca de 20 locais por vez, além do limite de 60 da API oficial.

Quanto custa uma busca no Maps?

Uma busca no Google Maps na FastAF custa 5 créditos, o mesmo que uma requisição de Google Search. No pacote Scale ($99 por 300.000 créditos) são 60.000 buscas no Maps, ou $1,65 por 1.000. As mesmas 60.000 buscas na Text Search oficial da Places API a $32,00 por 1.000 dão $1.760 (55.000 cobradas, após as 5.000 chamadas gratuitas do mês), e retornam no máximo 60 locais cada uma.

O plano gratuito é de 500 créditos sem cartão, ou seja, 100 buscas no Maps, suficiente para verificar a cobertura de campos nas suas buscas reais antes de decidir qualquer coisa. Requisições falhas nunca são cobradas: os créditos são reservados quando a requisição começa e devolvidos se ela não voltar com um resultado.

Listas de leads: o ciclo prático

O uso mais comum desse endpoint é geração de leads locais. O ciclo é: busque uma categoria em uma cidade, filtre pelos campos, e você tem uma lista qualificada em minutos:

def places(query, pages=3):
    for page in range(pages):
        resp = requests.get(
            "https://api.fastaf.co/v1/maps",
            params={"query": query, "page": page},
            headers={"Authorization": f"Bearer {API_KEY}"},
            timeout=60,
        )
        resp.raise_for_status()
        yield from resp.json()["search_results"]

# Negócios com tração real mas sem site: prospects clássicos de agência web.
leads = [
    p for p in places("dentist in Austin TX")
    if p.get("reviews", 0) > 50 and not p.get("website")
]

Três páginas de uma busca são 15 créditos. Uma varredura de 50 cidades da mesma categoria, três páginas cada, são 750 créditos, cerca de $0,29 no pacote Growth: os e-mails de follow-up vão custar mais que os dados.