Use Cases

CAPTCHA Duvarlarının Arkasında Sağlık Verileri Toplama

Sağlayıcı dizinlerini, ilaç fiyatı portallarını veya klinik araştırma kayıtlarını otomatik taramak isteyen bir ekipteyseniz, sizi ilk yavaşlatan şey veri değil, sayfaların önündeki CAPTCHA duvarı olur. İyi haber şu: bu doğrulamalar bir API çağrısıyla çözülebilir; asıl mesele kazımayı kamuya açık veriyle ve KVKK sınırları içinde tutmaktır. Bu rehber, reCAPTCHA v2 ve resim CAPTCHA'sı ile korunan sağlık portallarından veriyi CaptchaAI ile nasıl toplayacağınızı — ve hangi verilere hiç dokunmamanız gerektiğini — gösterir.

Bu tür veriye ihtiyaç duyanlar genellikle sağlık teknolojisi platformları, fiyat şeffaflığı araçları ve analiz ekipleridir: ağ yeterliliği, formüler karşılaştırması veya araştırma analizi için doğru ve güncel kayıtlara ulaşmaları gerekir.

Sağlık portallarında CAPTCHA nerede karşınıza çıkar

Sağlık verisi tek bir yerde durmaz; farklı portallar farklı CAPTCHA türleriyle karşınıza çıkar. En sık rastlananlar şunlar:

Kaynak CAPTCHA türü Toplanan veri Kullanım amacı
Sağlayıcı dizinleri (NPI) Resim CAPTCHA'sı Doktor/kurum araması Ağ yeterliliği analizi
İlaç fiyatı portalları reCAPTCHA v2 İlaç fiyatları Fiyat şeffaflığı
Klinik araştırma kayıtları reCAPTCHA v2 Araştırma verileri, sonuçlar Araştırma analizi
Sigorta formülerleri reCAPTCHA v2 İlaç kapsam listeleri Formüler karşılaştırması
Eyalet lisans kurulları Resim CAPTCHA'sı Lisans doğrulama Kimlik ve yetki kontrolü
Hastane kalite puanları Cloudflare Turnstile Kalite ölçütleri Performans analizi

İş akışı: token'ı nasıl alıp gönderirsiniz

Portal ne olursa olsun mantık aynıdır:

  1. Sayfayı açın ve doğrulamanın türünü belirleyin (reCAPTCHA v2 mı, resim CAPTCHA'sı mı).
  2. reCAPTCHA v2 için sayfadaki sitekey (googlekey) ve pageurl değerlerini in.php uç noktasına gönderin.
  3. res.php üzerinden sonucu periyodik olarak sorgulayın; token hazır olana kadar bekleyin.
  4. Dönen token'ı g-recaptcha-response alanına koyup aramayı gönderin.

Resim CAPTCHA'sında ise görüntüyü base64 olarak yollar, dönen metni forma eklersiniz. Aşağıdaki sınıf bu iki durumu tek arayüzde toplar.


Sağlayıcı dizinini kazıyan Python sınıfı

HealthcareDataCollector sınıfı hem reCAPTCHA v2 hem de resim CAPTCHA'sı olan dizinleri tek arayüzle tarar; sağlayıcı araması ve ilaç fiyatı sorgusu için ayrı metotlar içerir.

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

Klinik araştırma kayıtlarını toplama

Aynı oturum mantığını klinik araştırma kayıtlarına da uygularsınız. Aşağıdaki fonksiyon, belirli bir tıbbi durum için katılımcı arayan (recruiting) çalışmaları çeker:

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

Veri gizliliği ve KVKK: neyi toplamak güvenli

Buradaki teknik iş kolay kısım; asıl sınır hukuki. Sağlayıcı dizinleri, yayımlanmış ilaç fiyatları ve klinik araştırma kayıtları kamuya açık verilerdir ve genellikle toplanmaları uygundur. Ancak bireysel hasta kayıtlarına, korumalı sağlık bilgisine (PHI) veya kimliği belirli kişilere ait verilere asla dokunmayın. Türkiye'den çalışıyorsanız, işlediğiniz her kişisel veri KVKK kapsamına girer; kazımayı yetkili bir veri toplama veya QA iş akışıyla sınırlayın ve kişisel veri işlemeniz gerekiyorsa hukuki dayanağınızı önceden netleştirin.

Veri türü Hassasiyet Öneri
Sağlayıcı dizinleri Düşük (kamuya açık) Toplanması genelde güvenli
İlaç fiyatları Düşük (kamuya açık fiyat) Şeffaflık için serbest
Klinik araştırma meta verisi Düşük (kamu kaydı) Araştırma kullanımı uygun
Hasta yorumları Orta Analizden önce anonimleştirin
Sigorta planı ayrıntıları Düşük (yayımlanmış oranlar) Karşılaştırma için serbest

Önemli: Korumalı sağlık bilgisini (PHI) toplamaya asla çalışmayın. Yalnızca kamuya açık ve kişiye özel olmayan verilere odaklanın.


Ölçeklendirme ve maliyet

CaptchaAI thread tabanlı ücretlendirir: çözüm başına değil, aynı anda açık olan thread sayısına göre ödersiniz ve her planda thread başına çözüm sınırsızdır. Tek seferlik bir formüler taraması için BASIC ($15/ay, 5 thread) genelde yeterlidir; onlarca portalı paralel tarayan sürekli bir toplama işi için ADVANCE ($90/ay, 50 thread) daha rahat çalışır. Fiyatların USD olması, TL'deki dalgalanmadan bağımsız olarak aylık maliyeti öngörülebilir kılar — bütçesini dövizle planlayan Türkiye'deki ekipler için pratik bir avantaj.

Sık karşılaşılan sorunlar ve çözümleri

Sorun Neden Çözüm
Resim CAPTCHA'sı okunamıyor Düşük görüntü kalitesi Yeniden deneyin; portal yeni görüntü üretir
Sağlayıcı araması boş dönüyor CAPTCHA aramayı engelledi Göndermeden önce CAPTCHA'yı çözün
İlaç fiyatı konuma göre değişiyor Coğrafi fiyatlandırma Proxy konumunu posta koduyla eşleştirin
Çok sayfalı aramada oturum düşüyor Portal zaman aşımı Aramaları hızlıca tamamlayın
Toplu aramada istek sınırına takılıyor Çok fazla istek İstekler arasına 5–10 saniye gecikme koyun

Sık sorulan sorular

Sağlık verisi toplarken KVKK'ya nasıl uyarım?

KVKK kişisel verileri korur. Sağlayıcı dizinleri, ilaç fiyatları ve klinik araştırma kayıtları gibi kamuya açık, kişiye özel olmayan veriler bu kapsamın dışındadır. Kimliği belirli kişilere ait veri toplamaktan kaçının; gerekiyorsa açık bir hukuki dayanakla ilerleyin.

CaptchaAI bu portallardaki hangi CAPTCHA türlerini çözer?

Sağlık portallarında en sık görülen reCAPTCHA v2, resim/OCR CAPTCHA'sı ve Cloudflare Turnstile CaptchaAI tarafından desteklenir. hCaptcha ve FunCaptcha ise desteklenmez; bir portal bunları kullanıyorsa çözüm akışına dahil edemezsiniz.

Resim CAPTCHA'sı sürekli yanlış çözülüyorsa ne yapmalıyım?

Genelde neden düşük görüntü kalitesidir. İsteği yeniden gönderin; portal yeni bir görüntü üretir ve ikinci deneme çoğu zaman geçer. Görüntüyü kırparak yalnızca CAPTCHA alanını göndermek de doğruluğu artırır.

Sağlık portallarını kazımak için hangi CaptchaAI planı yeterli?

Tek seferlik veya küçük ölçekli taramalar için BASIC ($15/ay, 5 thread) yeterlidir. Çok sayıda portalı paralel tarayacaksanız ADVANCE ($90/ay, 50 thread) daha fazla eşzamanlı çözüm sağlar. Tüm planlarda thread başına çözüm sınırsızdır.

İlaç fiyatlarını eczaneler arasında karşılaştırabilir miyim?

Evet. GoodRx gibi servisler bunu büyük ölçekte yapıyor. CaptchaAI, fiyat portallarının otomatik erişimi sınırlamak için koyduğu CAPTCHA'ları çözerek karşılaştırma verisini toplamanıza olanak tanır.


İlgili rehberler

Sağlık verisini verimli toplayın — CaptchaAI API anahtarınızı alın ve sağlayıcı ile fiyat aramalarındaki CAPTCHA'ları otomatik çözün.

Bu makale için yorumlar devre dışı bırakılmıştır.