Google Maps contiene datos comerciales estructurados que son valiosos para la generación de oportunidades de venta, investigaciones de mercado y análisis competitivos. La extracción directa de mapas es difícil debido a la representación de JavaScript y la detección de bots. La API de Scavio devuelve datos comerciales locales como parte de los resultados SERP cuando incluye consultas basadas en la ubicación. Este tutorial extrae listados de empresas, información de contacto, calificaciones y direcciones de los resultados de búsqueda locales a $0,005 por consulta.
Requisitos previos
- Python 3.9+ instalado
- solicita biblioteca instalada
- Una clave API de Scavio de scavio.dev
- Una categoría de negocio objetivo y una ubicación
Guia paso a paso
Paso 1: Buscar empresas locales
Utilice consultas específicas de ubicación para activar el paquete local y los resultados de Maps en el SERP. La API devuelve datos comerciales locales estructurados.
import os, requests, json, time
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
URL = 'https://api.scavio.dev/api/v1/search'
def search_local_businesses(category: str, location: str, num: int = 10) -> dict:
resp = requests.post(URL, headers=H,
json={'query': f'{category} in {location}', 'country_code': 'us', 'num_results': num})
data = resp.json()
# Extract local pack results (Maps listings)
local_pack = data.get('local_results', data.get('local_pack', []))
# Also check organic results for business pages
organic = data.get('organic_results', [])
return {
'local_pack': local_pack,
'organic': organic,
'knowledge_graph': data.get('knowledge_graph', {}),
}
results = search_local_businesses('plumbers', 'Austin TX')
print(f'Local pack: {len(results["local_pack"])} businesses')
print(f'Organic: {len(results["organic"])} results')Paso 2: Extraer y normalizar datos comerciales
Analice los resultados locales para extraer el nombre de la empresa, la dirección, el teléfono, la calificación y el recuento de reseñas en un formato normalizado.
def extract_business_data(search_results: dict) -> list:
businesses = []
# From local pack
for biz in search_results.get('local_pack', []):
businesses.append({
'name': biz.get('title', biz.get('name', '')),
'address': biz.get('address', ''),
'phone': biz.get('phone', ''),
'rating': biz.get('rating', ''),
'reviews': biz.get('reviews', biz.get('reviews_count', 0)),
'type': biz.get('type', ''),
'website': biz.get('website', biz.get('link', '')),
'source': 'local_pack',
})
# From organic results (business websites)
for r in search_results.get('organic', []):
if any(signal in r.get('link', '').lower() for signal in ['yelp.com', 'yellowpages', 'bbb.org']):
continue # Skip directories
businesses.append({
'name': r.get('title', ''),
'website': r.get('link', ''),
'snippet': r.get('snippet', ''),
'source': 'organic',
})
return businesses
businesses = extract_business_data(results)
print(f'Extracted {len(businesses)} businesses')
for b in businesses[:5]:
print(f' {b["name"][:40]} | {b.get("rating", "N/A")} stars | {b.get("phone", "N/A")}')Paso 3: Búsqueda por lotes en múltiples categorías y ubicaciones
Escale la extracción en múltiples categorías comerciales y ubicaciones. Exporte los resultados a CSV para usarlos en CRM o herramientas de divulgación.
import csv
def batch_local_search(searches: list, output_file: str = 'local_businesses.csv') -> list:
all_businesses = []
for category, location in searches:
results = search_local_businesses(category, location)
businesses = extract_business_data(results)
for b in businesses:
b['category'] = category
b['location'] = location
all_businesses.extend(businesses)
print(f'{category} in {location}: {len(businesses)} businesses')
time.sleep(0.3)
# Export to CSV
if all_businesses:
keys = ['name', 'category', 'location', 'address', 'phone', 'rating', 'reviews', 'website']
with open(output_file, 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=keys, extrasaction='ignore')
writer.writeheader()
writer.writerows(all_businesses)
print(f'\nTotal: {len(all_businesses)} businesses exported to {output_file}')
print(f'Cost: ${len(searches) * 0.005:.3f}')
return all_businesses
searches = [
('plumbers', 'Austin TX'),
('electricians', 'Austin TX'),
('HVAC contractors', 'Austin TX'),
]
batch_local_search(searches)Ejemplo en Python
import os, requests, time
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
def local_businesses(category, location):
resp = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'query': f'{category} in {location}', 'country_code': 'us', 'num_results': 10})
data = resp.json()
local = data.get('local_results', data.get('local_pack', []))
print(f'{category} in {location}: {len(local)} local results')
for b in local[:5]:
name = b.get('title', b.get('name', ''))
rating = b.get('rating', 'N/A')
print(f' {name[:35]} | {rating} stars')
for cat in ['plumbers', 'electricians']:
local_businesses(cat, 'Austin TX')
time.sleep(0.3)Ejemplo en JavaScript
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;
async function localBusinesses(category, location) {
const resp = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: `${category} in ${location}`, country_code: 'us', num_results: 10 })
});
const data = await resp.json();
const local = data.local_results || data.local_pack || [];
console.log(`${category} in ${location}: ${local.length} results`);
local.slice(0, 5).forEach(b => {
console.log(` ${(b.title || b.name || '').slice(0, 35)} | ${b.rating || 'N/A'} stars`);
});
}
(async () => {
await localBusinesses('plumbers', 'Austin TX');
await localBusinesses('electricians', 'Austin TX');
})();Salida esperada
Local pack: 8 businesses
Organic: 10 results
Extracted 12 businesses
ABC Plumbing & Drain Service | 4.8 stars | (512) 555-0123
Austin Reliable Plumbers | 4.6 stars | (512) 555-0456
Radiant Plumbing & Air Conditioning | 4.9 stars | (512) 555-0789
plumbers in Austin TX: 8 businesses
electricians in Austin TX: 7 businesses
HVAC contractors in Austin TX: 6 businesses
Total: 21 businesses exported to local_businesses.csv
Cost: $0.015