Rehber · Güncelleme 2026-10-17

Python ile Rotating Proxy: requests ve httpx Örnekleri

requests ve httpx ile rotating proxy kullanımı: proxy URL’si, Session ve AsyncClient, sticky oturum seçimi, 407/429 hataları ve kota için kod örnekleri.

Python ile Rotating Proxy: requests ve httpx Örnekleri

Python ile rotating proxy: ilk bağlantı üç satırda

Python ile rotating proxy kullanmak için ayrı bir kütüphane gerekmez; requests ve httpx, proxy adresini doğrudan bağlantı ayarı olarak kabul eder. Panelden aldığınız host, port, kullanıcı adı ve şifreyi http://kullanici:sifre@host:port biçiminde tek bir URL’ye çevirir, bu URL’yi istemciye verirsiniz. Gateway’e giden her istek havuzdan bir çıkış IP’si alır; IP seçimini gateway yapar, kodunuz yalnızca istek gönderir.

Bu rehberdeki örnekler RotatingProxy kataloğundaki beş ürünün hepsiyle çalışır, çünkü beşi de HTTP, HTTPS ve SOCKS5 kabul eder. Kodda yalnızca URL şeması değişir: HTTP ve HTTPS hedefler için http://, SOCKS5 için socks5:// ve DNS çözümlemesini de proxy tarafında yaptırmak isterseniz socks5h://.

Kimlik bilgisini koda gömmeyin. Örneklerde PROXY_URL adlı bir ortam değişkeni kullanılıyor; Linux ve macOS’ta export PROXY_URL="http://kullanici:sifre@host:port", Windows PowerShell’de $env:PROXY_URL="..." ile tanımlanır, Python tarafında os.environ["PROXY_URL"] ile okunur. Şifrede @ veya : gibi karakterler varsa urllib.parse.quote ile kaçırın; aksi halde URL yanlış ayrıştırılır ve ilk aldığınız hata 407 olur.

requests ile kurulum: proxies sözlüğü ve Session

requests, proxy bilgisini her istekte proxies parametresiyle ya da bir Session nesnesine bir kez atayarak alır. En kısa biçim şudur: import os, requests; proxies = {"http": os.environ["PROXY_URL"], "https": os.environ["PROXY_URL"]}; r = requests.get("https://hedef.site/urun/1", proxies=proxies, timeout=(10, 30)); print(r.status_code).

İki anahtar da aynı URL’ye bakar, çünkü requests hangi proxy’yi kullanacağını hedefin şemasına göre bu sözlükten seçer. Yalnızca https anahtarını verirseniz http hedefler proxy’siz çıkar ve kendi IP’nizi sızdırırsınız. timeout bir çift olarak verilir: ilki bağlantı kurma, ikincisi yanıt bekleme süresidir. Proxy üzerinden giden isteklerde bağlantı kurma süresi doğrudan erişime göre uzar; ilk değeri birkaç saniyenin altına çekmeyin.

Çok sayıda istek atacaksanız Session kullanın: s = requests.Session(); s.proxies.update(proxies); sonraki s.get(...) çağrıları aynı ayarı taşır. Session aynı zamanda bağlantı havuzu tutar ve keep-alive uygular; bu ayrıntı, aşağıda anlatılan rotasyon davranışını doğrudan etkiler.

SOCKS5 için ek paket gerekir: pip install "requests[socks]" komutu PySocks’u kurar, ardından proxies sözlüğündeki URL şeması socks5h:// olur. HTTP proxy için ek bağımlılık yoktur.

httpx ile aynı iş: tek parametre, HTTP/2 ve async

httpx’te proxy ayarı istemci oluşturulurken verilir: import httpx; client = httpx.Client(proxy=os.environ["PROXY_URL"], timeout=httpx.Timeout(30.0, connect=10.0)); r = client.get("https://hedef.site/urun/1"). Güncel sürümlerde parametre adı proxy’dir; eski örneklerde gördüğünüz proxies sözlüğü de kabul edilir, ama tek URL çoğu iş için yeterlidir.

Asenkron tarama yapıyorsanız httpx.AsyncClient aynı parametreleri alır: async with httpx.AsyncClient(proxy=...) as client: yanitlar = await asyncio.gather(*[client.get(u) for u in urls]). Eşzamanlı istek sayısını limits=httpx.Limits(max_connections=20) gibi bir sınırla belirleyin; sınırsız gather hem hedef siteyi hem kendi kotanızı gereksiz yere zorlar.

HTTP/2 isteyen hedeflerde httpx.Client(http2=True, ...) kullanılabilir; bunun için pip install "httpx[http2]" gerekir. Proxy ile hedef arasındaki tünel CONNECT ile kurulduğundan proxy tarafının HTTP/2 desteklemesi gerekmez; uçtan uca protokol istemciyle hedef arasında anlaşılır.

SOCKS5 için httpx’te pip install "httpx[socks]" sonrası URL şeması socks5:// olur; DNS’i proxy tarafında çözdürmek için yine socks5h:// kullanılır.

Her istekte yeni IP mi, aynı IP’de kalmak mı? Kodun belirlediği kısım

Rotasyon gateway’de yapılır, ama kodunuz ona iki yoldan etki eder. Birincisi bağlantı yeniden kullanımı: Session veya Client nesnesi keep-alive ile aynı TCP bağlantısını açık tuttuğunda, art arda gelen istekler bazı gateway yapılandırmalarında aynı çıkış IP’sinde kalabilir. Her istekte farklı IP görmek istiyorsanız ya her istek için yeni bir bağlantı açın (requests’te düz requests.get, httpx’te her istekte yeni Client) ya da Connection: close başlığı gönderin.

İkincisi oturum parametresi. IPv4 residential ve mobile ürünlerde sticky oturum, IPv6 ürünlerde oturum yapılandırmalı rotasyon vardır; aynı oturum kimliğiyle gelen istekler bir süre aynı IP’de tutulur. Oturum kimliği panelde tanımlanan sözdizimiyle genellikle kullanıcı adına eklenir. Python tarafında bunun karşılığı, her mantıksal iş için ayrı bir proxy URL’si üretmektir: sepet akışı için oturum kimliği içeren URL ile bir Session kurarsınız, bağımsız sayfa taraması için oturum kimliksiz URL kullanırsınız.

Pratik kural: bir URL listesini bağımsız olarak taramak istek başına rotasyonun işidir; giriş, filtre ve sayfalama gibi birbirine bağlı adımlar ise tek oturumda kalmalıdır. İkisini aynı Session nesnesinde karıştırmayın; iki ayrı istemci açmak hem daha okunur hem daha öngörülebilirdir.

Hata, neden, çözüm: 407, ProxyError, 429 ve zaman aşımı

407 Proxy Authentication Required: Kullanıcı adı veya şifre yanlış, URL’de kaçırılmamış özel karakter var ya da IP whitelist modunda sunucunuzun IP’si panelde tanımlı değil. Önce URL’yi urllib.parse.urlsplit ile ayrıştırıp kullanıcı adı ve şifre alanlarının beklediğiniz gibi çıktığına bakın.

requests.exceptions.ProxyError veya httpx.ProxyError: Proxy’ye bağlantı kurulamadı. Host ve port’u, HTTP ile SOCKS5 uç noktalarını karıştırmadığınızı ve kurumsal güvenlik duvarının giden portu kapatmadığını kontrol edin. SOCKS kullanıyorsanız PySocks ya da httpx[socks] kurulu mu bakın; eksikse hata mesajı bunu açıkça söyler.

429 Too Many Requests: Bu hatayı proxy değil, hedef site döndürür. IP değişse bile aynı başlık setini ve aynı zamanlamayı tekrarlayan bir istemci sınırlara takılır. Yanıtta Retry-After başlığı varsa o süre kadar bekleyin; yoksa üstel bekleme uygulayın (1, 2, 4, 8 saniye) ve eşzamanlılığı düşürün. Her 429’da hemen yeni IP’ye geçmek sınırın nedenini ortadan kaldırmaz; hız ve başlıklar aynı kaldıkça yeni IP de aynı sınıra takılır.

Zaman aşımı (ConnectTimeout / ReadTimeout): Proxy üzerinden giden isteklerde özellikle bağlantı kurma süresi uzar. Zaman aşımını hedefin tipik yanıt süresine göre ayarlayın; yeniden denemeyi sınırlı sayıda (örneğin 3) ve hata sınıfına göre yapın. 4xx yanıtlarda tekrar denemek kota yakar, bağlantı hatalarında ise tekrar denemek genellikle işe yarar.

Hangi IP’den çıktığınızı görmek için kendi kontrol sunucunuza ya da istemcinin IP’sini düz metin döndüren herhangi bir uç noktaya istek atın. Aynı Session ile üç kez, sonra üç ayrı bağlantıyla üç kez isteyip sonuçları karşılaştırmak, rotasyon davranışınızı bir dakikada doğrular.

Ölçek: eşzamanlılık, kota ve ölçüm

requests senkron çalışır; paralellik için concurrent.futures.ThreadPoolExecutor kullanın ve her iş parçacığına kendi Session nesnesini verin, çünkü Session iş parçacıkları arasında güvenle paylaşılmaz. httpx’te tek bir AsyncClient’ı asyncio.Semaphore ile sınırlamak yeterlidir.

GB bazlı paketlerde gelen ve giden veri kotadan düşer. Gereksiz veriyi baştan kesin: görselleri ve betikleri indirmeyin, yalnızca ihtiyacınız olan uç noktaya gidin, sıkıştırılmış yanıt isteyin (requests ve httpx Accept-Encoding başlığını varsayılan olarak gönderir), mümkünse HEAD veya aralık isteği kullanın. Yeniden denemeler de kotadan düşer; deneme sayısını sınırlı tutmak bu yüzden bir maliyet kararıdır.

Ölçeklemeden önce küçük bir deneme taramasında istek sayısını, toplam baytı ve hata oranını loglayın; len(r.content) değerlerini toplayıp istek sayısına bölerek ortalama yanıt boyutunu bulun. Bu ortalama, kota hesabının tek güvenilir girdisidir; GB tahminini bu değerle yapın, paketinizi de ona göre seçin.

Canlıya almadan önce kontrol listesi

Proxy URL’si ortam değişkeninden okunuyor; kodda ve depoda şifre yok.

requests’te http ve https anahtarlarının ikisi de tanımlı; httpx’te proxy parametresi istemciye verilmiş.

Her istekte timeout var; sonsuz bekleme yok.

İş türüne göre istemci ayrılmış: bağımsız tarama için rotasyonlu, çok adımlı akış için oturum kimlikli.

Yeniden deneme hata sınıfına göre kurulmuş: bağlantı hatasında dene, 4xx’te deneme, 429’da Retry-After kadar bekle.

Hedef sitenin robots.txt dosyası ve kullanım koşulları okundu; istek hızı ve eşzamanlılık buna göre sınırlandı.

Deneme taramasıyla ortalama yanıt boyutu ölçüldü; GB paketi bu ölçüme göre seçildi.

İlgili ürünler

İç bağlantılar