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:
- Sayfayı açın ve doğrulamanın türünü belirleyin (reCAPTCHA v2 mı, resim CAPTCHA'sı mı).
- reCAPTCHA v2 için sayfadaki
sitekey(googlekey) vepageurldeğerleriniin.phpuç noktasına gönderin. res.phpüzerinden sonucu periyodik olarak sorgulayın; token hazır olana kadar bekleyin.- Dönen token'ı
g-recaptcha-responsealanı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
- Devlet portallarında CAPTCHA otomasyonu
- Akademik araştırma verisi kazıma
- Proxy rotasyonu ve CAPTCHA çözümü
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.