Casos de Uso

Automatización de comparación de cotizaciones de seguros con manejo de CAPTCHA

Las plataformas de comparación de seguros y las páginas de cotizaciones de operadores protegen sus motores de tarifas con CAPTCHA para evitar la recopilación automatizada de cotizaciones. CaptchaAI maneja estos desafíos para los equipos de control de calidad que prueban flujos de trabajo de seguros y agregadores de comparación.


CAPTCHA en sitios de seguros

Tipo de transportista CAPTCHA Punto de activación Complejidad de cotización
Seguro de automóvil reCAPTCHA v2 Envío del formulario de cotización Multipaso (vehículo + conductor)
Seguro médico reCAPTCHA v2 Comparación de planes Varios pasos (demografía)
Seguro de hogar CAPTCHA de imagen búsqueda de direcciones moderado
Seguro de vida reCAPTCHA v2 Calculadora de tarifas forma sencilla
Seguro de viaje reCAPTCHA v2 Invisible Solicitud de cotización forma sencilla
Seguro comercial reCAPTCHA v3 Formulario de contacto/quote forma larga

Recopilador de cotizaciones de múltiples operadores

import requests
import time
import re
import base64

CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"


def solve_recaptcha(sitekey, pageurl):
    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY, "method": "userrecaptcha",
        "googlekey": sitekey, "pageurl": pageurl, "json": 1,
    })
    task_id = resp.json()["request"]
    for _ in range(60):
        time.sleep(5)
        result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY, "action": "get",
            "id": task_id, "json": 1,
        })
        data = result.json()
        if data["request"] != "CAPCHA_NOT_READY":
            return data["request"]
    raise TimeoutError("Timeout")


def solve_image_captcha(image_bytes):
    img_b64 = base64.b64encode(image_bytes).decode()
    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY, "method": "base64",
        "body": img_b64, "json": 1,
    })
    task_id = resp.json()["request"]
    for _ in range(20):
        time.sleep(3)
        result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY, "action": "get",
            "id": task_id, "json": 1,
        })
        data = result.json()
        if data["request"] != "CAPCHA_NOT_READY":
            return data["request"]
    raise TimeoutError("Timeout")


class InsuranceQuoteCollector:
    def __init__(self, proxy=None):
        self.session = requests.Session()
        if proxy:
            self.session.proxies = {"http": proxy, "https": proxy}
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36",
        })

    def get_auto_quote(self, carrier_url, vehicle_data, driver_data, sitekey):
        """Get auto insurance quote from a single carrier."""
        # Step 1: Load quote page
        self.session.get(carrier_url)

        # Step 2: Submit vehicle info
        resp = self.session.post(f"{carrier_url}/vehicle", data=vehicle_data)

        # Step 3: Submit driver info
        resp = self.session.post(f"{carrier_url}/driver", data=driver_data)

        # Step 4: Solve CAPTCHA on quote page
        token = solve_recaptcha(sitekey, f"{carrier_url}/quote")

        # Step 5: Get quote
        resp = self.session.post(f"{carrier_url}/quote", data={
            "g-recaptcha-response": token,
        })

        if resp.status_code == 200:
            return self._parse_quote(resp.text)
        return None

    def compare_carriers(self, carriers, vehicle_data, driver_data):
        """Compare quotes across multiple carriers."""
        quotes = []

        for carrier in carriers:
            try:
                quote = self.get_auto_quote(
                    carrier_url=carrier["url"],
                    vehicle_data=vehicle_data,
                    driver_data=driver_data,
                    sitekey=carrier["sitekey"],
                )
                quotes.append({
                    "carrier": carrier["name"],
                    "status": "success",
                    "quote": quote,
                })
            except Exception as e:
                quotes.append({
                    "carrier": carrier["name"],
                    "status": "failed",
                    "error": str(e),
                })
            time.sleep(5)  # Delay between carriers

        # Sort by price
        successful = [q for q in quotes if q["status"] == "success" and q["quote"]]
        successful.sort(key=lambda x: x["quote"].get("monthly_premium", float("inf")))

        return {
            "quotes": quotes,
            "best_rate": successful[0] if successful else None,
            "total_compared": len(carriers),
            "successful": len(successful),
        }

    def _parse_quote(self, html):
        from bs4 import BeautifulSoup
        soup = BeautifulSoup(html, "html.parser")

        premium_el = soup.select_one(".premium, .monthly-rate, .quote-amount")
        coverage_el = soup.select_one(".coverage-summary, .plan-details")

        return {
            "monthly_premium": premium_el.get_text(strip=True) if premium_el else "",
            "coverage": coverage_el.get_text(strip=True) if coverage_el else "",
        }


# Usage
collector = InsuranceQuoteCollector(
    proxy="http://user-session-abc:pass@residential.proxy.com:5000"
)

vehicle = {
    "year": "2022",
    "make": "Toyota",
    "model": "Camry",
    "vin": "",
    "mileage": "15000",
}

driver = {
    "age": "35",
    "gender": "M",
    "zip": "90210",
    "driving_record": "clean",
}

carriers = [
    {"name": "Carrier A", "url": "https://carrier-a.example.com/auto", "sitekey": "6Lc_xxx1"},
    {"name": "Carrier B", "url": "https://carrier-b.example.com/auto", "sitekey": "6Lc_xxx2"},
    {"name": "Carrier C", "url": "https://carrier-c.example.com/auto", "sitekey": "6Lc_xxx3"},
]

comparison = collector.compare_carriers(carriers, vehicle, driver)
print(f"Best rate: {comparison['best_rate']}")

Comparación de planes de seguro médico

def compare_health_plans(marketplace_url, demographics, sitekey):
    """Compare health insurance plans on marketplace sites."""
    collector = InsuranceQuoteCollector(
        proxy="http://user-session-xyz:pass@residential.proxy.com:5000"
    )

    # Load marketplace
    collector.session.get(marketplace_url)

    # Submit demographics
    collector.session.post(f"{marketplace_url}/demographics", data=demographics)

    # Solve CAPTCHA for plan results
    token = solve_recaptcha(sitekey, f"{marketplace_url}/plans")

    resp = collector.session.post(f"{marketplace_url}/plans", data={
        "g-recaptcha-response": token,
    })

    if resp.status_code == 200:
        from bs4 import BeautifulSoup
        soup = BeautifulSoup(resp.text, "html.parser")
        plans = []
        for card in soup.select(".plan-card, .insurance-plan"):
            plans.append({
                "name": card.select_one(".plan-name").get_text(strip=True) if card.select_one(".plan-name") else "",
                "premium": card.select_one(".premium").get_text(strip=True) if card.select_one(".premium") else "",
                "deductible": card.select_one(".deductible").get_text(strip=True) if card.select_one(".deductible") else "",
            })
        return plans

    return []

Requisitos de sesión

La cotización de seguros siempre consta de varios pasos; las sesiones fijas son obligatorias:

paso Datos enviados Requisito de propiedad intelectual
1. Información personal Nombre, fecha de nacimiento, código postal Misma IP
2. Vehículo/property Año, marca, modelo. Misma IP
3. Selección de cobertura Límites, deducible Misma IP
4. Resolución de CAPTCHA ficha Misma IP
5. Visualización de cotizaciones N/A Misma IP

Utilice sesiones de proxy fijas con TTL de 10 a 15 minutos para flujos de seguros.


Solución de problemas

Problema causa Solución
El formulario de cotización se restablece a mitad del flujo IP cambiada entre pasos Usar sesión de proxy fijo
"No se puede proporcionar cotización" La validación de datos falló Verifique los campos obligatorios
CAPTCHA aparece dos veces El primer token expiró Resolver de nuevo inmediatamente
Tarifas diferentes a las manuales Cookie/session diferencias Iniciar sesión limpia
El limitador de velocidad bloquea solicitudes Demasiadas citas de IP Reduzca la velocidad y rote la IP entre operadores

Preguntas frecuentes

¿Cuántas cotizaciones puedo cobrar por día?

Normalmente entre 20 y 50 por transportista por día con los retrasos adecuados. Superar esto activa los limitadores de velocidad y los CAPTCHA de manera más agresiva.

¿Por qué necesito sesiones adhesivas para el seguro?

Los flujos de trabajo de cotizaciones de seguros constan de varios pasos. El servidor vincula cada paso a su sesión e IP. Cambiar la IP en mitad del flujo invalida la sesión.

¿Puedo automatizar múltiples sectores de seguros?

Sí. El mismo enfoque de manejo de CAPTCHA funciona para seguros de automóvil, salud, hogar y vida; solo difieren los campos del formulario.


Guías relacionadas


Compare cotizaciones de seguros a escala:obtenga su clave CaptchaAIy automatizar el proceso de cotización.

Los comentarios están deshabilitados para este artículo.