Bloga geri dön

Proxy için timeout ve retry mantığını nasıl ayarlarsınız: Veri kaybını önlemek için parsing koruması

Proxy için timeout ve retry mantığını doğru bir şekilde nasıl ayarlayacağınızı öğrenin, böylece veri kaybını önleyin; bu, veri çekme, otomasyon ve reklam hesaplarıyla çalışırken önemlidir.

📅27 Şubat 2026
```html

Pazar yerleri için proxy ile çalışırken, sosyal medya otomasyonu veya veri toplama yaparken en sık karşılaşılan sorun, takılan istekler ve kaybolan verilerdir. Proxy sunucusu zamanında yanıt vermeyebilir, bağlantı kesilebilir ve betiğiniz birkaç dakika boyunca takılabilir. Sonuç olarak, zaman, veri ve para kaybedersiniz.

Bu rehberde, proxy ile çalışırken timeout (zaman aşımı) ve retry logic (tekrar deneme mantığı) ayarlarını nasıl doğru yapacağınızı göstereceğim. Farklı görevler için hangi zaman aşımı değerlerini kullanacağınızı, hatalarla karşılaştığınızda otomatik olarak nasıl yeniden bağlanacağınızı ve tek bir isteği kaybetmemek için neler yapmanız gerektiğini öğreneceksiniz. Makale, Python'da kod yazanlar için olduğu kadar, hazır parsing araçları kullananlar için de uygundur.

Proxy ile çalışırken neden timeout kritik öneme sahiptir

Bir durumu hayal edin: 10.000 ürünle Wildberries fiyatlarını parse eden bir betik başlattınız. Betik, yasaklanmamak için proxy üzerinden çalışıyor. Her şey yolunda gidiyor, ancak 523. istekte proxy sunucusu yanıt vermeyi durduruyor — belki aşırı yüklenmiş ya da geçici olarak erişilemez. Zaman aşımı ayarı yapılmadıysa, betiğiniz yanıtı sonsuz bir süre bekleyecek (ya da sistemin 2-5 dakikalık zaman aşımı süresi dolana kadar). Sonuç olarak, parsing duruyor, zaman kaybediyorsunuz ve sorunu fark ettiğinizde birkaç saat geçmiş olabilir.

Timeout (zaman aşımı), sunucudan yanıt beklemek için ayrılan maksimum süredir. Eğer sunucu bu süre içinde yanıt vermezse, istek kesilir ve ya başka bir proxy üzerinden tekrar deneyebilir ya da hatayı loglayabilirsiniz. Bu, proxy ile çalışırken özellikle önemlidir çünkü:

  • Proxy sunucuları dengesiz olabilir — özellikle kamuya açık veya ucuz olanlar. Kaliteli konut proxy'leri bile bazen gerçek kullanıcının internetten çıkması nedeniyle bağlantıyı kaybedebilir.
  • Hedef site IP'yi engelleyebilir — eğer proxy yasaklandıysa, hiç yanıt vermeyebilir ya da çok uzun sürede yanıt verebilir (captcha ya da yönlendirme vererek).
  • Ağ gecikmeleri öngörülemez — özellikle diğer ülkelerden gelen proxy kullanıldığında. İstek birkaç ara düğüm üzerinden geçebilir.
  • Toplu işlemler istikrar gerektirir — eğer 100.000 sayfayı parse ediyorsanız ya da 50 Instagram hesabını yönetiyorsanız, takılan isteklerin %1'i = 1000 kaybolan işlem demektir.

Doğru ayarlanmamış zaman aşımı ile betiğiniz, çalışmayan proxy'ler için bekleyerek zaman kaybedecek, çalışır olanlara geçiş yapmayacaktır. Bu, çalışma hızını ve sonuçların istikrarını doğrudan etkiler.

Zaman aşımı türleri: connect, read ve total timeout

Anlayıp ayrı ayrı ayarlamanız gereken üç ana zaman aşımı türü vardır. Birçok yeni geliştirici ve parser kullanıcısı yalnızca bir genel zaman aşımı ayarlamakta ve bu da sorunlara yol açmaktadır.

1. Connect timeout (bağlantı zaman aşımı)

Bu, proxy sunucusuyla bağlantı kurmak için ayrılan süredir. Bu süre içinde bağlantı kurulmazsa, istek kesilir. Connect timeout, istemciniz ile proxy arasındaki başlangıç el sıkışmasını (TCP handshake) yönetir.

Ne zaman devreye girer: Proxy sunucusu erişilemez, aşırı yüklenmiş veya IP bir güvenlik duvarı tarafından engellenmiştir.

Tavsiye edilen değerler:

  • Hızlı veri merkezi proxy'leri için: 3-5 saniye
  • Konut proxy'leri için: 5-10 saniye
  • Mobil proxy'ler için: 10-15 saniye (mobil internet daha yavaştır)

2. Read timeout (okuma zaman aşımı)

Bu, proxy ile bağlantı kurulduktan sonra hedef sunucudan yanıt beklemek için ayrılan süredir. Eğer sunucu bu süre içinde veri göndermeye başlamazsa, istek kesilir. Read timeout, sunucunun isteği kabul ettiği ancak "takıldığı" ve yanıt vermediği durumları korur.

Ne zaman devreye girer: Hedef site isteği yavaş işliyor, aşırı yüklenmiş veya şüpheli istekleri kasıtlı olarak yavaşlatıyor.

Tavsiye edilen değerler:

  • Basit sayfaların (HTML) parse edilmesi için: 10-15 saniye
  • JavaScript render'lı parsing için: 30-60 saniye
  • API istekleri için: 5-10 saniye
  • Büyük dosyaların indirilmesi için: 120+ saniye

3. Total timeout (toplam zaman aşımı)

Bu, isteğin başından sonuna kadar, bağlantı, istek gönderimi, yanıt alma ve okuma süresi dahil olmak üzere, tüm işlemler için ayrılan maksimum süredir. Total timeout, hiçbir isteğin belirlenen süreden daha uzun sürmesini garanti eden "acil kapatma" işlevi görür.

Ne zaman kullanılır: Her isteğin kesin zaman dilimlerine uyması gerektiğinde (örneğin, arbitraj için gerçek zamanlı parsing yaparken).

Formül: Total timeout = Connect timeout + Read timeout + %20-30 ek süre

Önemli: Tüm kütüphaneler ve araçlar, connect ve read zaman aşımını ayrı ayarlamayı desteklemez. Örneğin, Python'daki requests kütüphanesi, her iki değeri bir demet olarak belirtmenize olanak tanır: timeout=(5, 15), burada 5 — connect, 15 — read.

Farklı görevler için optimal zaman aşımı değerleri

Doğru zaman aşımı değerleri, göreviniz, proxy türü ve hedef siteye bağlıdır. Çok kısa zaman aşımı, çok sayıda yanlış hata ile sonuçlanır (proxy çalışıyor, ancak onu reddediyorsunuz). Çok uzun zaman aşımı ise, ölü proxy'ler için bekleyerek zaman kaybına yol açar.

Görev Connect timeout Read timeout Açıklama
Wildberries, Ozon parse etme 5-7 sn 15-20 sn Pazar yerleri, çok sayıda ürünle sayfaları yavaşça yükleyebilir
Avito, Yandex.Market parse etme 5-7 sn 10-15 sn Genellikle hızlı siteler, ancak şüpheli IP'leri engelleyebilirler
Instagram, TikTok otomasyonu 7-10 sn 20-30 sn Mobil proxy'ler kullanın — daha yavaş ama daha istikrarlıdırlar
Facebook Ads API ile çalışma 5 sn 10-15 sn API genellikle hızlıdır, ancak rate limiting durumunda yavaşlayabilir
Selenium/Puppeteer ile parse etme 10 sn 60-120 sn JavaScript render'ı zaman alır, özellikle yavaş proxy'lerde
Proxy'lerin toplu kontrolü 3-5 sn 5-7 sn Hızlı erişim kontrolü, yavaş proxy'ler reddedilir

İpucu: Koruyucu (daha uzun) zaman aşımı değerleri ile başlayın ve hata loglarını analiz ederek yavaş yavaş azaltın. Çalışan proxy'lerde çok fazla zaman aşımı hatası görüyorsanız, değerleri artırın. Eğer betik yavaş proxy'lerden dolayı takılıyorsa, değerleri azaltın.

Retry logic: tekrar denemeleri nasıl doğru ayarlarsınız

Timeout, takılan istekler sorununu çözer, ancak veri kaybı sorununu çözmez. Eğer proxy yanıt vermezse, sadece hata alırsınız ve bu isteği kaybedersiniz. Bu nedenle, retry logic (tekrar deneme mantığı) kritik öneme sahiptir.

Retry logic, bir hata durumunda isteği otomatik olarak tekrar denemektir. Doğru ayarlama için temel ilkeler:

1. Hangi hataların tekrar edilmesi gerektiğini belirleyin

Tüm hataların tekrar edilmesi gerekmez. Örneğin:

  • Tekrar edilmesi gerekenler: Timeout, Connection refused, Proxy error, 502/503/504 (sunucu geçici hataları), Rate limiting (429)
  • Tekrar edilmemesi gerekenler: 404 (sayfa bulunamadı), 403 (erişim kalıcı olarak yasaklandı), 401 (geçersiz yetkilendirme), veri doğrulama hataları

2. Deneme sayısını ayarlayın

Optimal retry sayısı, verilerin kritikliği ile ilgilidir:

  • Kritik olmayan görevler için (analiz için parsing): 2-3 deneme
  • Önemli görevler için (rakip fiyatlarını izleme): 3-5 deneme
  • Kritik görevler için (reklam hesaplarıyla çalışma): 5-10 deneme

3. Exponential backoff (üstel gecikme) kullanın

İsteği hemen tekrar etmeyin — bu sorunu daha da kötüleştirebilir (örneğin, sunucu aşırı yüklenmişse). Denemeler arasında artan bir gecikme kullanın:

  • 1. deneme: hemen
  • 2. deneme: 1-2 saniye sonra
  • 3. deneme: 4-5 saniye sonra
  • 4. deneme: 10-15 saniye sonra

Formül: gecikme = temel_gecikme * (2 ^ deneme_numarası). Örneğin: 1 sn, 2 sn, 4 sn, 8 sn, 16 sn.

4. Tekrar denemelerde proxy rotasyonu

En önemli kural: tekrar denemede, havuzunuzdan FARKLI bir proxy kullanın. Eğer bir proxy isteği gerçekleştiremediyse, onun tekrar denemede başarılı olma olasılığı düşüktür. Ancak başka bir proxy büyük olasılıkla başarılı olacaktır.

Bu, konut proxy'leri ile çalışırken özellikle önemlidir; çünkü yüzlerce veya binlerce IP adresinden oluşan bir havuzunuz vardır. Her retry'de havuzdan yeni rastgele bir IP alın.

Python'da timeout ve retry ayarları örnekleri

Timeout ve retry logic'in Python'da popüler kütüphaneler kullanılarak uygulanmasına dair pratik örnekler inceleyelim.

Örnek 1: requests ile temel ayar

requests kütüphanesi, Python'da HTTP istekleri için en popüler olanıdır. İşte timeout ve basit bir retry ayarlamanın yolu:

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

# Retry logic ayarlama
retry_strategy = Retry(
    total=5,  # Maksimum 5 deneme
    backoff_factor=1,  # Gecikme: 1, 2, 4, 8, 16 saniye
    status_forcelist=[429, 500, 502, 503, 504],  # Retry için hata kodları
    allowed_methods=["HEAD", "GET", "POST", "PUT", "DELETE"]
)

adapter = HTTPAdapter(max_retries=retry_strategy)
session = requests.Session()
session.mount("http://", adapter)
session.mount("https://", adapter)

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

# Timeout ile istek yapma
try:
    response = session.get(
        'https://www.wildberries.ru/catalog/electronics',
        proxies=proxies,
        timeout=(5, 15)  # connect timeout 5 sn, read timeout 15 sn
    )
    print(f"Başarılı! Durum: {response.status_code}")
    print(f"Cevap boyutu: {len(response.content)} bayt")
except requests.exceptions.Timeout:
    print("Hata: zaman aşımı aşıldı")
except requests.exceptions.ProxyError:
    print("Hata: proxy ile ilgili sorun")
except requests.exceptions.RequestException as e:
    print(f"İstek hatası: {e}")

Bu örnekte, oturum düzeyinde otomatik retry ayarladık. 429, 500, 502, 503, 504 hatalarında kütüphane, istekleri 5 kez tekrar deneyecek ve üstel gecikme uygulayacaktır.

Örnek 2: Retry sırasında proxy rotasyonu

Her denemede havuzdan proxy rotasyonu yapan daha gelişmiş bir örnek:

import requests
import random
import time

# Proxy havuzu (gerçek proxy'lerinizi ekleyin)
PROXY_POOL = [
    'http://user:pass@proxy1.example.com:8080',
    'http://user:pass@proxy2.example.com:8080',
    'http://user:pass@proxy3.example.com:8080',
    'http://user:pass@proxy4.example.com:8080',
]

def make_request_with_retry(url, max_retries=5, base_delay=1):
    """
    Proxy rotasyonu ile birlikte retry ile istek yapar
    """
    for attempt in range(max_retries):
        # Havuzdan rastgele bir proxy seç
        proxy = random.choice(PROXY_POOL)
        proxies = {'http': proxy, 'https': proxy}
        
        try:
            response = requests.get(
                url,
                proxies=proxies,
                timeout=(5, 15),
                headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
            )
            
            # Durum kodunu kontrol et
            if response.status_code == 200:
                return response
            elif response.status_code in [429, 500, 502, 503, 504]:
                # Geçici hata - tekrar dene
                print(f"Girişim {attempt + 1}: kod {response.status_code}, tekrar deniyor...")
            else:
                # Kalıcı hata - denemeyi durdur
                print(f"Hata {response.status_code}, denemeleri durdur")
                return None
                
        except (requests.exceptions.Timeout, 
                requests.exceptions.ProxyError,
                requests.exceptions.ConnectionError) as e:
            print(f"Girişim {attempt + 1}: hata {type(e).__name__}, tekrar deniyor...")
        
        # Eğer son deneme değilse - üstel gecikme ile bekle
        if attempt < max_retries - 1:
            delay = base_delay * (2 ** attempt)
            print(f"Sonraki deneme için {delay} saniye bekleniyor...")
            time.sleep(delay)
    
    print("Tüm denemeler tükenmiştir")
    return None

# Kullanım
result = make_request_with_retry('https://www.ozon.ru/category/smartfony-15502/')
if result:
    print(f"Başarılı! {len(result.content)} bayt veri alındı")
else:
    print("İstek gerçekleştirilemedi")

Bu kod, her denemede havuzdan yeni rastgele bir proxy seçer, bu da isteğin başarılı olma olasılığını önemli ölçüde artırır.

Örnek 3: tenacity kütüphanesinin kullanımı

Daha esnek bir retry logic yönetimi için tenacity kütüphanesini kullanabilirsiniz:

from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
import requests

@retry(
    stop=stop_after_attempt(5),  # Maksimum 5 deneme
    wait=wait_exponential(multiplier=1, min=1, max=30),  # Üstel gecikme 1-30 sn
    retry=retry_if_exception_type((requests.exceptions.Timeout, 
                                   requests.exceptions.ProxyError,
                                   requests.exceptions.ConnectionError))
)
def fetch_with_proxy(url, proxy):
    """
    Otomatik retry ile işlev
    """
    proxies = {'http': proxy, 'https': proxy}
    response = requests.get(url, proxies=proxies, timeout=(5, 15))
    response.raise_for_status()  # HTTP hatası durumunda istisna fırlatır
    return response

# Kullanım
try:
    result = fetch_with_proxy(
        'https://www.avito.ru/rossiya/telefony',
        'http://user:pass@proxy.example.com:8080'
    )
    print(f"Başarılı! Durum: {result.status_code}")
except Exception as e:
    print(f"Tüm denemelerden sonra isteği gerçekleştiremediniz: {e}")

tenacity kütüphanesi, dekoratörler aracılığıyla retry ayarlarını çok esnek bir şekilde yapmanıza olanak tanır. Kurulum: pip install tenacity

Kod yazmadan parsing için hazır çözümler

Eğer programcı değilseniz veya geliştirme süresinden tasarruf etmek istiyorsanız, zaman aşımı ve retry logic desteği ile birlikte gelen hazır parsing araçları mevcuttur. Kod yazmanıza gerek yok — sadece grafik arayüzde ayarları yapmanız yeterlidir.

Octoparse

Windows ve Mac için popüler bir görsel parser. Zaman aşımı ve retry ayarları:

  • Görev ayarlarını açın → Gelişmiş Seçenekler
  • Sayfa Yükleme Zaman Aşımı: 20-30 saniye ayarlayın
  • Ajax Zaman Aşımı: Dinamik içerik için 10-15 saniye
  • Retry Sayısı: hata durumunda 3-5 deneme
  • Proxy ayarlarında liste yükleyebilir ve otomatik rotasyonu etkinleştirebilirsiniz

ParseHub

Ücretsiz bir tarifeye sahip bulut tabanlı parser. Ayarlar:

  • Ayarlar → Gelişmiş → Sayfa Yükleme Gecikmesi: 5-10 saniye
  • İstek Zaman Aşımı: 30 saniye
  • Başarısız İstekleri Tekrarla: etkinleştir, 3 deneme
  • Proje ayarları aracılığıyla proxy desteği

Apify

Popüler siteleri parse etmek için hazır aktörler (scriptler) ile web görevlerini otomatikleştirme platformu. Pazar yerleri (Wildberries, Ozon) için birçok aktör, zaten optimal zaman aşımı ve retry ayarları ile birlikte gelir. Sadece şunları yapmanız gerekir:

  • İhtiyacınız olan site için hazır bir aktör seçin
  • Proxy belirtin (proxy sağlayıcıları ile entegrasyonu destekler)
  • Görevi başlatın — geri kalan her şey otomatik olarak ayarlanır

Anti-detect tarayıcılar ile otomasyon

Eğer Dolphin Anty, AdsPower veya Multilogin aracılığıyla sosyal medya veya reklam platformları ile çalışıyorsanız, zaman aşımı tarayıcı profilinde ayarlanır:

  • Dolphin Anty: Profil ayarları → Proxy → Zaman Aşımı: 10-15 saniye
  • AdsPower: Proxy Ayarları → Bağlantı Zaman Aşımı: 10 saniye, Okuma Zaman Aşımı: 20 saniye
  • Multilogin: Tarayıcı Profili → Ağ → Proxy Zaman Aşımı: 15 saniye

Bu tarayıcılar aracılığıyla otomasyon yaparken (örneğin, Selenium scriptleri ile) proxy zaman aşımı profil ayarlarından miras alınır, ancak script düzeyinde ek zaman aşımı değerleri de ayarlayabilirsiniz.

Zaman aşımı ayarlarında sık yapılan hatalar

Deneyimli geliştiriciler ve parsing uzmanları bile zaman aşımı ve retry ile çalışırken tipik hatalar yapabilir. İşte en yaygın olanları:

Hata 1: Zaman aşımının tamamen olmaması

Birçok kütüphane varsayılan olarak zaman aşımı ayarlamaz veya çok büyük bir değer (birkaç dakika) koyar. Eğer zaman aşımını açıkça belirtmediyseniz, betiğiniz uzun süre takılabilir.

Çözüm: Her istekte zaman aşımını her zaman açıkça belirtin. 15 saniyede hata almak, 5 dakika beklemekten daha iyidir.

Hata 2: Tüm retry'lerde aynı proxy kullanmak

Eğer proxy ilk seferde yanıt vermezse, aynı proxy ile tekrar deneme başarısı çok düşüktür. Birçok kişi, denemeler arasında proxy'leri döndürmeyi unutur.

Çözüm: Her retry'de havuzdan yeni bir proxy kullanın. Bu, yüksek başarı oranı için kritik öneme sahiptir.

Hata 3: Yavaş proxy'ler için çok kısa zaman aşımı

Mobil ve bazı konut proxy'leri, veri merkezlerinden daha yavaş olabilir. Eğer mobil proxy için 5 saniye zaman aşımı belirlerseniz, oldukça işlevsel IP'lerde çok fazla yanlış hata alırsınız.

Çözüm: Proxy türünü dikkate alın. Mobil proxy'ler için en az 10-15 saniye zaman aşımı kullanın.

Hata 4: Sonsuz retry'ler

Bazıları retry'leri sınırsız denemelerle while True döngüsünde uygular. Eğer sorun hedef sitede (örneğin, tamamen çökmesi) ise, betik sonsuz bir şekilde denemeye devam eder.

Çözüm: Her zaman retry sayısını sınırlayın (maksimum 3-10 deneme) ve başarısız istekleri sonraki analiz için loglayın.

Hata 5: Hata türünü göz ardı etme

Tüm hataların tekrar edilmesi gerekmez. Örneğin, 404 (sayfa bulunamadı) hatası aldıysanız, tekrar denemek anlamsızdır; sayfa yoktur. Ancak 503 (hizmet geçici olarak kullanılamıyor) hatası, birkaç saniye sonra tekrar denemek için mantıklıdır.

Çözüm: Hata türünü analiz edin ve yalnızca geçici sorunları (timeout, bağlantı hatası, 429, 500, 502, 503, 504) tekrar edin.

Hata 6: Loglama eksikliği

Log olmadan, isteklerin neden başarısız olduğunu anlamazsınız: sorun proxy'de mi, zaman aşımında mı yoksa hedef sitede mi?

Çözüm: Hangi proxy'nin kullanıldığını, zaman aşımının ne olduğunu, kaç deneme yapıldığını ve hangi hatanın meydana geldiğini belirterek her hatayı loglayın. Bu, ayarları optimize etmenize yardımcı olacaktır.

Proxy seçimi için ipucu: Eğer doğru ayarlarla bile çok fazla zaman aşımı hatası alıyorsanız, sorun proxy kalitesindedir. Ucuz kamuya açık veya paylaşımlı proxy'ler genellikle aşırı yüklenir ve yavaş yanıt verir. İstikrarlı bir çalışma için kaliteli konut proxy'leri kullanmanızı öneririz.

Sonuç

Doğru zaman aşımı ve retry logic ayarları, yalnızca teknik bir detay değil, aynı zamanda proxy ile çalışmanın istikrarı ve verimliliği için kritik bir faktördür. Zaman aşımı olmadan, betikleriniz ölü proxy'lerde takılacak ve zaman kaybedecektir. Retry logic olmadan, geçici hatalarda verileri kaybedeceksiniz. Ve tekrar denemelerde proxy rotasyonu olmadan, kaliteli bir IP havuzunuz olsa bile düşük bir başarı oranı elde edeceksiniz.

Bu rehberden çıkarılacak ana noktalar:

  • Her zaman zaman aşımını açıkça ayarlayın: connect timeout 5-10 saniye, read timeout 10-30 saniye göreve bağlı olarak
  • 3-5 denemelik bir sınırlama ve üstel gecikme ile retry logic kullanın
  • Her tekrar denemede proxy'leri döndürün — bu, yüksek bir başarı oranının anahtarıdır
  • Sadece geçici hataları (timeout, 429, 500, 502, 503, 504) tekrar edin, kalıcı olanlara (404, 403) deneme harcamayın
  • Tüm hataları analiz ve ayar optimizasyonu için loglayın
  • Proxy türünü dikkate alın: mobil proxy'ler veri merkezlerinden daha yavaş, zaman aşımını buna göre artırın

Eğer pazar yerleri (Wildberries, Ozon, Avito), sosyal medya otomasyonu veya reklam platformları ile çalışıyorsanız, proxy'nin istikrarı doğrudan sonucunuzu etkiler. Kaliteli proxy'ler kullanın ve zaman aşımı ile retry ayarlarını doğru yapın — bu, size saatlerce zaman ve binlerce kaybolan istekten tasarruf ettirir.

Maksimum istikrar ve minimum zaman aşımı hatası gerektiren görevler için, veri merkezi proxy'lerini denemenizi öneririz — yüksek yanıt hızı ve istikrarlı bağlantı sağlar, bu da toplu parsing ve otomasyon için özellikle önemlidir.

```