Kurulum Rehberleri5 dk okuma

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.

Terminal
# HTTP proxy
curl -x http://proxy.example.com:PORT --proxy-user "KULLANICI:PAROLA" https://api.ipify.org

# SOCKS5 proxy, alan adı çözümlemesi proxy tarafında
curl -x socks5h://proxy.example.com:PORT --proxy-user "KULLANICI:PAROLA" https://api.ipify.org
Çıktı tek satırlık bir IP adresi olmalı, örneğin 203.0.113.45

Ş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:

Terminal
# kendi adresiniz
curl -s https://api.ipify.org

# proxy üzerinden
curl -s -x http://proxy.example.com:PORT --proxy-user "KULLANICI:PAROLA" https://api.ipify.org

İ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:443 satırı, HTTP proxy’den tünel istendiğini gösterir.
  • 407 içeren bir yanıt ya da hata satırı, kimlik bilgisinin eksik ya da yanlış olduğunu gösterir.
  • 200 yanı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.

Python
import requests

proxy = "http://KULLANICI:PAROLA@proxy.example.com:PORT"
proxies = {"http": proxy, "https": proxy}

response = requests.get("https://api.ipify.org", proxies=proxies, timeout=(5, 20))
print(response.status_code, response.text)

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:

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

proxy = "socks5h://KULLANICI:PAROLA@proxy.example.com:PORT"
retry = Retry(total=3, backoff_factor=1, status_forcelist=(502, 503, 504))

with requests.Session() as session:
    session.proxies.update({"http": proxy, "https": proxy})
    session.mount("https://", HTTPAdapter(max_retries=retry))
    session.mount("http://", HTTPAdapter(max_retries=retry))

    for _ in range(3):
        print(session.get("https://api.ipify.org", timeout=(5, 20)).text)
  • 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_PROXY ya da HTTPS_PROXY tanımlıysa bu değerler session.proxies ayarının önüne geçebilir. Emin olmak için proxies= parametresini istek başına verin ya da session.trust_env = False yapı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:

Python
import os
from urllib.parse import quote

import requests

user = quote(os.environ["PROXY_USER"], safe="")
password = quote(os.environ["PROXY_PASS"], safe="")
endpoint = os.environ["PROXY_ENDPOINT"]  # örnek: proxy.example.com:PORT

proxy = f"http://{user}:{password}@{endpoint}"
proxies = {"http": proxy, "https": proxy}

print(requests.get("https://api.ipify.org", proxies=proxies, timeout=(5, 20)).text)
Terminal
export PROXY_USER="KULLANICI"
export PROXY_PASS="PAROLA"
export PROXY_ENDPOINT="proxy.example.com:PORT"
Değişkenleri betiği çalıştıracağınız oturumda tanımlayın

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:

Metin
proxy = "socks5h://proxy.example.com:PORT"
proxy-user = "KULLANICI:PAROLA"
proxy.curlrc dosyasının içeriği; çağrı: curl -K proxy.curlrc -s https://api.ipify.org

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.

Python
import requests

proxy = "http://KULLANICI:PAROLA@proxy.example.com:PORT"
proxies = {"http": proxy, "https": proxy}

try:
    response = requests.get("https://api.ipify.org", proxies=proxies, timeout=(5, 20))
    response.raise_for_status()
    print(response.text)
except requests.exceptions.ProxyError as exc:
    print("Proxy bağlantısı kurulamadı ya da kimlik doğrulama reddedildi:", exc)
except requests.exceptions.Timeout:
    print("Zaman aşımı: portu, güvenlik duvarını ve hedefin yanıtını kontrol edin")
except requests.exceptions.RequestException as exc:
    print("Diğer istek hatası:", exc)

Sık karşılaşılan hatalar ve çözümleri aşağıdaki tabloda.

HataOlası nedenÇözüm
407 Proxy Authentication RequiredKullanıcı adı ya da parola yanlış veya hiç gönderilmedi; özel karakterler kodlanmadı. Python’da çoğunlukla ProxyError içinde “Tunnel connection failed: 407” olarak görünürBilgileri panelden yeniden kopyalayın; cURL’de --proxy-user kullanın, Python’da parolayı quote ile kodlayın
502 Bad GatewayProxy hedefe ulaşamadı: hedef geçici olarak yanıt vermiyor ya da çıkış hattında geçici bir sorun varBirkaç saniye sonra yeniden deneyin, başka bir hedefle sınayın, istek hızını düşürün; sürerse destekle görüşün
ProxyError, Failed to connectYanlış host veya port, protokol uyuşmazlığı ya da proxy’ye ulaşılamıyorAdres ve portu doğrulayın, şemayı teslim bilgilerindeki protokole göre ayarlayın, Proxy Kontrol aracıyla sınayın
ConnectTimeout, ReadTimeout (cURL hata 28)Port filtreleniyor, güvenlik duvarı engelliyor ya da hedef çok yavaş yanıt veriyorAğınızdan portun açık olduğunu doğrulayın; süreleri makul ölçüde artırın ve yeniden deneme ekleyin
InvalidSchema: Missing dependencies for SOCKS supportrequests için SOCKS paketi kurulu değilpip install "requests[socks]" ile kurun
SSLError, certificate verify failedSertifika paketi eski ya da araya giren bir yazılım sertifikayı değiştiriyorverify=False ile geçiştirmeyin; sertifika paketini güncelleyin ve araya giren yazılımı kontrol edin
Hata, olası neden ve çözüm

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

Bilgiyi adrese gömmek yerine --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.

Ürünler

Bu yazıdaki ürünler

Konuyla en çok ilgili ürünler burada. Paketlere ve fiyatlara ürün sayfalarından ya da fiyatlandırma sayfasından bakabilirsiniz.

Sipariş ve ödeme adımları saglamproxy.com üzerinde tamamlanır.

Okumaya devam edin

İlgili yazılar

Tüm yazılar