El scraping de Google Maps viola directamente los términos y conduce a prohibiciones. Las API SERP devuelven resultados de paquetes locales como JSON estructurado a través de canales compatibles. Este tutorial extrae clientes potenciales de empresas locales mediante la ejecución de búsquedas específicas de ubicación a través de Scavio a $0,005 por búsqueda, capturando nombres de empresas, direcciones, teléfonos, calificaciones y categorías.
Requisitos previos
- Python 3.8+
- solicita biblioteca
- Una clave API de Scavio de scavio.dev
- Ubicaciones y categorías de destino
Guia paso a paso
Paso 1: Construir matriz de búsqueda
Combina categorías con ubicaciones.
import os, requests, csv
API_KEY = os.environ['SCAVIO_API_KEY']
H = {'x-api-key': API_KEY, 'Content-Type': 'application/json'}
CATEGORIES = ['plumber', 'dentist', 'restaurant']
LOCATIONS = ['Austin TX', 'Denver CO']
queries = [{'q': f'{cat} near {loc}', 'cat': cat, 'loc': loc}
for cat in CATEGORIES for loc in LOCATIONS]
print(f'{len(queries)} queries, est. ${len(queries) * 0.005:.3f}')Paso 2: Extraer datos comerciales locales
Analizar los resultados del paquete local desde SERP.
def extract(query_info):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=H, json={'query': query_info['q'], 'country_code': 'us'}).json()
businesses = []
for p in data.get('local_results', []):
businesses.append({'name': p.get('title', ''), 'address': p.get('address', ''),
'phone': p.get('phone', ''), 'rating': p.get('rating', ''),
'category': query_info['cat'], 'location': query_info['loc']})
return businessesPaso 3: Deduplicar y recopilar
Procese todas las consultas y elimine duplicados.
def collect_all(queries):
all_biz = []
for i, q in enumerate(queries):
biz = extract(q)
all_biz.extend(biz)
print(f' [{i+1}/{len(queries)}] "{q["q"]}": {len(biz)} businesses')
seen = set()
unique = []
for b in all_biz:
key = f"{b['name'].lower()}:{b['location'].lower()}"
if key not in seen: seen.add(key); unique.append(b)
print(f'Total: {len(unique)} unique businesses')
return unique
businesses = collect_all(queries)Paso 4: Exportar a CSV
Escriba clientes potenciales para importar CRM.
def export(businesses, output='leads.csv'):
with open(output, 'w', newline='') as f:
w = csv.DictWriter(f, fieldnames=['name', 'category', 'location', 'address', 'phone', 'rating'])
w.writeheader()
w.writerows(businesses)
print(f'Exported {len(businesses)} leads to {output}')
export(businesses)Ejemplo en Python
import os, requests
API_KEY = os.environ['SCAVIO_API_KEY']
H = {'x-api-key': API_KEY, 'Content-Type': 'application/json'}
def leads(category, location):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=H, json={'query': f'{category} near {location}', 'country_code': 'us'}).json()
for p in data.get('local_results', [])[:3]:
print(f' {p.get("title", "")} | {p.get("phone", "N/A")} | {p.get("rating", "")} stars')
leads('plumber', 'Austin TX')Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
const H = { 'x-api-key': API_KEY, 'Content-Type': 'application/json' };
async function leads(cat, loc) {
const data = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H,
body: JSON.stringify({ query: `${cat} near ${loc}`, country_code: 'us' })
}).then(r => r.json());
(data.local_results || []).slice(0, 3).forEach(p =>
console.log(` ${p.title} | ${p.phone || 'N/A'} | ${p.rating} stars`));
}
leads('plumber', 'Austin TX').catch(console.error);Salida esperada
[1/6] "plumber near Austin TX": 8 businesses
[2/6] "plumber near Denver CO": 6 businesses
...
Total: 38 unique businesses
Exported 38 leads to leads.csv