La creación de listas de clientes potenciales a partir de Google Maps es un flujo de trabajo fundamental para las agencias locales, los buscadores de franquicias y los equipos de ventas B2B. El proceso manual (buscar una categoría en una ciudad, copiar resultados, repetir) no supera a un puñado de mercados. La API de Scavio acepta consultas de Google Maps y devuelve JSON estructurado con el nombre de la empresa, dirección, teléfono, calificación, recuento de reseñas y sitio web. Este tutorial muestra cómo recorrer una matriz de categorías y ciudades, recopilar todos los resultados y escribirlos en un único archivo CSV listo para la importación de CRM o herramientas de divulgación.
Requisitos previos
- Python 3.8 o superior instalado
- solicitudes y módulos csv (csv está en la biblioteca estándar)
- Una clave API de Scavio de scavio.dev
- Una lista de categorías y ciudades objetivo
Guia paso a paso
Paso 1: Definir la matriz de categorías y ciudades
Cree dos listas que representen las categorías y ciudades que desea realizar consultas cruzadas. El script buscará cada combinación.
categories = ["plumber", "electrician", "hvac contractor"]
cities = ["Austin TX", "Denver CO", "Portland OR"]Paso 2: Consulta Google Maps para cada combinación
PUBLICAR en el punto final de búsqueda de Scavio con la plataforma configurada en google_maps y la consulta combinando categoría y ciudad. Recopile todos los resultados_locales en una lista plana.
import os
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
all_results = []
for category in categories:
for city in cities:
query = f"{category} in {city}"
response = requests.post(
ENDPOINT,
headers={"x-api-key": API_KEY},
json={"query": query, "platform": "google_maps"}
)
data = response.json()
for biz in data.get("local_results", []):
biz["search_category"] = category
biz["search_city"] = city
all_results.append(biz)
print(f"{query}: {len(data.get('local_results', []))} results")Paso 3: Escribir resultados en CSV
Utilice el módulo csv para escribir todos los registros comerciales recopilados en un archivo. Incluya columnas para nombre, dirección, teléfono, sitio web, calificación, recuento de reseñas y metadatos de búsqueda.
import csv
fields = ["search_category", "search_city", "title", "address", "phone", "website", "rating", "reviews"]
with open("google_maps_export.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=fields, extrasaction="ignore")
writer.writeheader()
writer.writerows(all_results)
print(f"Exported {len(all_results)} businesses to google_maps_export.csv")Paso 4: Deduplicar por teléfono o dirección
Los resultados de Google Maps en consultas superpuestas pueden incluir duplicados. Elimínelos ingresando el número de teléfono antes de escribir el CSV final.
seen = set()
unique = []
for biz in all_results:
key = biz.get("phone") or biz.get("address", "")
if key and key not in seen:
seen.add(key)
unique.append(biz)
print(f"Deduplicated: {len(all_results)} -> {len(unique)} businesses")
all_results = uniqueEjemplo en Python
import os
import csv
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def fetch_maps(query: str) -> list[dict]:
r = requests.post(
ENDPOINT,
headers={"x-api-key": API_KEY},
json={"query": query, "platform": "google_maps"}
)
r.raise_for_status()
return r.json().get("local_results", [])
def batch_export(categories: list[str], cities: list[str], output: str) -> None:
all_biz = []
for cat in categories:
for city in cities:
results = fetch_maps(f"{cat} in {city}")
for biz in results:
biz["category"] = cat
biz["city"] = city
all_biz.extend(results)
print(f"{cat} in {city}: {len(results)} results")
seen, unique = set(), []
for biz in all_biz:
key = biz.get("phone") or biz.get("address", "")
if key and key not in seen:
seen.add(key)
unique.append(biz)
fields = ["category", "city", "title", "address", "phone", "website", "rating", "reviews"]
with open(output, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=fields, extrasaction="ignore")
writer.writeheader()
writer.writerows(unique)
print(f"Exported {len(unique)} unique businesses to {output}")
if __name__ == "__main__":
batch_export(
["plumber", "electrician", "hvac contractor"],
["Austin TX", "Denver CO", "Portland OR"],
"google_maps_export.csv"
)Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
const fs = require("fs");
async function fetchMaps(query) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ query, platform: "google_maps" })
});
const data = await res.json();
return data.local_results || [];
}
async function batchExport(categories, cities, output) {
const all = [];
for (const cat of categories) {
for (const city of cities) {
const results = await fetchMaps(`${cat} in ${city}`);
results.forEach(b => { b.category = cat; b.city = city; });
all.push(...results);
console.log(`${cat} in ${city}: ${results.length} results`);
}
}
const seen = new Set();
const unique = all.filter(b => {
const key = b.phone || b.address || "";
if (key && !seen.has(key)) { seen.add(key); return true; }
return false;
});
const header = "category,city,title,address,phone,website,rating,reviews";
const rows = unique.map(b =>
[b.category, b.city, b.title, b.address, b.phone, b.website, b.rating, b.reviews]
.map(v => `"${(v || "").toString().replace(/"/g, '""')}"`).join(",")
);
fs.writeFileSync(output, [header, ...rows].join("\n"));
console.log(`Exported ${unique.length} unique businesses to ${output}`);
}
batchExport(
["plumber", "electrician", "hvac contractor"],
["Austin TX", "Denver CO", "Portland OR"],
"google_maps_export.csv"
).catch(console.error);Salida esperada
{
"local_results": [
{
"position": 1,
"title": "Radiant Plumbing & Air Conditioning",
"address": "9521 US-290 W, Austin, TX 78736",
"phone": "(512) 555-0147",
"website": "https://radiantplumbing.com",
"rating": 4.9,
"reviews": 3842,
"hours": "Open 24 hours",
"type": "Plumber"
}
]
}