El SDK proporciona dos opciones de cliente dependiendo de tu caso de uso:
Cliente Sincrónico (`Olostep`)
Ideal para: Scripts y casos de uso simples donde prefieres operaciones bloqueantes.
El cliente sincrónico proporciona una interfaz más simple y bloqueante que es más fácil de comenzar si eres nuevo en async/await.
Cliente Asincrónico (`AsyncOlostep`)
Ideal para: Aplicaciones en producción y manejo de muchas solicitudes concurrentes.
El cliente asincrónico proporciona operaciones no bloqueantes y es la opción recomendada para aplicaciones en producción que necesitan alto rendimiento.
El cliente sincrónico (Olostep) proporciona una interfaz bloqueante que es perfecta para scripts y casos de uso simples.
from olostep import Olostep# Proporciona la clave API ya sea pasando el parámetro 'api_key' o# configurando la variable de entorno OLOSTEP_API_KEY# El cliente sincrónico maneja la gestión de recursos automáticamente# No se necesita cierre explícito - los recursos se limpian después de cada operaciónclient = Olostep(api_key="YOUR_REAL_KEY")scrape_result = client.scrapes.create(url_to_scrape="https://example.com")
from olostep import Olostepclient = Olostep(api_key="your-api-key")# Procesa múltiples URLs eficientementebatch = client.batches.create( urls=[ "https://www.google.com/search?q=python", "https://www.google.com/search?q=javascript", "https://www.google.com/search?q=typescript" ])# Espera la finalización y procesa los resultadosfor item in batch.items(): content = item.retrieve(["html"]) print(f"Processed {item.url}: {len(content.html_content)} bytes")
from olostep import Olostepclient = Olostep(api_key="your-api-key")# Extraer todos los enlaces de un sitio webmaps = client.maps.create(url="https://example.com")# Obtener todas las URLs descubiertasurls = []for url in maps.urls(): urls.append(url) if len(urls) >= 10: # Límite para demo breakprint(f"Found {len(urls)} URLs")
from olostep import Olostepclient = Olostep(api_key="your-api-key")# Obtener respuestas de páginas web usando IAanswer = client.answers.create( task="What is the main topic of https://example.com?")print(f"Answer: {answer.answer}")
El cliente asincrónico (AsyncOlostep) es el cliente recomendado para aplicaciones de alto rendimiento, servicios backend, y cuando necesitas manejar muchas solicitudes concurrentes.
from olostep import AsyncOlostep# Proporciona la clave API ya sea pasando el parámetro 'api_key' o# configurando la variable de entorno OLOSTEP_API_KEY# GESTIÓN DE RECURSOS# ===================# El SDK soporta dos patrones de uso para la gestión de recursos:# 1. Administrador de Contexto (Recomendado para uso único):# Maneja automáticamente la limpieza de recursosasync with AsyncOlostep(api_key="YOUR_REAL_KEY") as client: scrape_result = await client.scrapes.create(url_to_scrape="https://example.com")# El transporte se cierra automáticamente aquí# 2. Cierre Explícito (Para servicios de larga duración):# Requiere limpieza manual de recursosclient = AsyncOlostep(api_key="YOUR_REAL_KEY")try: scrape_result = await client.scrapes.create(url_to_scrape="https://example.com")finally: await client.close() # Cierra manualmente el transporte
import asynciofrom olostep import AsyncOlostepasync def main(): async with AsyncOlostep(api_key="your-api-key") as client: # Extraer todos los enlaces de un sitio web maps = await client.maps.create(url="https://example.com") # Obtener todas las URLs descubiertas urls = [] async for url in maps.urls(): urls.append(url) if len(urls) >= 10: # Límite para demo break print(f"Found {len(urls)} URLs")asyncio.run(main())
import asynciofrom olostep import AsyncOlostepasync def main(): async with AsyncOlostep(api_key="your-api-key") as client: # Obtener respuestas de páginas web usando IA answer = await client.answers.create( task="What is the main topic of https://example.com?" ) print(f"Answer: {answer.answer}")asyncio.run(main())
Captura todos los errores del SDK usando la clase de excepción base:
from olostep import Olostep, Olostep_BaseErrorclient = Olostep(api_key="your-api-key")try: result = client.scrapes.create(url_to_scrape="https://example.com")except Olostep_BaseError as e: print(f"Error has occurred: {type(e).__name__}") print(f"Error message: {e}")
Para información detallada sobre el manejo de errores, incluyendo la jerarquía completa de excepciones y opciones de manejo de errores granulares, consulta Manejo Detallado de Errores.
El SDK reintenta automáticamente en errores transitorios (problemas de red, problemas temporales del servidor) basado en la configuración de RetryStrategy. Puedes personalizar el comportamiento de reintento pasando una instancia de RetryStrategy al crear el cliente:
from olostep import Olostep, Format, Country, WaitAction, FillInputActionclient = Olostep(api_key="your-api-key")# Control total sobre el comportamiento de raspadoresult = client.scrapes.create( url_to_scrape="https://news.google.com/", wait_before_scraping=3000, formats=[Format.HTML, Format.MARKDOWN], remove_css_selectors=["script", ".popup"], actions=[ WaitAction(milliseconds=1500), FillInputAction(selector="searchbox", value="olostep") ], parser="@olostep/google-news", country=Country.US, remove_images=True)
from olostep import Olostep, Countryclient = Olostep(api_key="your-api-key")batch = client.batches.create([ {"url": "https://www.google.com/search?q=python", "custom_id": "search_1"}, {"url": "https://www.google.com/search?q=javascript", "custom_id": "search_2"}, {"url": "https://www.google.com/search?q=typescript", "custom_id": "search_3"}],country=Country.US,parser="@olostep/google-search")# Procesar resultados por ID personalizado# Al usar un parser, recuperar contenido JSON en lugar de HTMLfor item in batch.items(): if item.custom_id == "search_2": content = item.retrieve(["json"]) print(f"Search result: {content.json_content}")
from olostep import Olostepclient = Olostep(api_key="your-api-key")# Primero crea una respuestacreated_answer = client.answers.create( task="What is the main topic of https://example.com?")# Luego recupérala usando el IDanswer = client.answers.get(answer_id=created_answer.id)print(f"Answer: {answer.answer}")
import logginglogging.basicConfig(level=logging.INFO)logger = logging.getLogger("olostep")logger.setLevel(logging.INFO) # Usa DEBUG para salida detallada
Niveles de Registro: INFO (recomendado), DEBUG (detallado), WARNING, ERROR
La clase RetryStrategy controla cómo el SDK de Olostep maneja errores transitorios de la API a través de reintentos automáticos con retroceso exponencial y jitter. Esto ayuda a asegurar una operación confiable en entornos de producción donde problemas temporales de red, límites de tasa y sobrecarga del servidor pueden causar fallos intermitentes.
from olostep import AsyncOlostep, RetryStrategy# Crear estrategia de reintentos personalizadaretry_strategy = RetryStrategy( max_retries=3, initial_delay=1.0, jitter_min=0.2, # 20% de jitter mínimo jitter_max=0.8, # 80% de jitter máximo)# Usar con clienteasync with AsyncOlostep( api_key="your-api-key", retry_strategy=retry_strategy) as client: result = await client.scrapes.create("https://example.com")
# Optimizado para operaciones de alto volumenretry_strategy = RetryStrategy( max_retries=2, initial_delay=0.5, jitter_min=0.1, jitter_max=0.3 # Menor jitter para un tiempo más predecible)# Duración máxima: ~1.95s
El jitter añade aleatorización para prevenir problemas de “thundering herd” cuando muchos clientes reintentan simultáneamente. El jitter se calcula como:
Cuando todos los reintentos se agotan, se lanza el error original:
try: result = await client.scrapes.create("https://example.com")except OlostepServerError_TemporaryIssue as e: print(f"Failed after all retries: {e}") # Manejar el fallo permanente
El SDK de Olostep proporciona una jerarquía de excepciones completa para diferentes escenarios de fallo. Todas las excepciones heredan de Olostep_BaseError.Hay tres tipos principales de errores que heredan directamente de Olostep_BaseError:
Olostep_APIConnectionError - Fallos de conexión a nivel de red
OlostepServerError_BaseError - Errores generados (de alguna manera) por el servidor API
OlostepClientError_BaseError - Errores generados por el SDK del cliente
Olostep_APIConnectionError es separado de los errores del servidor porque representa fallos a nivel de red que ocurren antes de que la API pueda procesar la solicitud. Estos son problemas de capa de transporte (fallos de DNS o HTTP, tiempos de espera, conexión rechazada, etc.) en lugar de errores a nivel de API. Los códigos de estado HTTP (4xx, 5xx) se consideran respuestas de API y se categorizan como errores del servidor, incluso si indican problemas.
Para la mayoría de los casos de uso, captura el error base e imprime el nombre del error:
from olostep import AsyncOlostep, Olostep_BaseErrortry: result = await client.scrapes.create(url_to_scrape="https://example.com")except Olostep_BaseError as e: print(f"Error has occurred: {type(e).__name__}") print(f"Error message: {e}")
Este enfoque captura todos los errores del SDK y proporciona información clara sobre lo que salió mal. El nombre del error (por ejemplo, OlostepServerError_AuthFailed) es lo suficientemente descriptivo para entender el problema.
Si necesitas un manejo de errores más específico, captura los tipos de error específicos directamente. Evita usar OlostepServerError_BaseError o OlostepClientError_BaseError - estas clases base solo indican quién generó el error (servidor vs cliente), no quién es responsable de solucionarlo. Esto es un detalle de implementación que no ayuda con la lógica de manejo de errores.En su lugar, captura tipos de error específicos que indiquen el problema real:
from olostep import ( AsyncOlostep, Olostep_BaseError, Olostep_APIConnectionError, OlostepServerError_AuthFailed, OlostepServerError_CreditsExhausted, OlostepClientError_NoAPIKey,)try: result = await client.scrapes.create(url_to_scrape="https://example.com")except Olostep_APIConnectionError as e: print(f"Network error: {type(e).__name__}")except OlostepServerError_AuthFailed: print("Invalid API key")except OlostepServerError_CreditsExhausted: print("Credits exhausted")except OlostepClientError_NoAPIKey: print("API key not provided")except Olostep_BaseError as e: print(f"Error has occurred: {type(e).__name__}")