Scraper Google Maps con Python y Selenium: Guía completa
¿Necesitas extraer las coordenadas de 500 restaurantes, los correos electrónicos de fontaneros locales o las opiniones de clientes de una región? Google Maps contiene estos datos, pero descargarlos manualmente lleva horas.
Aquí es donde entran Python y Selenium. Estas dos herramientas permiten automatizar la extracción de datos desde Google Maps, pero requieren tiempo, habilidades de programación y presentan importantes desafíos técnicos.
Este artículo te muestra cómo funcionan Python y Selenium para el scraping, los pasos concretos para comenzar, las trampas a evitar y, sobre todo: cuándo un enfoque manual no es la solución adecuada.
¿Por qué Python y Selenium para Google Maps?
Google Maps no es una simple página HTML estática. Los resultados se cargan dinámicamente: escribes una búsqueda, las fichas aparecen progresivamente, haces scroll y se cargan más resultados. Es JavaScript en acción.
Tres herramientas pueden extraer estos datos:
1. BeautifulSoup o Requests Estas bibliotecas de Python recuperan el código HTML bruto de una página. Problema: no pueden ejecutar JavaScript. En Google Maps, obtienes una página vacía.
2. Selenium Selenium lanza un navegador real (Chrome, Firefox) y simula clics, desplazamientos e interacciones humanas. El JavaScript se ejecuta. Puedes esperar a que se carguen los resultados y luego extraerlos. Es lento, pero funciona.
3. Puppeteer o Playwright Herramientas similares a Selenium, más rápidas, pero menos documentadas para principiantes.
¿Por qué elegir Python + Selenium? - Python es fácil de aprender y muy documentado - Selenium funciona con todos los navegadores - Combinados, manejan páginas dinámicas sin API - Tienes control total sobre lo que extraes
Limitación clave: es lento. Extraer 1,000 resultados puede llevar de 2 a 3 horas. Y corres el riesgo de bloqueos de IP, CAPTCHAs o prohibiciones temporales.
Requisitos técnicos: lo que hay que instalar
Antes de escribir una sola línea de código, instala estas herramientas.
1. Python (versión 3.8 o más reciente)
Descárgalo desde python.org. Durante la instalación, marca "Add Python to PATH" — es crucial para usar Python en la línea de comandos.
Verifica la instalación:
python --version
Deberías ver Python 3.x.x.
2. Selenium
Abre tu terminal o línea de comandos y escribe:
pip install selenium
Pip (Python Package Manager) descarga e instala Selenium automáticamente.
3. WebDriver para tu navegador
Selenium no puede controlar un navegador sin un controlador (WebDriver). La opción más común es Chrome.
Para Chrome:
- Descarga ChromeDriver (debe coincidir con tu versión de Chrome)
- Descomprime el archivo
- Anota la ruta completa del archivo chromedriver (ej: /Users/nombre/Downloads/chromedriver)
Alternativa sencilla: instala webdriver-manager para evitar gestionar las versiones manualmente:
pip install webdriver-manager
4. Bibliotecas adicionales
Para procesar y exportar los datos:
pip install pandas requests beautifulsoup4
- Pandas: organiza los datos en tablas (DataFrames)
- Requests: realiza solicitudes HTTP (opcional aquí, pero útil)
- BeautifulSoup: analiza el HTML (opcional)
Verifica que todo funcione:
python -c "import selenium; print(selenium.__version__)"
Deberías ver un número de versión (ej: 4.15.2).
Anatomía de un script Selenium para Google Maps
Aquí está la estructura general de un script de scraping de Google Maps:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
import time
import pandas as pd
# 1. Lanzar el navegador
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
# 2. Acceder a Google Maps
driver.get("https://www.google.com/maps")
# 3. Buscar un término
search_box = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "searchboxinput"))
)
search_box.send_keys("Restaurantes París")
search_box.send_keys(Keys.ENTER)
# 4. Esperar los resultados
time.sleep(3)
# 5. Extraer los datos
results = []
result_elements = driver.find_elements(By.CLASS_NAME, "Nv2PK")
for element in result_elements:
try:
name = element.find_element(By.CLASS_NAME, "NrjWb").text
results.append({"name": name})
except:
pass
# 6. Exportar a CSV
df = pd.DataFrame(results)
df.to_csv("restaurantes.csv", index=False)
# 7. Cerrar el navegador
driver.quit()
Desglosamos cada paso.
Paso 1: Lanzar el navegador
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
webdriver-manager descarga automáticamente la versión correcta de ChromeDriver. No tienes que hacer nada manualmente.
Alternativa sin webdriver-manager (si descargaste ChromeDriver manualmente):
driver = webdriver.Chrome("/ruta/a/chromedriver")
Paso 2: Acceder a Google Maps y buscar
driver.get("https://www.google.com/maps")
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Esperar a que la barra de búsqueda sea visible
search_box = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "searchboxinput"))
)
# Escribir la búsqueda
search_box.send_keys("Fontaneros Lyon")
# Presionar Enter
from selenium.webdriver.common.keys import Keys
search_box.send_keys(Keys.ENTER)
# Esperar a que se carguen los resultados
time.sleep(3)
¿Por qué WebDriverWait?
Google Maps carga los elementos dinámicamente. Si intentas encontrar la barra de búsqueda antes de que exista, el script falla. WebDriverWait espera hasta 10 segundos a que el elemento aparezca.
Paso 3: Extraer los nombres y direcciones
# Encontrar todos los resultados (cada resultado es una ficha de negocio)
result_elements = driver.find_elements(By.CLASS_NAME, "Nv2PK")
results = []
for element in result_elements:
try:
# Nombre del negocio
name = element.find_element(By.CLASS_NAME, "NrjWb").text
# Dirección
address = element.find_element(By.CLASS_NAME, "Xs85Hc").text
# Calificación (opcional)
try:
rating = element.find_element(By.CLASS_NAME, "MW4etd").text
except:
rating = "N/A"
results.append({
"name": name,
"address": address,
"rating": rating
})
except Exception as e:
print(f"Error: {e}")
continue
print(f"Extraído {len(results)} resultados")
Selectores CSS: By.CLASS_NAME encuentra elementos por su clase CSS. Los nombres de clase (Nv2PK, NrjWb) cambian regularmente en Google. Si el script no funciona, abre el inspector (F12) y encuentra las clases correctas.
Paso 4: Manejar la paginación
Google Maps muestra aproximadamente 20 resultados por página. Para obtener más, debes desplazarte hacia abajo en la lista.
# Encontrar el contenedor de resultados
results_container = driver.find_element(By.CLASS_NAME, "m6QErb")
# Desplazarse 5 veces (cada desplazamiento carga ~20 resultados adicionales)
for _ in range(5):
driver.execute_script(
"arguments[0].scrollTop = arguments[0].scrollHeight",
results_container
)
time.sleep(2) # Esperar a que se carguen los resultados
# Extraer TODOS los resultados (ahora que has desplazado)
all_results = driver.find_elements(By.CLASS_NAME, "Nv2PK")
Atención: desplazarse 5 veces = ~100 resultados. Desplazarse 20 veces = 400+ resultados y 2-3 minutos. Es lento.
Paso 5: Extraer las coordenadas (latitud/longitud)
Google Maps almacena las coordenadas GPS en la URL. Puedes recuperarlas haciendo clic en una ficha.
results = []
for element in result_elements:
try:
name = element.find_element(By.CLASS_NAME, "NrjWb").text
# Hacer clic en el resultado para abrir la ficha detallada
element.click()
time.sleep(1)
# Recuperar la URL (contiene las coordenadas)
current_url = driver.current_url
# Formato: https://www.google.com/maps/place/.../@48.8566,2.3522,...
results.append({
"name": name,
"url": current_url
})
except Exception as e:
print(f"Error: {e}")
Las coordenadas están en la URL después de /@ (latitud, longitud).
Paso 6: Exportar los datos a CSV
import pandas as pd
# Convertir a DataFrame
df = pd.DataFrame(results)
# Exportar a CSV
df.to_csv("resultados_google_maps.csv", index=False, encoding="utf-8")
print(f"✓ {len(results)} resultados exportados a resultados_google_maps.csv")
Abre el archivo CSV en Excel o Google Sheets.
Paso 7: Cerrar el navegador
driver.quit()
Siempre cierra el navegador para liberar memoria.
Script completo: ejemplo concreto
Aquí tienes un script funcional para extraer restaurantes de una ciudad:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
import time
import pandas as pd
# Lanzar el navegador
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
try:
# Acceder a Google Maps
driver.get("https://www.google.com/maps")
# Buscar restaurantes
search_box = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "searchboxinput"))
)
search_box.send_keys("Restaurantes Marsella")
search_box.send_keys(Keys.ENTER)
time.sleep(3)
# Desplazarse para cargar más resultados
results_container = driver.find_element(By.CLASS_NAME, "m6QErb")
for _ in range(3):
driver.execute_script(
"arguments[0].scrollTop = arguments[0].scrollHeight",
results_container
)
time.sleep(2)
# Extraer los datos
results = []
result_elements = driver.find_elements(By.CLASS_NAME, "Nv2PK")
for element in result_elements[:50]: # Limitar a 50 para probar
try:
name = element.find_element(By.CLASS_NAME, "NrjWb").text
address = element.find_element(By.CLASS_NAME, "Xs85Hc").text
results.append({
"name": name,
"address": address
})
except:
pass
# Exportar
df = pd.DataFrame(results)
df.to_csv("restaurantes_marsella.csv", index=False, encoding="utf-8")
print(f"✓ {len(results)} restaurantes extraídos")
finally:
driver.quit()
Ejecuta:
python scraper.py
Se abre un navegador Chrome, realiza la búsqueda y exporta los resultados.
Los verdaderos desafíos del scraping de Google Maps
El script funciona en tu computadora. Pero a gran escala, enfrentas problemas.
1. Bloqueo por IP
Después de 50-100 solicitudes desde la misma IP, Google te bloquea temporalmente. Ves un CAPTCHA o una página de error.
Soluciones:
- Agregar retrasos aleatorios entre las solicitudes (time.sleep(random.randint(2, 5)))
- Usar proxies o una VPN
- Distribuir las solicitudes en varios días
2. CAPTCHA
Google puede mostrar un CAPTCHA para verificar que eres humano. Selenium no puede resolverlo automáticamente (sin herramientas externas de pago).
Soluciones: - Aceptar que algunas solicitudes fallen - Usar servicios de resolución de CAPTCHA (caro y lento) - Scraping con moderación
3. Selectores CSS que cambian
Google modifica regularmente sus clases CSS. Nv2PK de hoy puede convertirse en Abc123 mañana. Tu script se rompe.
Soluciones: - Usar selectores XPath más estables (más complejos) - Verificar y actualizar el script cada mes - Monitorear errores
4. Rendimiento
Extraer 1,000 resultados = 50+ minutos. Extraer 10,000 = 8+ horas. Es muy lento en comparación con las herramientas automatizadas.
5. Datos incompletos
Obtienes los nombres y direcciones. Pero los correos electrónicos, los números de teléfono, las opiniones, las tecnologías utilizadas? Debes hacer clic en cada ficha, esperar a que se cargue y luego extraer. Es aún más lento.
6. Conformidad legal
Los Términos de Servicio de Google Maps prohíben el scraping automatizado. No corres el riesgo de demandas, pero tu cuenta puede ser prohibida o tu IP bloqueada permanentemente.
Cuando Python + Selenium NO es la buena solución
Selenium es poderoso, pero no es la herramienta ideal para:
Extraer > 500 resultados regularmente Demasiado lento, demasiados riesgos de bloqueo.
Obtener correos electrónicos, teléfonos, opiniones, tecnologías Selenium puede hacerlo, pero tendrías que hacer clic en cada ficha. 1,000 fichas = 2-3 días de scraping.
Datos actualizados mensualmente Tendrás que reiniciar el script cada mes. Riesgo de bloqueo en cada ejecución.
Necesidad de datos enriquecidos Los datos en bruto de Google Maps carecen de información comercial.
Sin habilidades de codificación Python + Selenium requieren depuración, mantenimiento, actualizaciones.
IBLead: la alternativa sin código
Si necesitas extraer rápidamente datos de Google Maps sin scraping, hay otro enfoque: usar una base de datos preindexada.
IBLead es una base de datos de más de 5 millones de negocios de Google Maps (Francia, Bélgica, Suiza, Canadá, Estados Unidos y más de 10 países). Los datos se actualizan mensualmente — no necesitas hacer scraping.
Buscas por ciudad, región, categoría y luego exportas a CSV con: - Nombres, direcciones, teléfonos - Correos electrónicos (enriquecidos desde el sitio web) - Opiniones de Google (texto completo, calificaciones, fechas, autores) — exclusivo - Tecnologías detectadas (WordPress, Shopify, HubSpot, etc.) — exclusivo - Redes sociales, horarios, coordenadas GPS
Comparación: Python + Selenium vs IBLead
¿Listo para empezar?
Accede a todas las empresas de Google Maps, enriquecidas con emails y datos legales.
Prueba IBLead gratisArtículos relacionados
10 Consejos Comprobados para Conseguir que los Clientes Dejen Más Reseñas en Google Maps
Descubre 10 estrategias prácticas para aumentar las reseñas en Google Maps.
7 Errores de Cold Email a Evitar: Ejemplos y Plantillas
Evita estos 7 errores de cold email para mejorar tus tasas de respuesta. Ejemplos reales, plantillas AIDA y soluciones comprobadas.
Datos de Google Maps para ABM: La Guía Estratégica Completa
Descubre cómo los datos de marketing basado en cuentas de Google Maps generan un 208% más de ingresos.