Casos de Uso

Recopilación de datos sanitarios detrás de los muros CAPTCHA

Los portales de datos de atención médica (directorios de proveedores, bases de datos de precios de medicamentos y registros de ensayos clínicos) utilizan CAPTCHA para evitar la recopilación automatizada de datos. Los investigadores y las plataformas de tecnología sanitaria necesitan estos datos para análisis, cumplimiento y toma de decisiones informadas.


Dónde aparecen los CAPTCHA

Fuente Tipo CAPTCHA Datos Caso de uso
Directorios de proveedores (NPI) CAPTCHA de imagen Búsqueda Doctor/facility Adecuación de la red
Portales de precios de medicamentos reCAPTCHA v2 Precios de medicamentos Transparencia de precios
Registros de ensayos clínicos. reCAPTCHA v2 Datos de prueba, resultados. Análisis de la investigación
Formularios de seguros reCAPTCHA v2 Listas de cobertura de medicamentos Comparación de formularios
Juntas estatales de licencias CAPTCHA de imagen Verificación de licencia Verificaciones de credenciales
Calificaciones de calidad hospitalaria Cloudflare Turnstile Métricas de calidad Análisis de desempeño

Raspador de directorio de proveedores

import requests
import time
import re
import base64
from bs4 import BeautifulSoup
import csv

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 HealthcareDataCollector:
    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 search_providers(self, portal_url, specialty, location, sitekey=None):
        """Search provider directory with CAPTCHA handling."""
        resp = self.session.get(portal_url, timeout=30)

        data = {"specialty": specialty, "location": location}

        # Handle CAPTCHA
        if sitekey:
            token = solve_recaptcha(sitekey, portal_url)
            data["g-recaptcha-response"] = token
        else:
            captcha_img = re.search(r'src="(/captcha[^"]+)"', resp.text)
            if captcha_img:
                img_url = portal_url.rstrip("/") + captcha_img.group(1)
                img = self.session.get(img_url)
                data["captcha"] = solve_image_captcha(img.content)

        resp = self.session.post(portal_url, data=data)
        return self._parse_providers(resp.text)

    def lookup_drug_prices(self, pricing_url, drug_name, zip_code, sitekey):
        """Look up drug prices with CAPTCHA solving."""
        # Load search page
        self.session.get(pricing_url)

        # Solve CAPTCHA
        token = solve_recaptcha(sitekey, pricing_url)

        resp = self.session.post(pricing_url, data={
            "drug": drug_name,
            "zip": zip_code,
            "g-recaptcha-response": token,
        })

        if resp.status_code == 200:
            return self._parse_prices(resp.text)
        return []

    def batch_provider_lookup(self, portal_url, specialties, locations, output_file):
        """Batch search across specialties and locations."""
        all_providers = []

        for specialty in specialties:
            for location in locations:
                try:
                    providers = self.search_providers(
                        portal_url, specialty, location,
                    )
                    for p in providers:
                        p["specialty_search"] = specialty
                        p["location_search"] = location
                    all_providers.extend(providers)
                    print(f"{specialty} / {location}: {len(providers)} providers")
                    time.sleep(5)
                except Exception as e:
                    print(f"Error: {specialty} / {location}: {e}")

        # Export
        if all_providers:
            keys = all_providers[0].keys()
            with open(output_file, "w", newline="", encoding="utf-8") as f:
                writer = csv.DictWriter(f, fieldnames=keys)
                writer.writeheader()
                writer.writerows(all_providers)

        return all_providers

    def _parse_providers(self, html):
        soup = BeautifulSoup(html, "html.parser")
        providers = []
        for card in soup.select(".provider-card, .doctor-result, tr.provider"):
            providers.append({
                "name": self._text(card, ".name, .provider-name"),
                "specialty": self._text(card, ".specialty"),
                "address": self._text(card, ".address"),
                "phone": self._text(card, ".phone"),
                "accepting": self._text(card, ".accepting-patients"),
            })
        return providers

    def _parse_prices(self, html):
        soup = BeautifulSoup(html, "html.parser")
        prices = []
        for row in soup.select(".pharmacy-row, .price-result"):
            prices.append({
                "pharmacy": self._text(row, ".pharmacy-name"),
                "price": self._text(row, ".price, .drug-price"),
                "quantity": self._text(row, ".quantity"),
            })
        return prices

    def _text(self, el, selector):
        found = el.select_one(selector)
        return found.get_text(strip=True) if found else ""


# Usage
collector = HealthcareDataCollector(
    proxy="http://user:pass@residential.proxy.com:5000"
)

# Provider search
providers = collector.search_providers(
    portal_url="https://provider-directory.example.com/search",
    specialty="Cardiology",
    location="New York, NY",
)

# Drug pricing
prices = collector.lookup_drug_prices(
    pricing_url="https://drug-prices.example.com/compare",
    drug_name="atorvastatin",
    zip_code="10001",
    sitekey="6Lc_xxxxxxx",
)

Recopilación de datos de ensayos clínicos

def collect_clinical_trials(search_url, condition, sitekey):
    """Collect clinical trial data for a medical condition."""
    collector = HealthcareDataCollector(
        proxy="http://user:pass@residential.proxy.com:5000"
    )

    token = solve_recaptcha(sitekey, search_url)
    resp = collector.session.post(search_url, data={
        "condition": condition,
        "status": "recruiting",
        "g-recaptcha-response": token,
    })

    if resp.status_code != 200:
        return []

    soup = BeautifulSoup(resp.text, "html.parser")
    trials = []
    for item in soup.select(".trial-item, .study-result"):
        trials.append({
            "title": collector._text(item, ".title, h3"),
            "status": collector._text(item, ".status"),
            "sponsor": collector._text(item, ".sponsor"),
            "phase": collector._text(item, ".phase"),
            "enrollment": collector._text(item, ".enrollment"),
            "location": collector._text(item, ".location"),
        })

    return trials

Consideraciones de privacidad de datos

Tipo de datos Sensibilidad Recomendación
Directorios de proveedores Bajo (información pública) Generalmente seguro de recolectar
Precio de los medicamentos Bajo (precio público) Permitido por transparencia
Metadatos de ensayos clínicos Bajo (registros públicos) Uso apropiado en investigación
Comentarios de pacientes Medio Anonimizar antes del análisis
Detalles del plan de seguro Bajo (tarifas publicadas) Permitido para comparación

Importante: Nunca intente recopilar información médica protegida (PHI). Centrarse únicamente en datos disponibles públicamente y no específicos de pacientes.


Solución de problemas

Problema causa Solución
Imagen CAPTCHA ilegible Imagen de baja calidad Reintentar: se genera una nueva imagen
La búsqueda de proveedores devuelve vacía CAPTCHA bloqueó la búsqueda Resuelva CAPTCHA antes de enviar
El precio de los medicamentos varía según la ubicación. Precios basados en geografía Haga coincidir la ubicación del proxy con el código postal
La sesión caduca en varias páginas Tiempo de espera del portal Completa búsquedas rápidamente
Tarifa limitada en búsquedas por lotes Demasiadas solicitudes Agregue retrasos de 5 a 10 segundos

Preguntas frecuentes

¿Se permite recopilar datos sobre precios de atención médica?

La regulación fomenta la transparencia de los precios de los medicamentos (Regla de Transparencia de Precios de la CMS). Los datos del directorio de proveedores públicos son generalmente accesibles.

¿Puedo comparar los precios de los medicamentos entre farmacias?

Sí. Servicios como GoodRx hacen esto a escala. CaptchaAI maneja los CAPTCHA que utilizan los portales de precios para limitar el acceso automatizado.

¿Cómo manejo HIPAA cuando busco sitios de atención médica?

HIPAA se aplica a la información de salud protegida (PHI). Los datos públicos como directorios de proveedores, precios de medicamentos y registros de ensayos clínicos no son PHI. Nunca elimine los registros de pacientes individuales.


Guías relacionadas

  • Automatización del portal gubernamental
  • Scraping de investigación académica
  • Representantes residenciales rotativos

Recopile datos de atención médica de manera eficiente:obtenga su clave CaptchaAIy automatizar las búsquedas de proveedores y precios.

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