Bloga geri dön

Cloudflare Tespitini Proxy Kullanarak Nasıl Aşarsınız?

Cloudflare, proxy üzerinden taleplerinizi engelliyor mu? Doğru TLS ayarlarından gerçek örneklerle headless tarayıcı kullanmaya kadar tespit aşamalarını aşmanın teknik yöntemlerini inceliyoruz.

📅17 Aralık 2025
```html

Proxy üzerinden Cloudflare tespitini aşmanın 7 kanıtlanmış yolu

Cloudflare, tüm web trafiğinin %20'sinden fazlasını işliyor ve botlara karşı çok katmanlı bir koruma sistemi kullanıyor. Proxy sunucuları üzerinden çalışırken, CAPTCHA veya engellenme olasılığı katlanarak artıyor. Bu kılavuzda, 2024 yılında işe yarayan tespit teknikleri ve pratik aşma yöntemlerini inceleyeceğiz.

Cloudflare proxy ve botları nasıl tespit ediyor

Cloudflare, her isteğin onlarca parametresini kontrol eden kapsamlı bir analiz sistemi kullanıyor. Tespit mekanizmalarını anlamak, korumayı başarılı bir şekilde aşmanın ilk adımıdır.

Temel tespit yöntemleri

TLS Parmak İzi: Cloudflare, SSL/TLS el sıkışma parametrelerini (şifre takımları, uzantılar, sıralama) analiz eder. Her HTTP istemcisinin benzersiz bir "parmak izi" vardır. Örneğin, Python requests, Chrome veya Firefox'tan kolayca ayırt edilebilen belirgin bir şifre seti ile OpenSSL kullanır.

Cloudflare, isteği analiz ederken TLS parmak izini belirtilen User-Agent ile karşılaştırır. Eğer Chrome 120 belirtiyorsanız ama TLS parametreleri Python requests ile eşleşiyorsa, bu anında bir bot tespiti demektir.

Kontrol Parametresi Analiz Edilenler Tespit Riski
TLS parmak izi Şifre takımları, uzantılar, TLS sürümü Yüksek
HTTP/2 parmak izi Başlık sırası, SETTINGS çerçeveleri Yüksek
IP itibar IP geçmişi, veri merkezlerine ait olma durumu Orta
JavaScript zorluğu JS yürütme, canvas parmak izi, WebGL Yüksek
Davranışsal analiz İstek kalıpları, zamanlama, fare hareketleri Orta

2023 yılından itibaren Cloudflare, davranışsal kalıpları analiz etmek için makine öğrenimini aktif olarak kullanıyor. Sistem, yalnızca teknik parametreleri değil, aynı zamanda istekler arasındaki zaman aralıklarını, kullanıcı eylemlerinin sırasını, fare hareketlerini ve sayfa kaydırmalarını da izliyor.

TLS parmak izinin maskelemesi

TLS parmak izi, bot tespitinin en etkili yöntemidir. Standart HTTP istemcileri (requests, curl, axios), gerçek bir tarayıcı ile karıştırılamayacak bir parmak izi oluşturur. Çözüm, tarayıcıların TLS davranışını taklit eden özel kütüphanelerin kullanılmasıdır.

curl-impersonate kullanımı

curl-impersonate kütüphanesi, popüler tarayıcıların TLS ve HTTP/2 parmak izlerini tam olarak kopyalayan modifiye edilmiş bir curl versiyonudur. Chrome, Firefox, Safari ve Edge'i destekler.

# curl-impersonate kurulumu
git clone https://github.com/lwthiker/curl-impersonate
cd curl-impersonate
make chrome-build

# Chrome 120 taklidi ile kullanımı
curl_chrome120 -x http://username:password@proxy.example.com:8080 \
  -H "Accept-Language: en-US,en;q=0.9" \
  https://example.com

Python: tls-client kütüphanesi

Python için, arka planda curl-impersonate kullanan ve requests'e benzer bir arayüz sunan tls-client adında bir sarmalayıcı bulunmaktadır.

import tls_client

# Chrome 120 parmak izi ile oturum oluşturma
session = tls_client.Session(
    client_identifier="chrome_120",
    random_tls_extension_order=True
)

# Proxy ayarlama
proxies = {
    'http': 'http://username:password@proxy.example.com:8080',
    'https': 'http://username:password@proxy.example.com:8080'
}

# İstek yapma
response = session.get(
    'https://example.com',
    proxies=proxies,
    headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/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'
    }
)

print(response.status_code)

Önemli: tls-client kullanırken, başlıklardaki User-Agent'in seçilen client_identifier ile eşleşmesi kritik öneme sahiptir. Uyuşmazlık, anında tespitle sonuçlanır.

TLS parmak izinin kontrolü

Parsinge başlamadan önce TLS parmak izinizi kontrol etmeniz önerilir. Analiz için tls.peet.ws veya ja3er.com hizmetlerini kullanın.

# Parmak izinin kontrolü
response = session.get('https://tls.peet.ws/api/all')
print(response.json()['tls']['ja3'])

# Gerçek Chrome parmak izi ile karşılaştırın:
# https://kawayiyi.com/tls-fingerprint-database/

HTTP başlıklarının doğru ayarlanması

Doğru TLS parmak izine sahip olsanız bile, yanlış HTTP başlıkları bir botu ifşa eder. Cloudflare, yalnızca başlıkların varlığını değil, aynı zamanda sırasını, değer formatını ve mantıksal tutarlılığını da analiz eder.

Chrome için zorunlu başlıklar

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;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',
    'Sec-Fetch-Dest': 'document',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Site': 'none',
    'Sec-Fetch-User': '?1',
    'Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
    'Sec-Ch-Ua-Mobile': '?0',
    'Sec-Ch-Ua-Platform': '"Windows"',
    'Cache-Control': 'max-age=0'
}

Sec-Ch-Ua-* başlıkları Chrome 89'da ortaya çıkmış ve Client Hints API'nin bir parçasıdır. Modern bir User-Agent kullanırken bunların yokluğu, açık bir bot işareti olarak kabul edilir.

Başlık sırası önemlidir

HTTP/2'de başlık sırası her tarayıcı için sabittir. Python requests ve diğer standart istemciler, başlıkları alfabetik sırayla gönderir, bu da tarayıcıların davranışından farklıdır. Özel başlık sırası desteği olan kütüphaneler kullanın.

İpucu: Gerçek bir tarayıcının başlıklarının tam bir kopyasını almak için tarayıcı DevTools'u kullanın (Ağ sekmesi → isteğe sağ tıklayın → Kopyala → cURL olarak kopyala). Ardından, bunları kodunuza uyarlayın.

User-Agent'in dinamik olarak üretilmesi

Tüm istekler için aynı User-Agent kullanmak, tespit riskini artırır. Güncel User-Agent'lerin bir havuzunu oluşturun ve bunları döndürün.

import random

# Güncel User-Agent havuzu (Aralık 2024)
USER_AGENTS = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
]

def get_random_headers():
    ua = random.choice(USER_AGENTS)
    
    # Seçilen UA'ya göre diğer başlıkları uyarlama
    if 'Chrome' in ua:
        return {
            'User-Agent': ua,
            'Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120"',
            # ... diğer Chrome başlıkları
        }
    elif 'Firefox' in ua:
        return {
            'User-Agent': ua,
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            # ... Firefox başlıkları
        }
    # ... diğer tarayıcılar için işleme

Headless tarayıcıların kullanımı

Cloudflare JavaScript zorluğu veya gelişmiş tespit kullandığında, güvenilir bir aşma yöntemi gerçek bir tarayıcıdır. Headless tarayıcılar, JavaScript'i, çerezleri otomatik olarak işler ve tamamen otantik bir parmak izi oluşturur.

Anti-detect yamanları ile Playwright

Playwright, Selenium'a modern bir alternatif olup daha iyi performans sunar. Ancak, standart Playwright, navigator.webdriver ve diğer işaretler aracılığıyla kolayca tespit edilebilir. Maskeleme için playwright-stealth kullanın.

from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync

def bypass_cloudflare(url, proxy):
    with sync_playwright() as p:
        browser = p.chromium.launch(
            headless=True,
            proxy={
                "server": f"http://{proxy['host']}:{proxy['port']}",
                "username": proxy['username'],
                "password": proxy['password']
            },
            args=[
                '--disable-blink-features=AutomationControlled',
                '--disable-dev-shm-usage',
                '--no-sandbox'
            ]
        )
        
        context = browser.new_context(
            viewport={'width': 1920, 'height': 1080},
            user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
            locale='en-US',
            timezone_id='America/New_York'
        )
        
        page = context.new_page()
        stealth_sync(page)  # Anti-detect yamalarının uygulanması
        
        # Sayfaya git
        page.goto(url, wait_until='networkidle', timeout=30000)
        
        # Cloudflare zorluğunu geçmek için bekleme (genellikle 5-10 saniye)
        page.wait_for_timeout(8000)
        
        # Başarılı bir aşma kontrolü
        if 'Just a moment' in page.content():
            print('Cloudflare zorluğu geçilemedi')
            return None
        
        # Gelecek kullanım için çerezleri çıkarma
        cookies = context.cookies()
        html = page.content()
        
        browser.close()
        return {'html': html, 'cookies': cookies}

# Kullanım
proxy_config = {
    'host': 'proxy.example.com',
    'port': 8080,
    'username': 'user',
    'password': 'pass'
}

result = bypass_cloudflare('https://example.com', proxy_config)

Eklentiler ile Puppeteer Extra

Node.js ekosistemi için en iyi çözüm, puppeteer-extra ve puppeteer-extra-plugin-stealth eklentisidir. Bu eklenti, 30'dan fazla farklı otomasyon maskeleme tekniği uygular.

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

puppeteer.use(StealthPlugin());

async function bypassCloudflare(url, proxyUrl) {
    const browser = await puppeteer.launch({
        headless: 'new',
        args: [
            `--proxy-server=${proxyUrl}`,
            '--disable-blink-features=AutomationControlled',
            '--window-size=1920,1080'
        ]
    });
    
    const page = await browser.newPage();
    
    // Görünüm ve kullanıcı ajanı ayarlama
    await page.setViewport({ width: 1920, height: 1080 });
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
    
    // navigator.webdriver'ı geçersiz kılma
    await page.evaluateOnNewDocument(() => {
        delete Object.getPrototypeOf(navigator).webdriver;
    });
    
    // Sayfaya git
    await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });
    
    // Zorluğun geçmesini bekleme
    await page.waitForTimeout(8000);
    
    // İçeriği ve çerezleri alma
    const content = await page.content();
    const cookies = await page.cookies();
    
    await browser.close();
    
    return { content, cookies };
}

// Örnek kullanım
bypassCloudflare('https://example.com', 'http://user:pass@proxy.example.com:8080')
    .then(result => console.log('Başarılı'))
    .catch(err => console.error(err));

Performans: Headless tarayıcılar, önemli ölçüde daha fazla kaynak tüketir (200-500 MB RAM birim başına). Yüksek yük altında, bunları yalnızca çerez almak için kullanın, ardından bu çerezlerle HTTP istemcilerine geçin.

Cloudflare'ı aşmak için proxy türünün seçimi

Proxy türü, aşmanın başarısını kritik şekilde etkiler. Cloudflare, veri merkezi IP adresleri için veri tabanları tutar ve bunlara daha sıkı kontrol kuralları uygular.

Proxy Türü Aşma Olasılığı Hız Maliyet Tavsiye
Veri Merkezi %30-40 Yüksek Düşük Yalnızca headless tarayıcılarla
Konut %85-95 Orta Yüksek Optimal seçim
Mobil %90-98 Orta Çok yüksek Kritik görevler için
ISP (Statik Konut) %80-90 Yüksek Orta Fiyat ve kalite dengesi

Neden konut proxy'leri daha etkilidir

Konut proxy'leri, gerçek cihazların (ev yönlendiricileri, akıllı telefonlar) IP adreslerini kullanır. Cloudflare, bu tür IP'leri topluca engelleyemez, çünkü bu, normal kullanıcıları da engeller. İstatistikler, konut IP'lerinin, veri merkezlerine göre CAPTCHA alma oranının 15-20 kat daha düşük olduğunu göstermektedir.

Konut proxy'leri ile çalışırken, coğrafi konum kritik öneme sahiptir. Hedef site ABD'ye odaklanıyorsa, Asya'dan proxy kullanmak şüphe uyandırır. Geniş bir coğrafyaya sahip ve şehir bazında hedefleme imkanı sunan sağlayıcıları tercih edin.

Maksimum güvenilirlik için mobil proxy'ler

Mobil proxy'ler, mobil operatörlerin (4G/5G) IP adreslerini kullanır. Mobil ağların özelliği, uçak moduna geçerek IP'nin dinamik olarak değiştirilmesidir; bu da neredeyse sınırsız sayıda temiz IP adresi sağlar. Mobil IP'nin engellenme olasılığı neredeyse sıfıra yakındır.

# API üzerinden mobil IP döndürme örneği
import requests
import time

def rotate_mobile_ip(proxy_api_url):
    """Mobil proxy IP'sini değiştirme"""
    response = requests.get(f"{proxy_api_url}/rotate")
    if response.status_code == 200:
        print("IP başarıyla değiştirildi")
        time.sleep(5)  # Değişikliklerin uygulanmasını bekleme
        return True
    return False

# Mobil proxy ile kullanım
mobile_proxy = "http://user:pass@mobile.proxy.com:8080"

for i in range(10):
    # İstek yapma
    response = requests.get(
        'https://example.com',
        proxies={'http': mobile_proxy, 'https': mobile_proxy}
    )
    
    # Her istektan sonra IP döndürme
    rotate_mobile_ip('https://api.proxy.com/mobile')

Çerezler ve oturumların yönetimi

Cloudflare zorluğunu başarıyla geçtikten sonra, sunucu çerezler (cf_clearance, __cfduid ve diğerleri) ayarlar; bu çerezler, istemcinin meşruluğunu doğrular. Bu çerezlerin doğru yönetimi, tekrar kontrol edilmesini önler.

cf_clearance'ın çıkarılması ve yeniden kullanılması

cf_clearance çerezi genellikle 30-60 dakika geçerlidir. Headless tarayıcı aracılığıyla alındıktan sonra, normal HTTP isteklerinde kullanılabilir.

import requests
import pickle
from datetime import datetime, timedelta

class CloudflareCookieManager:
    def __init__(self, cookie_file='cf_cookies.pkl'):
        self.cookie_file = cookie_file
        self.cookies = self.load_cookies()
    
    def load_cookies(self):
        """Kaydedilen çerezleri yükleme"""
        try:
            with open(self.cookie_file, 'rb') as f:
                data = pickle.load(f)
                # Süre kontrolü
                if data['expires'] > datetime.now():
                    return data['cookies']
        except FileNotFoundError:
            pass
        return None
    
    def save_cookies(self, cookies, ttl_minutes=30):
        """TTL ile çerezleri kaydetme"""
        data = {
            'cookies': cookies,
            'expires': datetime.now() + timedelta(minutes=ttl_minutes)
        }
        with open(self.cookie_file, 'wb') as f:
            pickle.dump(data, f)
    
    def get_cf_clearance(self, url, proxy):
        """Tarayıcı aracılığıyla cf_clearance alma"""
        if self.cookies:
            return self.cookies
        
        # Burada tarayıcıyı başlatma kodu (önceki bölümden)
        # ...
        browser_cookies = bypass_cloudflare(url, proxy)['cookies']
        
        # requests formatına dönüştürme
        cookies_dict = {c['name']: c['value'] for c in browser_cookies}
        self.save_cookies(cookies_dict)
        self.cookies = cookies_dict
        
        return cookies_dict
    
    def make_request(self, url, proxy):
        """Otomatik çerez yönetimi ile istek yapma"""
        cookies = self.get_cf_clearance(url, proxy)
        
        response = requests.get(
            url,
            cookies=cookies,
            proxies={'http': proxy, 'https': proxy},
            headers=get_random_headers()
        )
        
        # Eğer tekrar zorluk alırsak — çerezleri güncelle
        if response.status_code == 403 or 'cf-browser-verification' in response.text:
            print("Çerezler süresi dolmuş, yenilerini alıyoruz...")
            self.cookies = None
            return self.make_request(url, proxy)
        
        return response

# Kullanım
manager = CloudflareCookieManager()
response = manager.make_request(
    'https://example.com/api/data',
    'http://user:pass@proxy.example.com:8080'
)

Çerezlerin IP adresine bağlanması

Cloudflare, cf_clearance'ı zorluğun geçtiği IP adresine bağlar. Bu çerezi başka bir IP ile kullanmak engellemeye yol açar. Döngüsel proxy'lerle çalışırken, her IP için ayrı bir çerez seti saklamak gerekir.

import hashlib

class IPBoundCookieManager:
    def __init__(self):
        self.cookies_by_ip = {}
    
    def get_ip_hash(self, proxy_url):
        """Proxy'yi tanımlamak için hash oluşturma"""
        return hashlib.md5(proxy_url.encode()).hexdigest()
    
    def get_cookies_for_proxy(self, proxy_url, target_url):
        """Belirli bir proxy için çerez alma"""
        ip_hash = self.get_ip_hash(proxy_url)
        
        if ip_hash in self.cookies_by_ip:
            cookies_data = self.cookies_by_ip[ip_hash]
            if cookies_data['expires'] > datetime.now():
                return cookies_data['cookies']
        
        # Tarayıcı aracılığıyla yeni çerezler alma
        new_cookies = self.fetch_cookies_with_browser(target_url, proxy_url)
        
        self.cookies_by_ip[ip_hash] = {
            'cookies': new_cookies,
            'expires': datetime.now() + timedelta(minutes=30)
        }
        
        return new_cookies

Proxy döngüsü ve istek sıklığı kontrolü

Doğru teknik yığın ile bile, bir IP'den çok yüksek istek sıklığı, rate limiting'i tetikler. Cloudflare, trafik kalıplarını analiz eder ve anormal etkinlikleri tespit eder.

Proxy döndürme stratejileri

Üç temel döndürme yaklaşımı vardır: round-robin (sıralı), random (rastgele) ve sticky sessions (oturum bağlama). Cloudflare'ı aşmak için, IP başına istekleri sınırlayarak sticky sessions stratejisi en uygunudur.

import time
import random
from collections import defaultdict
from datetime import datetime, timedelta

class SmartProxyRotator:
    def __init__(self, proxy_list, max_requests_per_ip=20, cooldown_minutes=10):
        self.proxy_list = proxy_list
        self.max_requests_per_ip = max_requests_per_ip
        self.cooldown_minutes = cooldown_minutes
        
        # Kullanım sayacı
        self.usage_count = defaultdict(int)
        self.last_used = {}
        self.cooldown_until = {}
    
    def get_proxy(self):
        """Bir sonraki mevcut proxy'yi alma"""
        available_proxies = []
        
        for proxy in self.proxy_list:
            # Soğuma kontrolü
            if proxy in self.cooldown_until:
                if datetime.now() < self.cooldown_until[proxy]:
                    continue
                else:
                    # Soğuma süresi dolduğunda sayacı sıfırlama
                    self.usage_count[proxy] = 0
                    del self.cooldown_until[proxy]
            
            # İstek limiti kontrolü
            if self.usage_count[proxy] < self.max_requests_per_ip:
                available_proxies.append(proxy)
        
        if not available_proxies:
            # Tüm proxy'ler soğuma süresindeyse — bekleyin
            wait_time = min(
                (self.cooldown_until[p] - datetime.now()).total_seconds()
                for p in self.cooldown_until
            )
            print(f"Tüm proxy'ler soğuma süresinde. {wait_time:.0f} saniye bekleniyor...")
            time.sleep(wait_time + 1)
            return self.get_proxy()
        
        # En az kullanılan proxy'yi seçme
        proxy = min(available_proxies, key=lambda p: self.usage_count[p])
        
        self.usage_count[proxy] += 1
        self.last_used[proxy] = datetime.now()
        
        # Limite ulaşıldığında soğuma süresi ayarlama
        if self.usage_count[proxy] >= self.max_requests_per_ip:
            self.cooldown_until[proxy] = datetime.now() + timedelta(
                minutes=self.cooldown_minutes
            )
            print(f"{proxy} proxy'si limite ulaştı. {self.cooldown_minutes} dakikalık soğuma süresi.")
        
        return proxy
    
    def add_delay(self):
        """İstekler arasında rastgele gecikme (insan taklidi)"""
        delay = random.uniform(2, 5)  # 2-5 saniye
        time.sleep(delay)

# Kullanım
proxy_pool = [
    'http://user:pass@proxy1.example.com:8080',
    'http://user:pass@proxy2.example.com:8080',
    'http://user:pass@proxy3.example.com:8080',
    # ... 50-100 proxy için stabil çalışma
]

rotator = SmartProxyRotator(
    proxy_pool,
    max_requests_per_ip=15,  # Muhafazakar değer
    cooldown_minutes=15
)

# İstekleri gerçekleştirme
for i in range(1000):
    proxy = rotator.get_proxy()
    
    response = requests.get(
        'https://example.com/page',
        proxies={'http': proxy, 'https': proxy},
        headers=get_random_headers()
    )
    
    print(f"İstek {i+1}: {response.status_code}")
    rotator.add_delay()

Adaptif rate limiting

Daha gelişmiş bir yaklaşım, sunucu yanıtlarına dayalı olarak istek sıklığını dinamik olarak ayarlamaktır. Eğer 429 hataları veya CAPTCHA'lar ortaya çıkmaya başlarsa, otomatik olarak hızı azaltın.

class AdaptiveRateLimiter:
    def __init__(self, initial_delay=3.0):
        self.delay = initial_delay
        self.min_delay = 1.0
        self.max_delay = 30.0
        self.success_streak = 0
        self.failure_streak = 0
    
    def on_success(self):
        """Başarılı istek — hızlanabiliriz"""
        self.success_streak += 1
        self.failure_streak = 0
        
        if self.success_streak >= 10:
            # Gecikmeyi %10 azalt
            self.delay = max(self.min_delay, self.delay * 0.9)
            self.success_streak = 0
    
    def on_failure(self, status_code):
        """Hata — yavaşlayalım"""
        self.failure_streak += 1
        self.success_streak = 0
        
        if status_code == 429:  # Rate limit
            # Agresif yavaşlama
            self.delay = min(self.max_delay, self.delay * 2.0)
        elif status_code == 403:  # Olası engelleme
            self.delay = min(self.max_delay, self.delay * 1.5)
        
        print(f"Gecikme {self.delay:.2f}s'ye çıkarıldı")
    
    def wait(self):
        """Bir sonraki isteği bekleme"""
        # Rastgelelik ekleyin ±%20
        actual_delay = self.delay * random.uniform(0.8, 1.2)
        time.sleep(actual_delay)

Aşma için hazır araçlar ve kütüphaneler

Sıfırdan kendi çözümünüzü geliştirmek zaman ve uzmanlık gerektirir. Cloudflare'ı aşmayı otomatikleştiren hazır araçlar mevcuttur.

cloudscraper (Python)

cloudscraper kütüphanesi, JavaScript zorluklarını otomatik olarak çözen requests üzerine bir üst yapıdır. Temel korumalarla çalışır, ancak gelişmiş kontrollerle başa çıkamayabilir.

import cloudscraper

# Proxy desteği ile scraper oluşturma
scraper = cloudscraper.create_scraper(
    browser={
        'browser': 'chrome',
        'platform': 'windows',
        'desktop': True
    }
)

# Proxy ayarlama
proxies = {
    'http': 'http://user:pass@proxy.example.com:8080',
    'https': 'http://user:pass@proxy.example.com:8080'
}

# İstek yapma
response = scraper.get('https://example.com', proxies=proxies)

if response.status_code == 200:
    print("Başarılı aşma")
    print(response.text)
else:
    print(f"Hata: {response.status_code}")

FlareSolverr (evrensel)

FlareSolverr, Cloudflare zorluklarını çözmek için headless tarayıcıyı çalıştıran bir proxy sunucusudur. HTTP API aracılığıyla çalışır ve herhangi bir programlama dilini destekler.

# FlareSolverr'ı Docker üzerinden çalıştırma
docker run -d \
  --name=flaresolverr \
  -p 8191:8191 \
  -e LOG_LEVEL=info \
  ghcr.io/flaresolverr/flaresolverr:latest

# Python'dan kullanım
import requests

def solve_cloudflare(url, proxy=None):
    flaresolverr_url = "http://localhost:8191/v1"
    
    payload = {
        "cmd": "request.get",
        "url": url,
        "maxTimeout": 60000
    }
    
    if proxy:
        payload["proxy"] = {
            "url": proxy
        }
    
    response = requests.post(flaresolverr_url, json=payload)
    result = response.json()
    
    if result['status'] == 'ok':
        return {
            'html': result['solution']['response'],
            'cookies': result['solution']['cookies'],
            'user_agent': result['solution']['userAgent']
        }
    else:
        raise Exception(f"FlareSolverr hatası: {result['message']}")

# Örnek kullanım
result = solve_cloudflare(
    'https://example.com',
    proxy='http://user:pass@proxy.example.com:8080'
)

print(result['html'])

undetected-chromedriver

Selenium ChromeDriver'ın yamalanmış bir versiyonu olup, otomatik olarak birçok anti-detect tekniği uygular. Playwright'tan daha kolay kullanılır, ancak daha az esneklik sunar.

import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def bypass_with_uc(url, proxy):
    options = uc.ChromeOptions()
    options.add_argument(f'--proxy-server={proxy}')
    options.add_argument('--disable-blink-features=AutomationControlled')
    
    driver = uc.Chrome(options=options, version_main=120)
    
    try:
        driver.get(url)
        
        # Cloudflare zorluğunun kaybolmasını bekleme
        WebDriverWait(driver, 20).until_not(
            EC.presence_of_element_located((By.ID, "cf-spinner-please-wait"))
        )
        
        # Güvenilirlik için ek bekleme
        time.sleep(3)
        
        # Sonucu alma
        html = driver.page_source
        cookies = driver.get_cookies()
        
        return {'html': html, 'cookies': cookies}
    
    finally:
        driver.quit()

# Kullanım
result = bypass_with_uc(
    'https://example.com',
    'http://user:pass@proxy.example.com:8080'
)

Kombine yaklaşım: Optimal strateji, çerezleri ilk olarak almak için headless tarayıcı kullanmak, ardından bu çerezlerle HTTP istemcilerine geçmektir. Bu, güvenilirlik ve performans arasında bir denge sağlar.

Sonuç

Proxy üzerinden Cloudflare'ı aşmak, doğru TLS parmak izi, otantik HTTP başlıkları, kaliteli proxy'ler ve iyi bir oturum yönetimi gerektiren karmaşık bir yaklaşımdır. Anahtar öneriler:

  • Konut veya mobil proxy'ler kullanın, veri merkezleri yerine
  • Doğru TLS parmak izi (tls-client, curl-impersonate) ile kütüphaneler kullanın
  • Gelişmiş durumlar için anti-detect yamaları ile headless tarayıcılar kullanın
  • cf_clearance çerezlerini saklayın ve yeniden kullanın
  • Rate limiting'i dikkate alarak proxy'leri döndürün (IP başına 15-20 istekten fazla değil)
  • İstekler arasında rastgele gecikmeler ekleyin (2-5 saniye)

Cloudflare koruması sürekli evrim geçiriyor, bu nedenle araçları düzenli olarak güncellemek ve stratejileri uyarlamak önemlidir. Parmak izi tekniklerindeki değişiklikleri izleyin ve çözümleri güncel koruma sürümlerinde test edin.

Stabil çalışma için geniş bir IP havuzuna ve otomatik döndürmeye sahip profesyonel proxy hizmetleri kullanmanız önerilir.

```