HacksIA
automatizacion

Prospección automática sin bloqueos: Extrae leads de Google Maps con Scrapling y Claude

Guía completa para automatizar la extracción de datos de Google Maps y redes sociales usando Scrapling (37k estrellas en GitHub) y analizarlos con Claude para conseguir clientes sin coste de APIs de terceros.

Por Martin Reche ·

scrapingprospeccionclaudepythonautomatizacionlead-generation
MR

Martin Reche · Sistemas de conversión con IA para negocios

Hemos construido sistemas de conversión para más de 50 negocios: desde el anuncio en Meta Ads hasta el cliente cerrado, pasando por la cualificación del lead y la venta. Todo lo que ves en esta guía está funcionando en negocios reales.

Ver lo que hacemos
01

QUÉ ES Y POR QUÉ TE INTERESA

Consigue clientes sin pagar por bases de datos ni sufrir bloqueos

Scrapling es una librería Python de código abierto (37k estrellas en GitHub) que extrae datos de páginas complejas como Google Maps, Instagram o LinkedIn usando navegadores stealth indetectables. Al combinarlo con Claude, puedes pasar de 'buscar manualmente negocios' a tener una lista CSV limpia con nombres, teléfonos, webs y análisis de oportunidad en minutos — todo gratis y sin depender de APIs pagadas de Google o servicios de scraping caros.

Importante sobre el código: El material original no incluye el enlace directo al repositorio de Scrapling. Búscalo literalmente como "Scrapling GitHub" en Google antes de continuar. Es el repo de D4Vinci en GitHub.

El flujo completo

1. Prepara

Instala Python y Scraping con soporte stealth

2. Extrae

Scrapea Google Maps sin que te detecten ni bloqueen

3. Analiza

Pasa los datos a Claude para limpiar y priorizar leads

4. Exporta

Genera CSV/Excel listo para campañas de venta

02

VÍA RÁPIDA: QUE LO HAGA EL AGENTE

Instalación automática con Claude Code o Cursor

Si tienes Claude Code o Cursor instalados, no necesitas tocar la terminal ni configurar entornos manualmente. Copia este prompt y pégalo al agente. Él instalará todo, creará el script inicial y verificará que funcione.

Prompt para Claude Code/Cursor (copia y pega)
Instala Scrapling en mi equipo con todas las dependencias necesarias para scraping indetectable (incluyendo navegadores stealth y playwright si hace falta). Crea un entorno virtual Python aislado para este proyecto. Luego prepara un script Python funcional que:
1. Busque "restaurantes en [mi ciudad]" en Google Maps usando Scrapling con modo stealth activado
2. Extraiga nombre, dirección, teléfono, sitio web y puntuación de los primeros 20 resultados
3. Guarde los datos en un archivo CSV
4. Incluya manejo de errores básico

Configura todo tú solo, verifica que el script se ejecute sin errores, y dime exactamente qué comando debo usar para lanzarlo después. Ve contándome cada paso que haces.

El agente descargará Chrome/Chromium automáticamente si no lo tienes. Al finalizar, te dará un comando tipo `python scrape_leads.py` listo para usar.

03

REQUISITOS

Qué necesitas antes de empezar (instalación manual)

Si prefieres hacerlo tú mismo o el agente falló, estos son los componentes necesarios:

1

Python 3.9+

Lenguaje necesario para ejecutar Scrapling

python --version
2

pip (gestor de paquetes)

Viene con Python, pero verifica que esté actualizado

python -m pip install --upgrade pip
3

Cuenta de Anthropic (opcional)

Para analizar los datos extraídos con Claude API. Plan gratuito disponible con créditos de inicio.

console.anthropic.com

¿Te trabas en algún paso? Lo vemos en una llamada desde 49€, con acciones por escrito.

Ver sesiones
04

INSTALACIÓN MANUAL

Si prefieres hacerlo a mano (o algo falló)

1

Verifica e instala Python

Abre tu terminal (CMD en Windows, Terminal en Mac/Linux) y escribe `python --version`. Si no aparece 'Python 3.9' o superior, descárgalo desde python.org marcando 'Add Python to PATH' durante la instalación. Verificación: al escribir el comando deberías ver 'Python 3.11.x' o similar.

2

Crea una carpeta de trabajo y entorno virtual

Esto aisla las librerías del proyecto para no ensuciar tu sistema. Entra en la terminal y ejecuta:

Comandos para crear entorno (Windows)
mkdir prospeccion-claude
cd prospeccion-claude
python -m venv venv
venv\Scripts\activate
Comandos para crear entorno (Mac/Linux)
mkdir prospeccion-claude
cd prospeccion-claude
python3 -m venv venv
source venv/bin/activate
3

Instala Scrapling

Con el entorno activado (verás '(venv)' al inicio de la línea de comandos), instala la librería:

Instalación de Scrapling
pip install scrapling

Scrapling instalará automáticamente Playwright y otros componentes necesarios para simular un navegador real. Si te pide instalar navegadores de Playwright, acepta con `playwright install chromium`.

05

TU PRIMER SCRIPT DE EXTRACCIÓN

Extrae negocios de Google Maps sin bloqueos

Creamos un script que busca negocios en una zona específica. Scrapling usará técnicas stealth para evitar que Google Maps detecte que es un bot.

1

Crea el archivo de extracción

En tu carpeta 'prospeccion-claude', crea un archivo llamado `extraer_maps.py` y pega este código completo:

extraer_maps.py - Script completo listo para usar
import csv
import time
from scrapling import Fetcher

def extraer_negocios(termino_busqueda, ciudad, max_resultados=20):
    """
    Extrae negocios de Google Maps buscando el término en la ciudad especificada.
    Nota: Google Maps cambia su estructura frecuentemente, este es un ejemplo base.
    """
    # Configurar fetcher con modo stealth (indetectable)
    fetcher = Fetcher(stealth=True, headless=True)
    
    # Construir URL de búsqueda
    query = f"{termino_busqueda} en {ciudad}"
    url = f"https://www.google.com/maps/search/{query.replace(' ', '+')}"
    
    print(f"Accediendo a: {url}")
    
    try:
        # Obtener la página
        response = fetcher.get(url)
        
        # Esperar a que cargue el contenido dinámico
        time.sleep(5)
        
        # Selector CSS para las tarjetas de negocios (puede variar, esto es un ejemplo)
        # Google Maps usa clases dinámicas, por eso usamos selectores de atributos
        negocios = response.css('[data-result-index]')
        
        resultados = []
        
        for i, negocio in enumerate(negocios[:max_resultados]):
            try:
                # Extraer datos usando selectores CSS
                nombre = negocio.css('h3::text').get() or negocio.css('[role="heading"]::text').get()
                
                # Buscar teléfono (patrón típico en Maps)
                texto_completo = negocio.text
                import re
                telefono = re.search(r'(\+?\d[\d\s-]{8,}\d)', texto_completo)
                telefono = telefono.group(0) if telefono else "No encontrado"
                
                # Buscar web (empieza con http)
                web = negocio.css('a[href^="http"]::attr(href)').get()
                if web and 'google.com' in web:
                    web = "No encontrada"
                
                direccion = negocio.css('[data-result-index] > div > div::text').get() or "Ver en Maps"
                
                if nombre:
                    resultados.append({
                        'nombre': nombre.strip(),
                        'direccion': direccion.strip() if direccion else "N/A",
                        'telefono': telefono,
                        'web': web if web else "No tiene",
                        'fuente': url
                    })
                    print(f"✓ Extraído: {nombre}")
                    
            except Exception as e:
                print(f"Error en negocio {i}: {e}")
                continue
        
        return resultados
        
    except Exception as e:
        print(f"Error general: {e}")
        return []

def guardar_csv(datos, filename="leads_maps.csv"):
    """Guarda los resultados en un archivo CSV."""
    if not datos:
        print("No hay datos para guardar")
        return
        
    with open(filename, 'w', newline='', encoding='utf-8') as f:
        writer = csv.DictWriter(f, fieldnames=['nombre', 'direccion', 'telefono', 'web', 'fuente'])
        writer.writeheader()
        writer.writerows(datos)
    
    print(f"\n✅ {len(datos)} negocios guardados en {filename}")

# Ejemplo de uso
if __name__ == "__main__":
    print("🔍 Iniciando extracción de leads...")
    
    # Personaliza aquí tu búsqueda
    TIPO_NEGOCIO = "restaurantes"  # Cambia por: dentistas, clínicas, abogados...
    CIUDAD = "Madrid"              # Tu ciudad objetivo
    CANTIDAD = 10                  # Número de resultados
    
    leads = extraer_negocios(TIPO_NEGOCIO, CIUDAD, CANTIDAD)
    guardar_csv(leads)
    
    print("\n📋 Primeros resultados:")
    for lead in leads[:3]:
        print(f"- {lead['nombre']} | {lead['telefono']}")
2

Ejecuta el script y verifica

En la terminal (con el entorno virtual activo), ejecuta:

Ejecutar extracción
python extraer_maps.py

La primera ejecución puede tardar 1-2 minutos mientras descarga Chromium. Verás mensajes de 'Downloading Chromium' — es normal. Al finalizar, deberías ver '✅ X negocios guardados en leads_maps.csv'.

06

ANALIZA CON CLAUDE

Limpia y prioriza tus leads automáticamente

Ahora que tienes un CSV con datos 'sucios' (pueden tener duplicados, teléfonos mal formateados o negocios irrelevantes), usaremos la API de Claude para limpiarlos y añadir análisis de oportunidad. Esta pieza es solo la entrada del embudo: aquí tienes el sistema de captación completo, explicado.

1

Obtén tu API Key de Anthropic

Ve a console.anthropic.com → Settings → API Keys → Create Key. Copia la clave (empieza con sk-ant-...). No la compartas.

2

Instala el SDK de Anthropic

En la misma terminal con entorno virtual activo:

Instalar SDK de Anthropic
pip install anthropic
3

Crea el script de análisis

Crea un archivo nuevo `analizar_con_claude.py` y pega este código (reemplaza TU_API_KEY con tu clave real):

analizar_con_claude.py - Procesamiento con IA
import os
import csv
import json
from anthropic import Anthropic

# Configura tu API Key aquí
client = Anthropic(api_key="TU_API_KEY")  # <--- REEMPLAZA ESTO

def analizar_lead(lead_info):
    """Envía un lead a Claude para análisis de oportunidad."""
    
    prompt = f"""Analiza este negocio extraído de Google Maps y determina si es un buen prospecto para servicios de marketing digital:
    
    Nombre: {lead_info['nombre']}
    Dirección: {lead_info['direccion']}
    Web actual: {lead_info['web']}
    Teléfono: {lead_info['telefono']}
    
    Responde ÚNICAMENTE en formato JSON con esta estructura:
    {{
        "puntuacion_oportunidad": 1-10,
        "tiene_web": true/false,
        "observaciones": "breve análisis",
        "recomendacion_contacto": "mensaje corto sugerido para llamada/email"
    }}
    """
    
    try:
        response = client.messages.create(
            model="claude-3-haiku-20240307",  # Modelo rápido y económico
            max_tokens=300,
            messages=[{"role": "user", "content": prompt}]
        )
        
        # Extraer JSON de la respuesta
        respuesta_texto = response.content[0].text
        return json.loads(respuesta_texto)
    except Exception as e:
        print(f"Error analizando {lead_info['nombre']}: {e}")
        return {
            "puntuacion_oportunidad": 0,
            "tiene_web": lead_info['web'] != "No tiene",
            "observaciones": "Error en análisis",
            "recomendacion_contacto": "Llamar directamente"
        }

def procesar_csv(input_file="leads_maps.csv", output_file="leads_analizados.csv"):
    """Procesa todo el CSV añadiendo columnas de análisis de Claude."""
    
    with open(input_file, 'r', encoding='utf-8') as f:
        leads = list(csv.DictReader(f))
    
    print(f"Analizando {len(leads)} leads con Claude...")
    
    resultados = []
    for i, lead in enumerate(leads):
        print(f"Procesando {i+1}/{len(leads)}: {lead['nombre']}")
        
        analisis = analizar_lead(lead)
        
        # Combinar datos originales + análisis
        lead_completo = {**lead, **analisis}
        resultados.append(lead_completo)
        
        # Pequeña pausa para no saturar la API
        import time
        time.sleep(0.5)
    
    # Guardar resultado
    with open(output_file, 'w', newline='', encoding='utf-8') as f:
        if resultados:
            writer = csv.DictWriter(f, fieldnames=resultados[0].keys())
            writer.writeheader()
            writer.writerows(resultados)
    
    print(f"\n✅ Análisis completo. Guardado en {output_file}")
    print(f"⭐ Mejores oportunidades:")
    
    # Mostrar top 3
    top_leads = sorted(resultados, key=lambda x: x.get('puntuacion_oportunidad', 0), reverse=True)[:3]
    for lead in top_leads:
        print(f"   {lead['nombre']} (Score: {lead['puntuacion_oportunidad']}/10)")

if __name__ == "__main__":
    procesar_csv()
4

Ejecuta el análisis

Asegúrate de haber reemplazado 'TU_API_KEY' con tu clave real en el código anterior, luego ejecuta:

Analizar leads con Claude
python analizar_con_claude.py

El coste es mínimo: analizar 20 leads con Claude 3 Haiku cuesta aproximadamente $0.01-$0.02. Usa el modelo Haiku (el más barato) para este tipo de tareas estructuradas.

07

ERRORES COMUNES Y SOLUCIONES

Si algo falla, aquí está el arreglo

Google Maps me bloquea o sale CAPTCHA

Scrapling debe ejecutarse con `stealth=True` (ya está en el código). Si sigue fallando, añade `headless=False` para ver el navegador y reduce la velocidad añadiendo `time.sleep(10)` entre peticiones. También puedes usar una VPN para cambiar tu IP.

No extrae datos o el CSV está vacío

Google Maps cambia sus selectores CSS frecuentemente. Abre el navegador manualmente, inspecciona la página (F12) y busca las clases actuales de las tarjetas de negocios. Actualiza los selectores en el script según lo que veas.

Error 'Chromium not found'

Ejecuta manualmente: `playwright install chromium`. Si sigue fallando en Linux, necesitas instalar dependencias del sistema: `playwright install-deps chromium`.

Claude devuelve 'rate limit' o errores de API

Has alcanzado el límite del plan gratuito. Espera unos minutos o verifica tu saldo en console.anthropic.com. Para extracciones masivas, procesa los leads en lotes de 10 con pausas de 1 minuto entre lotes.

08

QUÉ PUEDES HACER AHORA CON ESTO

4 formas de monetizar esta herramienta hoy mismo

🍽️

Agencia de marketing para restaurantes

Extrae todos los restaurantes de tu ciudad sin web o con mala puntuación. Usa el análisis de Claude para priorizar los que más necesitan ayuda y envíales un email con una propuesta de rediseño web o gestión de redes.

🦷

Software para clínicas dentales

Scrapea dentistas en un radio de 50km. Filtra por 'no tiene web' y usa el script de Claude para generar un mensaje personalizado tipo: 'Ví que la Clínica X no aparece en Google, ¿sabías que el 70% de pacientes busca online?'.

🏠

Agencia inmobiliaria (cold calling)

Extrae inmobiliarias antiguas o particulares de Google Maps. Cruza los teléfonos con el CSV y usa el análisis de Claude para clasificar por 'probabilidad de vender pronto' según la antigüedad de la ficha.

📊

Venta de datos B2B en nichos

Crea listas ultra-específicas (ej: 'talleres mecánicos en Barcelona con web antigua') y véndelas en marketplaces como Fiverr o a agencias de email marketing. El valor está en que los datos vienen limpios y puntuados por IA.

Resultado esperado: Al finalizar tendrás un archivo `leads_analizados.csv` con columnas: nombre, dirección, teléfono, web, puntuacion_oportunidad (1-10), observaciones y recomendacion_contacto. Puedes importar esto directamente a herramientas como Pipedrive, HubSpot o Excel para empezar tu campaña de ventas.

Si quieres ir más rápido

Sistemas de conversión que funcionan, no demos de IA

Soy Martin Reche. Hemos construido sistemas de conversión para más de 50 negocios: desde el anuncio en Meta Ads hasta el cliente cerrado, pasando por la cualificación del lead y la venta. Todo lo que ves en esta guía está funcionando en negocios reales. Si quieres aplicarlo a tu caso, lo vemos en una llamada: te digo qué montar, con qué y en qué orden, y te lo dejo por escrito. Y si prefieres que lo montemos por ti, eso es NovaChat.

Sistemas de conversión

Del anuncio al cliente cerrado: captación, seguimiento y venta en un solo flujo que funciona.

Cualificación de leads

Cada contacto se filtra, se atiende y se lleva a la venta sin que nadie lo persiga a mano.

Agentes de IA que atienden y venden

Voz, WhatsApp, web e Instagram: responden, cualifican y cierran citas 24/7.

Consultoría 1:1

Desde 49 €: te digo qué montar, con qué y en qué orden, por escrito.

Consultoría 1:1 · Google Meet

Una llamada y sales sabiendo qué hacer y qué no

Me cuentas tu caso en un formulario de dos minutos, pagas, eliges hora. Garantía simple: si en los primeros 10 minutos veo que no te puedo ayudar, te devuelvo el importe. Pack de 3 Revisiones por 249 € si quieres que te acompañe 90 días.

49€

30 min · Diagnóstico 1:1

99€

60 min · Revisión 1:1

149€

90 min · Estrategia 1:1

Ver opciones y reservar

¿Prefieres que lo montemos por ti?

En NovaChat IA construimos agentes de voz, chatbots y automatizaciones para pymes. Tú lo usas, nosotros lo mantenemos.

novachatia.com