cURL ve Python ile Proxy Kullanımı
Birkaç satırla proxy üzerinden istek atın, çıkış IP’nizi doğrulayın ve yaygın hataları (407, zaman aşımı) çözün.
İçindekiler
cURL’de -x ile proxy adresini, --proxy-user ile kullanıcı adı ve parolayı verirsiniz; Python requests’te aynı bilgi proxies sözlüğüne girer. SOCKS5 için adres socks5h:// ile başlar ve Python’da requests[socks] paketi gerekir. Yazıda her iki aracın çalışan örneklerini, çıkış IP’sinin nasıl doğrulanacağını ve 407, 502, ProxyError gibi sık hataların çözümünü bulacaksınız.
cURL ile proxy üzerinden istek
cURL’de proxy adresi -x (uzun biçimi --proxy) ile verilir. Adresin başındaki şema protokolü belirler; şema yazılmazsa HTTP proxy varsayılır. Kimlik bilgisini adrese gömmek yerine --proxy-user ile ayrı vermek, parolanızdaki özel karakterleri kodlama derdinden kurtarır.
Şemayı teslim bilgilerindeki protokole göre yazın: SOCKS5 paketine http:// ile bağlanmak ya da tersi genellikle bağlantı sıfırlanmasına veya zaman aşımına yol açar. socks5:// şemasında alan adını cihazınız çözer; socks5h:// şemasında ad proxy’ye iletilir ve çözümlemeyi o yapar. Sorguların yerel DNS’e gitmesini istemiyorsanız socks5h kullanın.
Betiklerde komuta ayrıca --connect-timeout 10 --max-time 30 ekleyin; yanıt vermeyen bir proxy işinizi sonsuza kadar bekletmesin.
İpucu
Windows’ta curl.exe yazın; Windows PowerShell’de curl başka bir komutun takma adıdır. Windows tarafındaki kurulum için Windows’ta SOCKS5 Proxy Kurulumu yazısına bakın.
Çıkış IP’sini doğrulama
Proxy’nin devrede olduğunu anlamanın güvenilir bir yolu, aynı adresi proxy’siz ve proxy’li çağırıp çıktıları karşılaştırmaktır:
İki çıktı farklıysa trafik proxy’den çıkıyordur. Çıkış IP’sinin proxy adresiyle aynı olması gerekmez; önemli olan kendi adresinizden farklı olmasıdır. Çıktı kendi adresinizle aynıysa istek proxy’yi atlamıştır: -x yazımını ve NO_PROXY listesini kontrol edin. Sorun varsa komuta -v ekleyin ve şunlara bakın:
CONNECT api.ipify.org:443satırı, HTTP proxy’den tünel istendiğini gösterir.407içeren bir yanıt ya da hata satırı, kimlik bilgisinin eksik ya da yanlış olduğunu gösterir.200yanıtı tünelin açıldığını gösterir; sorun bundan sonraki adımdadır.
Hızlı bir doğrulama için IP Adresi Sorgulama sayfasını proxy ayarlı bir uygulamada açabilir, bilgileri Proxy Kontrol aracına yapıştırabilirsiniz; araç HTTP ve SOCKS5’i otomatik dener.
Python requests: proxies sözlüğü ve timeout
requests’te proxy proxies sözlüğüyle verilir. Anahtar hedef adresin şemasını (http ya da https), değer ise proxy’nin kendi adresini belirtir. HTTP proxy kullanırken HTTPS hedefler için bile değer http:// ile başlar: şema proxy ile nasıl konuştuğunuzu belirtir, hedef sitenin HTTPS bağlantısı ise proxy’nin açtığı tünelin içinden kurulur.
timeout vermezseniz istek süresiz bekleyebilir. (5, 20) ilk değerle bağlantı kurma, ikinci değerle yanıt bekleme süresini saniye olarak sınırlar. Üretim kodunda timeout değerini her zaman açıkça yazın.
SOCKS5, Session ve yeniden deneme
SOCKS5 için önce pip install "requests[socks]" komutuyla gerekli paketi kurun, ardından şemayı socks5h:// yapın. Çok sayıda isteği tek proxy ayarıyla göndermek için Session kullanın:
- Session bağlantıyı yeniden kullanır. Dönen (rotating) bir proxy’de art arda isteklerin aynı IP’den çıkması bundan kaynaklanabilir; her istekte yeni IP bekliyorsanız yeni bir Session açın. Sticky oturum için oturum kimliğinin nereye ve hangi biçimde yazılacağını teslim bilgilerinden ya da destekten teyit edin.
- Ortamda
HTTP_PROXYya daHTTPS_PROXYtanımlıysa bu değerlersession.proxiesayarının önüne geçebilir. Emin olmak içinproxies=parametresini istek başına verin ya dasession.trust_env = Falseyapın. - Yeniden deneme yalnızca geçici hatalar (502, 503, 504) içindir; 407 gibi kimlik hatalarını tekrarlamak işe yaramaz.
Parolayı koda gömmeyin
Kimlik bilgisini kaynak koduna yazmak, kod paylaşıldığı ya da bir depoya yüklendiği anda onu sızdırmak demektir. Bilgiyi ortam değişkenlerinden okuyun. Parolada @, :, / veya % gibi karakterler varsa adrese eklemeden önce quote ile URL kodlamasından geçirin:
PowerShell’de aynı değişkenleri $env:PROXY_USER = "KULLANICI" biçiminde tanımlarsınız. Proxy ayarının kodda hiç yer almasını istemiyorsanız standart ortam değişkenlerinden yararlanabilirsiniz: requests HTTP_PROXY, HTTPS_PROXY ve NO_PROXY değişkenlerini kendiliğinden okur; cURL ise https_proxy, all_proxy ve no_proxy değişkenlerini okur (küçük harfli sürümler önceliklidir). NO_PROXY=localhost,127.0.0.1 gibi bir değerle bazı adresleri proxy dışında bırakabilirsiniz.
cURL tarafında parolayı komut satırına yazmak onu kabuk geçmişine taşır. Bunun yerine seçenekleri yalnızca sizin okuyabildiğiniz bir yapılandırma dosyasına koyup -K ile okutabilirsiniz:
Sık hatalar ve çözümleri
Python’da hataları türüne göre ayırmak nedeni hızla bulmanızı sağlar: ProxyError proxy’ye bağlanılamadığını ya da kimlik doğrulamanın reddedildiğini, Timeout türleri ise beklemenin süreyi aştığını gösterir.
Sık karşılaşılan hatalar ve çözümleri aşağıdaki tabloda.
Tüm sütunları görmek için tabloyu yana kaydırın.
Hatanın hangi adımda oluştuğunu görmek için HTTP Proxy Kontrol ve SOCKS5 Kontrol araçlarını kullanabilirsiniz. Yalnızca sizin IP’nize izin veren proxy’ler kontrol sunucumuzdan çalışmıyor görünebilir; bu durumda denemeyi kendi bilgisayarınızdan cURL ile yapın.
Sonuç
cURL ile tek satırda doğrulayıp Python’da proxies, timeout ve ortam değişkeni düzenini kurduğunuzda proxy kullanımı birkaç satırdan ibarettir. Bu örnekler standart HTTP ve SOCKS5 istemci kodudur; ayrı bir SDK kurmanız gerekmez.
Protokol ve paket yapısı için HTTP & SOCKS5 Proxy, toplu IP için Datacenter Proxy, GB bazlı kullanım için Residential Proxy sayfalarına, tutarlar için fiyatlandırma sayfasına bakabilirsiniz. İki protokolün farkı için SOCKS5 ile HTTP Proxy Farkı yazısı yardımcı olur.
Sorun yaşarsanız önce cURL ile tek satırlık bir sınama yapın: cURL çalışıp Python çalışmıyorsa sorun büyük olasılıkla kodunuzda ya da ortam değişkenlerinizdedir, ikisi de çalışmıyorsa proxy bilgilerinde ya da ağdadır. Otomatik istekleri hedef sitenin kullanım koşulları ve robots.txt kuralları çerçevesinde, ölçülü hızla gönderin.
SSS
Sık sorulan sorular
--proxy-user "KULLANICI:PAROLA" ile verin. Adrese gömmeniz gerekiyorsa @, :, / ve % gibi karakterleri yüzde kodlamasıyla yazın (örneğin @ için %40). Python’da urllib.parse.quote(parola, safe="") aynı işi yapar.