Cómo extraer resultados de Google Maps con Python

Lugares, valoraciones, reseñas y contacto de Google Maps en JSON, por qué la Places API sale cara, y cuánto cuesta una búsqueda en Maps. Agosto 2026.

Quieres los negocios que Google Maps muestra para una consulta: nombres, valoraciones, número de reseñas, direcciones, teléfonos, webs. Este post cubre las tres formas de conseguirlos, con cifras reales de lo que cuesta cada una, y un ejemplo en Python que ejecutamos antes de publicar.

¿Por qué no la Places API oficial?

La vía oficial existe y es la respuesta correcta para algunos productos, pero tres características sorprenden a la gente justo cuando ya es tarde para cambiar de rumbo:

  1. Precio. Text Search en la Places API cuesta $32,00 por cada 1.000 solicitudes en el nivel Pro, comprobado en la página de precios de Google el 20 de octubre de 2026, con 5.000 llamadas gratis al mes. El precio unitario solo empieza a bajar de forma notable a partir de las 100.000 solicitudes mensuales.
  2. Límites de resultados. Un Text Search devuelve como máximo 60 lugares en tres páginas. Para consultas tipo “restaurantes en una ciudad”, la interfaz del mapa conoce muchos más de los que la API te dará.
  3. Licencias. Los datos de Places vienen con restricciones sobre cómo guardarlos y mostrarlos. Si tu caso de uso es construir una lista de leads o un dataset, los términos son la restricción real, no el código.

La alternativa DIY, manejar un navegador headless sobre la interfaz de Maps, se rompe por los mismos motivos que se rompe el scraping de Google Search: bloqueos por IP, markup ofuscado que rota, y un panel de resultados de scroll-to-load que necesita una sesión de navegador real por consulta. Es un proyecto de mantenimiento, no un script.

La versión que funciona

Envía la consulta a una API que ya se encarga de los navegadores y del parsing, y recibe JSON de vuelta:

import requests

API_KEY = "faf_live_..."  # tu clave de 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"]}')

Ejecutamos exactamente esta solicitud mientras escribíamos este post (agosto de 2026). Devolvió 20 lugares por 5 créditos, siendo el primero L’Antica Pizzeria da Michele: valoración 4,3, 54.724 reseñas, rango de precio, dirección, teléfono, web, estado de apertura y coordenadas GPS, todo como campos JSON planos. Sin navegador, sin proxies, sin parsing.

¿Qué campos obtienes por lugar?

Cada entrada en search_results trae los datos del negocio que muestra el panel de Maps:

Campo Ejemplo de nuestra prueba
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 la web propia del negocio
open_state Closed · Opens 10:30 AM
gps_coordinates latitud / longitud
place_id, data_id identificadores estables para consultas de seguimiento

Dos parámetros que vale la pena conocer además de query: ll fija la búsqueda a unas coordenadas y un zoom (@40.85,14.26,14z) para que controles el viewport del mapa en lugar de dejar que lo adivine el texto de la consulta, y page avanza por las páginas de resultados, unos 20 lugares cada vez, superando el límite de 60 lugares de la API oficial.

¿Cuánto cuesta una búsqueda en Maps?

Una búsqueda en Google Maps en FastAF cuesta 5 créditos, lo mismo que una solicitud de Google Search. En el pack Scale ($99 por 300.000 créditos) son 60.000 búsquedas en Maps, o $1,65 por cada 1.000. Esas mismas 60.000 búsquedas en la Text Search de la Places API oficial, a $32,00 por cada 1.000, suman $1.760 (55.000 de pago, tras las 5.000 llamadas gratis del mes), y devuelven como máximo 60 lugares cada una.

El plan gratuito es de 500 créditos sin tarjeta, es decir, 100 búsquedas en Maps, suficiente para comprobar la cobertura de campos en tus consultas reales antes de decidir nada. Las solicitudes fallidas nunca se cobran: los créditos se reservan al iniciar una solicitud y se devuelven si no llega ningún resultado.

Listas de leads: el bucle práctico

El uso más común de este endpoint es la generación de leads locales. El bucle es: busca una categoría en una ciudad, filtra por los campos, y tienes una lista cualificada en 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"]

# Negocios con tracción real pero sin web: prospectos clásicos para una agencia web.
leads = [
    p for p in places("dentist in Austin TX")
    if p.get("reviews", 0) > 50 and not p.get("website")
]

Tres páginas de una sola consulta son 15 créditos. Un barrido de 50 ciudades de la misma categoría a tres páginas cada una son 750 créditos, unos $0,29 en el pack Growth: los correos de seguimiento te costarán más que los datos.