Explainers

CAPTCHA için Proxy Rotasyonu: Konut IP'leriyle En İyi Uygulamalar

Geçerli bir token'ın neden reddedildiğini merak ediyorsanız cevap çoğu zaman tek bir ayrıntıda saklıdır: CAPTCHA'yı çözerken kullandığınız IP ile formu gönderdiğiniz IP birbirinden farklıdır. Doğru proxy rotasyonu bu tuzağı ortadan kaldırır ve doğrulama sıklığını belirgin biçimde düşürür — gerisini CaptchaAI çözer. Konut sınıfı IP havuzlarıyla çalışan iş akışlarında isabetli bir rotasyon stratejisi, CAPTCHA oranlarını %50–80 aralığında azaltabilir.

Bu rehberde üç konuyu netleştireceğiz:

  • Hangi IP türünün en az doğrulama tetiklediğini ve nedenini.
  • Hangi rotasyon deseninin hangi iş yüküne uygun olduğunu.
  • CaptchaAI'yi proxy iş akışınıza nasıl bağlayacağınızı.

Konut IP'leri neden daha az CAPTCHA tetikler?

Proxy türü IP kaynağı CAPTCHA oranı Nedeni
Veri merkezi Bulut/hosting sağlayıcı Yüksek (%30–70) IP aralıkları bilinir ve işaretlenir
Konut Gerçek ev İSS'leri Düşük (%5–15) Gerçek kullanıcı gibi görünür
Mobil Hücresel operatörler Çok düşük (%1–5) Binlerce abone aynı IP'yi paylaşır
İSS Statik konut sınıfı Düşük (%5–10) Hız ve güveni birleştirir

CAPTCHA sistemleri (özellikle reCAPTCHA) gelen isteğin IP itibarını veritabanlarında sorgular. Bu itibarı belirleyen başlıca sinyaller şunlardır:

  • IP'nin hangi otonom sisteme (ASN) ait olduğu — veri merkezi mi, gerçek bir İSS mi.
  • Geçmişte bot trafiği üretip üretmediği.
  • Coğrafi konumun beklenen kullanıcı kitlesiyle tutarlı olup olmadığı.

Gerçek İSS'lere ait konut IP'leri gerçek abonelere tahsis edildiği için temiz bir geçmişe sahiptir ve bu yüzden daha az doğrulama tetikler.


Proxy rotasyon stratejileri

Rotasyon stratejinizi iş yükünüz belirler: çok sayıda bağımsız sayfayı mı geziyorsunuz, yoksa oturum sürekliliği gerektiren çok adımlı bir formu mu dolduruyorsunuz? Aşağıdaki üç desen bu iki uç arasındaki dengeyi kurar.

1. İstek başına rotasyon (varsayılan)

import requests

proxies = {
    "http": "http://user:pass@gateway.proxy.com:7777",
    "https": "http://user:pass@gateway.proxy.com:7777",
}

# Each request gets a new IP
for url in urls:
    resp = requests.get(url, proxies=proxies, timeout=30)
    # New IP after each request
  • En uygun senaryo: farklı sitelerdeki çok sayıda sayfayı tek tek gezmek.
  • CAPTCHA riski: istek başına düşüktür, ancak oturum sürekliliği sağlanamaz.

2. Sabit oturum rotasyonu

import random
import string

def get_sticky_session(duration_min=10):
    session_id = "".join(random.choices(string.ascii_lowercase, k=8))
    return {
        "http": f"http://user-session-{session_id}:pass@gateway.proxy.com:7777",
        "https": f"http://user-session-{session_id}:pass@gateway.proxy.com:7777",
    }

# Same IP for the whole CAPTCHA workflow
session_proxy = get_sticky_session(duration_min=10)

# Step 1: Load page
resp = requests.get("https://staging.example.com/qa-form", proxies=session_proxy)

# Step 2: Solve CAPTCHA (same IP)
token = solve_captcha("https://staging.example.com/qa-form", sitekey)

# Step 3: Submit (same IP — required for token validity)
resp = requests.post("https://target.com/submit", proxies=session_proxy, data={
    "g-recaptcha-response": token,
})
  • En uygun senaryo: CAPTCHA korumalı formlar ve çok adımlı iş akışları.
  • CAPTCHA riski: çok düşüktür — tutarlı IP zamanla güven oluşturur.

3. Alan adı başına rotasyon

domain_sessions = {}

def get_domain_proxy(domain):
    """Same IP per domain, different IP per domain."""
    if domain not in domain_sessions:
        session_id = "".join(random.choices(string.ascii_lowercase, k=8))
        domain_sessions[domain] = get_sticky_session()
    return domain_sessions[domain]

# site-a.com always uses the same IP
proxy_a = get_domain_proxy("site-a.com")
# site-b.com gets a different IP
proxy_b = get_domain_proxy("site-b.com")

Bu desen iki avantajı birleştirir:

  • Her alan adı kendi sabit IP'sini korur; böylece site bazında tutarlı bir kimlik oluşur.
  • Farklı hedeflere farklı IP'ler dağıtılır, tek bir havuz aşırı yüklenmez.

Üretimde işe yarayan uygulamalar

Doğru rotasyon deseni tek başına yeterli değildir; havuzdan en yüksek verimi almak için isteklerinizin de gerçek bir kullanıcı gibi görünmesi gerekir. Aşağıdaki beş uygulama bu farkı yaratır:

  • Coğrafyayı hedefe eşleyin.
  • İstek hızını insan temposuna yaklaştırın.
  • Gerçekçi HTTP başlıkları gönderin.
  • IP engellerini kontrollü yönetin.
  • Yeni IP'leri ısıtın.

1. Coğrafyayı hedefle eşleştirin

# Target site is US-based? Use US residential IP
us_proxy = "http://user-country-us:pass@gateway.proxy.com:7777"

# Target is Germany? Use DE residential IP
de_proxy = "http://user-country-de:pass@gateway.proxy.com:7777"

Coğrafi olarak eşleşmeyen IP'ler daha fazla CAPTCHA tetikler. Örneğin Türkiye'de barındırılan bir e-ticaret staging ortamını test ederken TR veya yakın bir AB bölgesinden IP seçmek, uzak bir kıtadan bağlanmaya kıyasla belirgin biçimde daha az doğrulama üretir; Europe/Istanbul saat dilimi ve tr-TR yerel ayarıyla uyumlu bir profil bu tutarlılığı pekiştirir.

2. İstek hızını insan temposuna yaklaştırın

import time
import random

def human_pace_requests(urls, proxy):
    results = []
    for url in urls:
        resp = requests.get(url, proxies=proxy, timeout=30)
        results.append(resp)

        # Random delay between requests
        delay = random.uniform(2, 8)
        time.sleep(delay)

    return results
Hız CAPTCHA riski
Saniyede 1 istek Yüksek (bot deseni)
5–10 sn'de 1 istek Orta
10–30 sn'de 1 istek Düşük (insana yakın)
Rastgele 3–15 sn Çok düşük

3. Gerçekçi HTTP başlıkları gönderin

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/126.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "DNT": "1",
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1",
}

resp = requests.get(url, proxies=proxy, headers=headers)

Öne çıkan üç başlık pratikte fark yaratır:

  • User-Agent: güncel bir tarayıcı sürümüyle eşleşmeli, jenerik istemci imzaları bırakmamalı.
  • Accept-Language: hedef bölgeyle uyumlu olmalı (tr-TR sitesi için Türkçe dil tercihi mantıklıdır).
  • Accept-Encoding: gerçek tarayıcılarda daima gönderilir; eksikliği isteği anında öne çıkarır.

4. IP engellerini kontrollü yönetin

def fetch_with_retry(url, max_retries=3):
    for attempt in range(max_retries):
        # New proxy for each retry
        proxy = get_sticky_session()

        try:
            resp = requests.get(url, proxies=proxy, timeout=30)

            if resp.status_code == 403:
                print(f"IP banned, rotating... (attempt {attempt + 1})")
                time.sleep(5)
                continue

            if resp.status_code == 429:
                print(f"Rate limited, backing off...")
                time.sleep(30)
                continue

            return resp

        except requests.exceptions.ProxyError:
            print(f"Proxy failed, rotating...")
            continue

    raise Exception(f"Failed after {max_retries} retries")

Durum kodlarını ayrı ele alın: 403 genellikle IP'nin engellendiğini gösterir ve rotasyon gerektirir; 429 ise hız sınırıdır ve üstel geri çekilme (exponential backoff) ile beklemek daha doğrudur.

5. Yeni IP'leri ısıtın

def warm_up_proxy(proxy):
    """Visit neutral sites before target to build session trust."""
    warm_urls = [
        "https://www.google.com",
        "https://www.wikipedia.org",
    ]
    for url in warm_urls:
        try:
            requests.get(url, proxies=proxy, timeout=15)
            time.sleep(random.uniform(2, 5))
        except Exception:
            pass

Yeni bir IP'yi doğrudan CAPTCHA korumalı hedefe sürmek yerine önce birkaç nötr sitede gezdirmek, oturuma daha doğal bir geçmiş kazandırır ve ilk denemedeki doğrulama olasılığını düşürür.


CaptchaAI entegrasyon deseni

Proxy rotasyonu doğrulama sıklığını düşürür; kalan CAPTCHA'ları ise API'ye devredersiniz. Aşağıdaki desen, sabit oturumla açılan sayfadan sitekey'i çıkarır, CaptchaAI'ye gönderir ve dönen token'ı aynı IP üzerinden formla birlikte iletir.

import requests
import time
import re
import random
import string

CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"


def solve_recaptcha(site_url, sitekey):
    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": site_url,
        "json": 1,
    })
    task_id = resp.json()["request"]

    for _ in range(60):
        time.sleep(5)
        resp = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY, "action": "get",
            "id": task_id, "json": 1,
        })
        data = resp.json()
        if data["request"] != "CAPCHA_NOT_READY":
            return data["request"]

    raise TimeoutError("Timeout")


def scrape_url(url, proxy_config):
    """Complete scrape with proxy + CAPTCHA solving."""
    session_id = "".join(random.choices(string.ascii_lowercase, k=8))
    proxy = {
        "http": f"http://user-session-{session_id}:{proxy_config['pass']}@{proxy_config['host']}",
        "https": f"http://user-session-{session_id}:{proxy_config['pass']}@{proxy_config['host']}",
    }

    resp = requests.get(url, proxies=proxy, timeout=30)

    match = re.search(r'data-sitekey="([^"]+)"', resp.text)
    if match:
        token = solve_recaptcha(url, match.group(1))
        resp = requests.post(
            url.replace("/form", "/submit"),
            proxies=proxy,
            data={"g-recaptcha-response": token},
        )

    return resp.text

Sorun giderme

Konut IP havuzuyla çalışırken en sık karşılaşılan beş sorun ve pratik çözümleri:

Sorun Sebep Çözüm
Her sayfada CAPTCHA çıkıyor Zayıf IP havuzu Proxy sağlayıcısını veya bölgeyi değiştirin
Token reddediliyor Çözüm ile gönderim arasında IP değişti Sabit oturum kullanın
407 hataları Kimlik doğrulama biçimi hatalı Sağlayıcının tam kullanıcı adı biçimini doğrulayın
Yavaş yanıtlar Ağ geçidi aşırı yüklü Yoğun olmayan saatleri veya farklı bir uç noktayı deneyin
Oturum iş akışı ortasında bitiyor Sabit oturum TTL'i çok kısa Daha uzun oturum süresi isteyin

Maliyeti kontrol altında tutma

Havuz kaliteniz stabil hale geldiğinde odak maliyete kayar. Aşağıdaki dört kaldıraç, konut IP ve CAPTCHA harcamalarını birlikte düşürür:

Strateji Etkisi
Konut IP'lerini yalnızca CAPTCHA yoğun sitelere ayırın Tümünü konut sınıfında çalıştırmaya kıyasla %50–70 tasarruf
Oturum ısıtmayla CAPTCHA sıklığını düşürün Daha az CaptchaAI çağrısı
CAPTCHA korumalı sayfalardan önce sıradan sayfaları toplu gezin Daha az sabit oturum ihtiyacı
IP kalitesini izleyip zayıf havuzları eleyin İlk denemede daha yüksek başarı

CaptchaAI thread bazlı ücretlendirir ve her planda thread başına sınırsız çözüm sunar; düşük hacimli QA testleri için BASIC planı ($15/ay, 5 thread) çoğu zaman yeterlidir. TL kurundaki oynaklık göz önüne alındığında, aylık maliyeti USD üzerinden öngörülebilir tutan bu model Türkiye'deki ekipler için somut bir avantajdır. Kişisel veri topladığınız senaryolarda kazınan verinin KVKK kapsamına girebileceğini unutmayın ve çalışmayı yetkili QA/veri toplama akışlarıyla sınırlayın.


SSS

Geçerli token'ım neden reddediliyor?

En sık neden, CAPTCHA'yı çözdüğünüz IP ile formu gönderdiğiniz IP'nin farklı olmasıdır. Sayfa yüklemesinden token gönderimine kadar aynı IP'yi koruyun; görevi bitirdikten sonra rotasyona devam edin.

Türkiye'deki bir siteyi test ederken hangi bölgeden IP seçmeliyim?

Hedef altyapıya en yakın bölgeyi seçin. Türkiye'de barındırılan bir site için TR veya yakın AB bölgesi IP'leri, uzak coğrafyalara kıyasla daha az doğrulama tetikler.

Proxy kimlik bilgilerimi CaptchaAI'ye vermem gerekir mi?

Hayır. CaptchaAI yalnızca sitekey ve pageurl gibi CAPTCHA parametrelerini alır; isteği kendi proxy'niz üzerinden siz gönderirsiniz. Proxy kimlik bilgileriniz sizde kalır.

CaptchaAI hangi CAPTCHA türlerini çözer?

reCAPTCHA v2 ve v3, Cloudflare Turnstile, GeeTest (v3) ile görüntü/OCR tabanlı CAPTCHA'ları çözer. hCaptcha ve FunCaptcha desteklenmez; GeeTest v4 için çözüm çok yakında sunulacak.


İlgili rehberler


Proxy iş akışınızdaki CAPTCHA'ları otomatikleştirin — CaptchaAI anahtarınızı alın ve gerisini API'ye bırakın.

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