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.