Yapışkan oturumlar belirli bir süre boyunca aynı IP'yi korur. Dönüşümlü oturumlar istek başına yeni bir IP atar. Yanlış olanı seçmek CAPTCHA oranlarını şişirir ve API kredilerinin boşa harcanmasına neden olur.
Her Mod Nasıl Çalışır?
STICKY SESSION:
Request 1 ──▶ IP: 192.168.1.50 ──▶ site.com/login
Request 2 ──▶ IP: 192.168.1.50 ──▶ site.com/dashboard
Request 3 ──▶ IP: 192.168.1.50 ──▶ site.com/account
(Same IP for all requests in the session window)
ROTATING SESSION:
Request 1 ──▶ IP: 192.168.1.50 ──▶ site.com/page1
Request 2 ──▶ IP: 10.0.0.77 ──▶ site.com/page2
Request 3 ──▶ IP: 172.16.5.22 ──▶ site.com/page3
(Different IP per request)
Bire Bir Karşılaştırma
| Faktör | Yapışkan | Dönen |
|---|---|---|
| İstek başına IP | 1-30 dakika boyunca aynı | Her istekte yeni |
| Oturum tutarlılığı | Yüksek | Yok |
| CAPTCHA oranı (çok adımlı akışlar) | Düşük (%5-10) | Yüksek (%30-50) |
| CAPTCHA oranı (tek sayfalar) | Orta (%10-20) | Düşük (%5-10) |
| Jeton geçerliliği | Daha yüksek — aynı IP | Uyumsuzluk riski |
| Hız | Hızlı (bağlantıyı yeniden kullanır) | Daha yavaş (yeni bağlantı) |
| Riski yasakla | İşaretlenmişse daha yüksek | Düşük — her seferinde yeni IP |
| Maliyet | Aynı veya biraz daha fazlası | Aynı |
| Şunlar için en iyisi | Giriş, ödeme, kimlik doğrulama | Toplu kazıma, arama |
Yapışkan Oturumlar Kazandığında
Çok Adımlı İş Akışları
CAPTCHA'lar, belirteçleri istekte bulunan IP'ye göre doğrular. IP'niz çözme ve gönderme arasında değişirse jeton reddedilebilir.
import requests
import time
CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"
# Sticky session: same IP for the entire login flow
STICKY_PROXY = {
"http": "http://user-session-abc123:pass@proxy.example.com:5000",
"https": "http://user-session-abc123:pass@proxy.example.com:5000",
}
session = requests.Session()
session.proxies = STICKY_PROXY
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 login_with_captcha(url, sitekey, username, password):
"""Full login flow — MUST use same IP throughout."""
# Step 1: Load login page (IP: 192.168.1.50)
session.get(url)
# Step 2: Solve CAPTCHA (solved against IP: 192.168.1.50)
token = solve_recaptcha(sitekey, url)
# Step 3: Submit login (MUST be IP: 192.168.1.50)
resp = session.post(url, data={
"username": username,
"password": password,
"g-recaptcha-response": token,
})
return resp.status_code == 200
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("CAPTCHA solve timeout")
IP Tutarlılığı Neden Önemlidir?
Sticky session:
1. Browser loads page → IP: 5.5.5.5
2. CAPTCHA solved → Token bound to session
3. Form submitted → IP: 5.5.5.5 ✅ Token accepted
Rotating session:
1. Browser loads page → IP: 5.5.5.5
2. CAPTCHA solved → Token bound to session
3. Form submitted → IP: 9.9.9.9 ❌ Token may be rejected
Dönüşümlü Oturumlar Kazandığında
Toplu Sayfa Kazıma
Her sayfa bağımsızdır. Dönen IP'ler, istekleri daha büyük bir havuza yayarak IP başına algılamayı azaltır.
import concurrent.futures
ROTATING_PROXY = {
"http": "http://user:pass@rotating.proxy.example.com:5000",
"https": "http://user:pass@rotating.proxy.example.com:5000",
}
def scrape_page(url):
"""Each request gets a fresh IP automatically."""
resp = requests.get(
url,
proxies=ROTATING_PROXY,
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"},
timeout=30,
)
if resp.status_code == 200:
return url, resp.text
return url, None
urls = [f"https://example.com/products?page={i}" for i in range(1, 501)]
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as pool:
results = list(pool.map(scrape_page, urls))
success = sum(1 for _, html in results if html)
print(f"Scraped: {success}/{len(urls)}")
Arama Motoru Kazıma
Arama motorları IP başına sorgu hacmini izler. Döndürme hız sınırlarını ortadan kaldırır:
def scrape_search(query, pages=10):
results = []
for page in range(pages):
# Each request → new IP
resp = requests.get(
"https://search-engine.example.com/search",
params={"q": query, "start": page * 10},
proxies=ROTATING_PROXY,
timeout=20,
)
results.append(resp.text)
time.sleep(2)
return results
Hibrit Strateji
Her iki modu da aynı ardışık düzende kullanın:
class HybridProxyManager:
"""Sticky for multi-step flows, rotating for single requests."""
def __init__(self, provider_host, username, password, port=5000):
self.host = provider_host
self.username = username
self.password = password
self.port = port
def get_rotating_proxy(self):
return {
"http": f"http://{self.username}:{self.password}@{self.host}:{self.port}",
"https": f"http://{self.username}:{self.password}@{self.host}:{self.port}",
}
def get_sticky_proxy(self, session_id, duration_min=10):
sticky_user = f"{self.username}-session-{session_id}-ttl-{duration_min}"
return {
"http": f"http://{sticky_user}:{self.password}@{self.host}:{self.port}",
"https": f"http://{sticky_user}:{self.password}@{self.host}:{self.port}",
}
proxy_mgr = HybridProxyManager("proxy.example.com", "user", "pass")
def scrape_with_auto_strategy(url, needs_login=False):
if needs_login:
# Multi-step → sticky
import uuid
session_id = uuid.uuid4().hex[:8]
proxy = proxy_mgr.get_sticky_proxy(session_id)
else:
# Single page → rotating
proxy = proxy_mgr.get_rotating_proxy()
return requests.get(url, proxies=proxy, timeout=30)
Node.js Uygulaması
const axios = require("axios");
const CAPTCHAAI_KEY = "YOUR_API_KEY";
const PROXY_HOST = "proxy.example.com";
const PROXY_PORT = 5000;
function getProxy(mode, sessionId = null) {
const user =
mode === "sticky" ? `user-session-${sessionId}` : "user";
return {
proxy: {
host: PROXY_HOST,
port: PROXY_PORT,
auth: { username: user, password: "pass" },
},
};
}
// Rotating: bulk scrape
async function scrapePages(urls) {
const results = [];
for (const url of urls) {
const config = getProxy("rotating");
const resp = await axios.get(url, { ...config, timeout: 30000 });
results.push({ url, data: resp.data });
}
return results;
}
// Sticky: login flow
async function loginFlow(loginUrl, sitekey, credentials) {
const sessionId = Date.now().toString(36);
const config = getProxy("sticky", sessionId);
// Step 1: Load page
await axios.get(loginUrl, config);
// Step 2: Solve CAPTCHA
const submitResp = await axios.post(
"https://ocr.captchaai.com/in.php",
null,
{
params: {
key: CAPTCHAAI_KEY,
method: "userrecaptcha",
googlekey: sitekey,
pageurl: loginUrl,
json: 1,
},
}
);
const taskId = submitResp.data.request;
let token;
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const res = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: CAPTCHAAI_KEY, action: "get", id: taskId, json: 1 },
});
if (res.data.request !== "CAPCHA_NOT_READY") {
token = res.data.request;
break;
}
}
// Step 3: Submit with same IP
return axios.post(
loginUrl,
{
...credentials,
"g-recaptcha-response": token,
},
config
);
}
Karar Matrisi
| İş akışı | Önerilen | neden |
|---|---|---|
| Giriş yap / kayıt ol | Yapışkan | IP'ye bağlı belirteç |
| Ödeme / ödeme | Yapışkan | Oturum çerezleri aynı IP'ye ihtiyaç duyar |
| Toplu sayfa kazıma | Dönen | Yükü dağıtır |
| Arama motoru kazıma | Dönen | IP başına hız sınırlarını önler |
| API yoklaması (aynı uç nokta) | Dönen | IP başına parmak izini azaltır |
| Çok sayfalı gezinme | Yapışkan | IP tarafından takip edilen çerezler |
| Fiyat takibi | Dönen | Birçok bağımsız istek |
| Hesap yönetimi | Yapışkan | Oturum bütünlüğü |
| CAPTCHA ile form gönderimi | Yapışkan | Belirteç-IP bağlama |
| Reklam doğrulama | Dönen | Farklı kullanıcıları simüle edin |
Sabit Oturum Süresi
| Süre | En İyisi | Risk |
|---|---|---|
| 1 dakika | Hızlı form gönderimleri | Akışın ortasında sona erebilir |
| 5 dakika | Standart giriş + işlemler | İyi denge |
| 10 dakika | Karmaşık çok sayfalı akışlar | Orta düzeyde yasaklanma riski |
| 30 dakika | Genişletilmiş tarama oturumları | Daha yüksek yasaklanma riski |
| 60 dakika | Uzun hesap işlemleri | En yüksek yasaklanma riski |
Temel kural: Yapışkan süreyi beklenen akış sürenizin 2 katına ayarlayın.
Sorun giderme
| Sorun | Sebep | Düzeltme |
|---|---|---|
| CAPTCHA jetonu çözümden sonra reddedildi | Çözme ve gönderme arasında IP değişti | Yapışkan oturuma geç |
| Tek sayfalarda yüksek CAPTCHA oranı | Aynı yapışkan IP çok fazla sayfaya çarpıyor | Döndürmeye geç |
| Oturum çerezleri kayboldu | Yapışkan oturumun süresi doldu | TTL süresini artırın |
| Yavaş dönme performansı | Yeni IP başına bağlantı yükü | Bağlantı havuzunu kullan |
| Yapışkan oturumda yasaklı IP | Tüm istekler işaretli IP'yi paylaşır | Oturum TTL'sini azaltın veya gecikmeler ekleyin |
SSS
Yapışkan ve döndürmeyi tek bir projede karıştırabilir miyim?
Evet. Hibrit yaklaşımı kullanın; kimlik doğrulama akışları için yapışkan, veri toplama için dönüşümlü. Çoğu proxy sağlayıcısı aynı planda her iki modu da destekler.
Yapışkan oturum aynı IP'yi garanti ediyor mu?
Çoğu sağlayıcı bunu TTL penceresi içinde garanti eder. IP'nin kullanılamaması durumunda (taşıyıcının yeniden atanması, havuz rotasyonu), yeni bir IP atanır.
Hangi mod daha ucuz?
Aynı fiyat; moddan bağımsız olarak GB başına veya istek başına ödeme yaparsınız. Maliyet farkı CAPTCHA oranlarından kaynaklanmaktadır: yanlış mod → daha fazla CAPTCHA → daha yüksek CaptchaAI harcaması.
Proxy sağlayıcımla kalıcı oturumları nasıl ayarlayabilirim?
Çoğu, kullanıcı adında bir oturum kimliği kullanır: user-session-abc123. Tam format için sağlayıcınızın belgelerine bakın. Biz koruyoruzParlak Veriler,Akıllı proxy, VeOksilablarözel kılavuzlarda.
İlgili Kılavuzlar
Proxy stratejinizi iş akışınızla eşleştirin —CaptchaAI anahtarınızı alınCAPTCHA'ları herhangi bir oturum modunda yönetmek için.