Anwendungsfälle

Erfassung von Gesundheitsdaten hinter CAPTCHA-Wänden

Gesundheitsdatenportale – Anbieterverzeichnisse, Arzneimittelpreisdatenbanken und Register für klinische Studien – verwenden CAPTCHAs, um eine automatisierte Datenerfassung zu verhindern. Forscher und Gesundheitstechnologieplattformen benötigen diese Daten für Analysen, Compliance und fundierte Entscheidungsfindung.


Wo CAPTCHAs erscheinen

Quelle CAPTCHA-Typ Daten Anwendungsfall
Anbieterverzeichnisse (NPI) Bild-CAPTCHA Doctor/facility-Suche Angemessenheit des Netzwerks
Portale zur Arzneimittelpreisgestaltung reCAPTCHA v2 Preise für Medikamente Preistransparenz
Register für klinische Studien reCAPTCHA v2 Versuchsdaten, Ergebnisse Forschungsanalyse
Versicherungsformulare reCAPTCHA v2 Listen zur Drogenabdeckung Formularvergleich
Staatliche Lizenzbehörden Bild-CAPTCHA Lizenzüberprüfung Ausweisprüfungen
Qualitätsbewertungen von Krankenhäusern Cloudflare Turnstile Qualitätskennzahlen Leistungsanalyse

Anbieterverzeichnis-Scraper

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",
)

Datenerfassung für klinische Studien

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

Überlegungen zum Datenschutz

Datentyp Empfindlichkeit Empfehlung
Anbieterverzeichnisse Niedrig (öffentliche Informationen) Im Allgemeinen sicher zu sammeln
Arzneimittelpreise Niedrig (öffentliche Preisgestaltung) Aus Gründen der Transparenz zulässig
Metadaten klinischer Studien Niedrig (öffentliche Register) Forschungsnutzung angemessen
Patientenbewertungen Mittel Vor der Analyse anonymisieren
Details zum Versicherungsplan Niedrig (veröffentlichte Preise) Zum Vergleich zugelassen

Wichtig: Versuchen Sie niemals, geschützte Gesundheitsinformationen (PHI) zu sammeln. Konzentrieren Sie sich nur auf öffentlich verfügbare, nicht patientenspezifische Daten.


Fehlerbehebung

Problem Ursache Lösung
Bild-CAPTCHA nicht lesbar Bild von geringer Qualität Wiederholen – neues Bild erstellt
Anbietersuche gibt leer zurück CAPTCHA hat die Suche blockiert Lösen Sie das CAPTCHA vor dem Absenden
Der Medikamentenpreis variiert je nach Standort Geobasierte Preisgestaltung Ordnen Sie den Proxy-Standort der Postleitzahl zu
Die Sitzung läuft auf mehreren Seiten ab Portal-Timeout Führen Sie Suchvorgänge schnell durch
Rate für Batch-Suchen begrenzt Zu viele Anfragen Fügen Sie Verzögerungen von 5–10 Sekunden hinzu

FAQ

Ist die Erhebung von Preisdaten für das Gesundheitswesen erlaubt?

Die Transparenz der Arzneimittelpreise wird durch Regulierung gefördert (CMS-Preistransparenzregel). Die Daten öffentlicher Anbieterverzeichnisse sind allgemein zugänglich.

Kann ich die Arzneimittelpreise in verschiedenen Apotheken vergleichen?

Ja. Dienste wie GoodRx leisten dies in großem Umfang. CaptchaAI verwaltet die CAPTCHAs, die Preisportale verwenden, um den automatisierten Zugriff einzuschränken.

Wie gehe ich mit HIPAA um, wenn ich Websites im Gesundheitswesen durchsuche?

HIPAA gilt für geschützte Gesundheitsinformationen (PHI). Öffentliche Daten wie Anbieterverzeichnisse, Arzneimittelpreise und Register klinischer Studien sind keine PHI. Kratzen Sie niemals einzelne Patientenakten ab.


Verwandte Leitfäden

  • Automatisierung von Regierungsportalen
  • Scraping für akademische Forschung
  • Rotierende Residential-Proxys

Gesundheitsdaten effizient sammeln – Holen Sie sich Ihren CaptchaAI-Schlüssel und automatisieren Sie Anbieter- und Preissuchen.

Kommentare sind für diesen Artikel deaktiviert.