Los raspadores web que analizan HTML de Google, Reddit o Amazon son la parte más frágil de cualquier canal de datos. Cuando el sitio de destino cambia su diseño, su raspador se rompe. Cuando detectan tu tráfico, te bloquean. Cuando se amplía, los costos de proxy aumentan. Una API de búsqueda estructurada devuelve los mismos datos que un JSON limpio, sin análisis, sin servidores proxy y sin mantenimiento. Este tutorial muestra cómo reemplazar un raspador típico con la API de Scavio, paso a paso.
Requisitos previos
- Python 3.8+ instalado
- Un scraper existente que desea migrar (BeautifulSoup, Playwright o Selenium)
- Una clave API de Scavio de scavio.dev
Guia paso a paso
Paso 1: Audite la salida de datos de su raspador
Identifique qué campos extrae actualmente su raspador. La mayoría de los raspadores de Google extraen: título, URL, fragmento, posición.
# Typical scraper output:
# [
# {'title': '...', 'url': '...', 'snippet': '...', 'position': 1},
# {'title': '...', 'url': '...', 'snippet': '...', 'position': 2},
# ]
#
# Scavio's 'organic' array returns the same fields:
# [
# {'title': '...', 'link': '...', 'snippet': '...', 'position': 1},
# ]
# Only difference: 'url' -> 'link'Paso 2: Reemplazar la función de raspado
Reemplace su código de raspado con una única llamada API.
import requests, os
# BEFORE: 150 lines of scraping code
# from bs4 import BeautifulSoup
# import random
# PROXIES = [...]
# def scrape_google(query):
# proxy = random.choice(PROXIES)
# resp = requests.get(f'https://www.google.com/search?q={query}',
# proxies={'https': proxy}, headers={'User-Agent': ...})
# soup = BeautifulSoup(resp.text, 'html.parser')
# results = []
# for div in soup.select('div.g'):
# ... # 100 lines of parsing
# AFTER: 10 lines
def search_google(query: str) -> list:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': os.environ['SCAVIO_API_KEY']},
json={'platform': 'google', 'query': query}, timeout=10)
return [{'title': r['title'], 'url': r['link'], 'snippet': r['snippet'], 'position': r.get('position', i+1)}
for i, r in enumerate(resp.json().get('organic', []))]Paso 3: Actualizar referencias de campos en sentido descendente
Si su código hace referencia a nombres de campos específicos del raspador, actualícelos.
# Find all references to the old scraper output format:
# grep -r 'scrape_google\|from scraper\|import scraper' .
# Common field mapping:
# Old scraper -> Scavio API
# result.url -> result.link
# result.desc -> result.snippet
# result.rank -> result.positionPaso 4: Eliminar dependencias de proxy y analizador
Limpie su archivo de requisitos y elimine la infraestructura de scraping.
# Remove from requirements.txt:
# beautifulsoup4
# lxml
# playwright
# selenium
# webdriver-manager
# fake-useragent
# rotating-proxies
# Remove proxy configuration files
# Cancel proxy subscription (saves $50-200/month)
# Your requirements.txt now just needs:
# requestsEjemplo en Python
# Migration summary:
# Before: 150 lines + proxy subscription + maintenance
# After: 10 lines + $0.003/query + zero maintenance
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def search(query, platform='google'):
return requests.post('https://api.scavio.dev/api/v1/search',
headers=H, json={'platform': platform, 'query': query},
timeout=10).json().get('organic', [])Ejemplo en JavaScript
// Before: Playwright + proxy rotation + HTML parsing
// After:
async function search(query, platform = 'google') {
const resp = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'},
body: JSON.stringify({platform, query})
});
return (await resp.json()).organic || [];
}Salida esperada
A clean search function replacing hundreds of lines of scraping code. No proxies, no parsing, no maintenance.