- Yayın tarihi
- Okuma süresi
- 4 dk okuma
Python ile Proxy Kullanımı: requests ve httpx
Python'da requests ve httpx ile proxy kullanımı: kimlik doğrulama, özel karakterli parola, oturum, zaman aşımı, SOCKS5 ve IPv6 çıkış kontrolü, çalışan kodlarla.
Python'da proxy kullanmak için çoğu iş requests ya da httpx kütüphanesine proxy adresini vermekten ibarettir. Asıl sorunlar ayrıntıda çıkar: parolada özel karakter, yanlış şema, zaman aşımı olmaması ve çıkışın gerçekten istediğiniz IP'den yapıldığını doğrulamamak. Bu rehberde her adım çalıştırılabilir kodla gelir.
Örneklerdeki PROXY_HOST, PROXY_PORT, KULLANICI ve PAROLA yer tutucudur; kendi panel bilgilerinizle değiştirin. Python 3.9 ve üstü varsayılmıştır; komutlar Windows ve Linux'ta aynı çalışır, fark yalnızca ortam değişkeni söz diziminde çıkar (aşağıda).
Kurulum
python -m pip install requests httpxWindows'ta python yerine py başlatıcısını kullanabilirsiniz (py -m pip install ...). Linux'ta sistem Python'unu bozmamak için önce bir sanal ortam açmanız önerilir: python3 -m venv .venv, ardından Linux'ta source .venv/bin/activate, Windows'ta .venv\Scripts\activate.
requests ile temel kullanım
requests, proxy'yi proxies sözlüğüyle alır. Anahtar hedefin şemasıdır, değer proxy adresidir.
import requests
PROXY = "http://KULLANICI:PAROLA@PROXY_HOST:PROXY_PORT"
proxies = {"http": PROXY, "https": PROXY}
r = requests.get("https://example.com", proxies=proxies, timeout=(5, 20))
print(r.status_code)https anahtarının değeri de http:// ile başlar. Bu bir hata değildir: istemci proxy'ye düz HTTP ile bağlanır, ardından CONNECT isteğiyle hedefe tünel açar (RFC 9110 §9.3.6 (yeni sekmede açılır)). TLS, tünelin içinde istemci ile hedef arasında kurulur.
Zaman aşımı vermeyi unutmayın
requests varsayılan olarak hiç zaman aşımı uygulamaz. Takılan bir proxy betiğinizi sonsuza dek bekletebilir. timeout=(bağlanma, okuma) biçimindeki iki değerli demet en güvenli yoldur: ilki proxy'ye bağlanma süresini, ikincisi yanıt beklerken iki bayt arasındaki süreyi sınırlar.
Parolada özel karakter
Parola p@ss:w/rd#1 gibi karakterler içeriyorsa adres bozulur. Kimlik bilgisini yüzde kodlamasıyla yazın. Aşağıdaki yardımcı IPv6 proxy adresini de köşeli parantezle sarar (RFC 3986 §3.2.2 (yeni sekmede açılır)).
from urllib.parse import quote
def proxy_url(host, port, user, password, scheme="http"):
if ":" in host: # IPv6 adresi: köşeli parantez gerekir
host = f"[{host}]"
u = quote(user, safe="")
p = quote(password, safe="")
return f"{scheme}://{u}:{p}@{host}:{port}"
print(proxy_url("2001:db8::1", 8080, "KULLANICI", "p@ss:w/rd#1"))
# http://KULLANICI:p%40ss%3Aw%2Frd%231@[2001:db8::1]:80802001:db8::1 belgelendirme aralığından bir örnek adrestir. Adres yazımı konusunda IPv6 adresi nasıl kısaltılır yazısına bakabilirsiniz.
Session ile bağlantıyı yeniden kullanma
Aynı proxy ile çok sayıda istek atacaksanız Session kullanın. Bağlantılar havuzda tutulur, proxy ayarını her çağrıda tekrarlamazsınız.
import requests
s = requests.Session()
s.proxies.update({"http": PROXY, "https": PROXY})
s.headers["User-Agent"] = "gelistirici-testi/1.0"
for url in ["https://example.com", "https://example.org"]:
r = s.get(url, timeout=(5, 20))
print(url, r.status_code)Dikkat edilecek bir ayrıntı: ortam değişkenleri (HTTP_PROXY, HTTPS_PROXY) tanımlıysa requests bunları oturum düzeyindeki proxies ayarının önüne geçirebilir. Beklediğiniz proxy kullanılmıyorsa s.trust_env = False ile ortam değişkenlerini yok sayın ya da her istekte proxies= verin.
Çıkış IP'sini doğrulama
Proxy'nin çalıştığını varsaymak yerine çıkış adresini sorgulayın. api64.ipify.org hem IPv4 hem IPv6 ile erişilebilen bir adres yansıtma hizmetidir; hangi adresle geldiğinizi düz metin olarak döndürür.
import ipaddress
import requests
def cikis_ip(proxies):
r = requests.get("https://api64.ipify.org", proxies=proxies,
timeout=(5, 20))
r.raise_for_status()
return ipaddress.ip_address(r.text.strip())
ip = cikis_ip(proxies)
print(ip, "-> IPv6" if ip.version == 6 else "-> IPv4")Sonuç IPv6 ise trafik IPv6 adresinden çıkıyor demektir. IPv4 görüyorsanız ya proxy çift yığınlı çıkış yapıyordur ya da bağlantı hiç proxy'den geçmemiştir; karşılaştırmak için aynı kodu proxies olmadan çalıştırın. Aynı denetimi tarayıcıdan yapmak için proxy kontrol aracını kullanabilirsiniz.
Hedef sitenin yalnızca IPv4 adresi varsa (AAAA kaydı yoksa) yalnızca IPv6 çıkışlı bir proxy ona doğrudan ulaşamaz. Bu durumda proxy tarafında NAT64/DNS64 çeviri katmanı gerekir. IPv6 Proxy için bu katmanın kapsamı doğrulanmamıştır; önemli işlerden önce kendi hedefinizde deneyin.
Hataları ayırt etme
Tek bir except Exception yerine hata türüne göre davranın. Hangi katmanın başarısız olduğu çözümü belirler.
import requests
from requests.exceptions import (ProxyError, ConnectTimeout,
ReadTimeout, RequestException)
try:
r = requests.get("https://example.com", proxies=proxies,
timeout=(5, 20))
r.raise_for_status()
except ProxyError as e:
print("Proxy hatası (adres, kimlik bilgisi, 407/502):", e)
except ConnectTimeout:
print("Proxy'ye bağlanılamadı: adres, port ya da güvenlik duvarı")
except ReadTimeout:
print("Bağlantı kuruldu ama yanıt gelmedi")
except RequestException as e:
print("Diğer istek hatası:", e)Yanlış kullanıcı adı veya parola genellikle ProxyError olarak görünür; ileti içinde 407 geçer. Aynı belirtilerin cURL tarafındaki karşılığı için cURL ile proxy testi yazısındaki tabloya bakın.
httpx ile proxy
httpx, requests'e benzer ama eşzamansız çalışabilir. Tek proxy için proxy= parametresi yeterlidir.
import httpx
timeout = httpx.Timeout(20.0, connect=5.0)
with httpx.Client(proxy=PROXY, timeout=timeout) as client:
r = client.get("https://api64.ipify.org")
print(r.text)Eşzamansız sürüm:
import asyncio
import httpx
async def main():
async with httpx.AsyncClient(proxy=PROXY, timeout=20.0) as client:
r = await client.get("https://api64.ipify.org")
print(r.text)
asyncio.run(main())Eski örneklerde görülen httpx.Client(proxies=...) httpx 0.26'da kullanımdan kaldırıldı ve sonraki sürümlerde çıkarıldı. Eski bir kod tabanında hata alırsanız proxies= yerine proxy= ya da mounts= kullanın.
mounts ile desene göre proxy
Bazı adreslerin proxy'den geçmesini, bazılarının geçmemesini istiyorsanız mounts kullanın. Anahtar bir URL desenidir, değer taşıma katmanıdır; None o deseni proxy'siz bırakır.
import httpx
mounts = {
"all://": httpx.HTTPTransport(proxy=PROXY),
"all://localhost": None,
"all://127.0.0.1": None,
}
with httpx.Client(mounts=mounts) as client:
print(client.get("https://api64.ipify.org").text)SOCKS5 ile kullanım
SOCKS5 için ek bir paket gerekir. Protokolün kendisi RFC 1928 (yeni sekmede açılır) ve kullanıcı adı/parola doğrulaması RFC 1929 (yeni sekmede açılır) ile tanımlıdır; parola ağda düz metin gider, bu yüzden güvenilmeyen ağlarda dikkatli olun.
python -m pip install "requests[socks]" "httpx[socks]"import requests
SOCKS = "socks5h://KULLANICI:PAROLA@PROXY_HOST:PROXY_PORT"
proxies = {"http": SOCKS, "https": SOCKS}
print(requests.get("https://api64.ipify.org", proxies=proxies,
timeout=(5, 20)).text)socks5h ile alan adı çözümü proxy'ye bırakılır; yalnızca socks5 yazarsanız çözümleme sizin makinenizde yapılır. httpx belgeleri SOCKS için socks5:// şemasını kullanır: httpx.Client(proxy="socks5://KULLANICI:PAROLA@PROXY_HOST:PROXY_PORT").
Her proxy ürünü SOCKS5 sunmaz. IPv6 Proxy paket özelliklerinde protokol HTTP(S) olarak geçer; SOCKS5 gerekiyorsa sipariş öncesi destekten teyit alın.
Ortam değişkeniyle proxy
Kodu değiştirmeden proxy vermek isterseniz iki kütüphane de HTTP_PROXY, HTTPS_PROXY, ALL_PROXY ve NO_PROXY değişkenlerini okur. Söz dizimi kabuğa göre değişir.
# Linux ve macOS
export HTTPS_PROXY="http://KULLANICI:PAROLA@PROXY_HOST:PROXY_PORT"
export NO_PROXY="localhost,127.0.0.1"# Windows PowerShell
$env:HTTPS_PROXY = "http://KULLANICI:PAROLA@PROXY_HOST:PROXY_PORT"
$env:NO_PROXY = "localhost,127.0.0.1"Windows komut isteminde (cmd) karşılığı set HTTPS_PROXY=... biçimindedir ve tırnak kullanılmaz. Bu değişkenler yalnızca o kabuk oturumunda geçerlidir. Parola komut geçmişinde ve süreç listesinde görünebileceğinden, kalıcı işlerde kimlik bilgisini bir yapılandırma dosyasında veya gizli bilgi yöneticisinde tutun.
Kontrol listesi
- Her istekte
timeoutverin. - Parolayı
quote(..., safe="")ile kodlayın; IPv6 proxy adresini köşeli parantezle yazın. - Çıkış IP'sini
api64.ipify.orgile doğrulayın ve sürümüne (ip.version) bakın. - Hata türlerini ayırın:
ProxyError,ConnectTimeout,ReadTimeout. - SOCKS5 için
requests[socks]ya dahttpx[socks]kurun ve alan adı çözümü gerekiyorsasocks5hkullanın.
Veri toplama gibi işlerde yasalara ve hedef sitenin kullanım koşullarına uyum sizin sorumluluğunuzdadır; hız sınırı koyun ve yalnızca kamuya açık veriyle çalışın. Kullanım bağlamı için web scraping çözümü sayfasına, paket ayrıntıları için IPv6 Proxy ürün sayfasına bakabilirsiniz; Node.js tarafı için Node.js ile proxy kullanımı yazısı hazırdır.
Sık sorulan sorular
requests'te proxies sözlüğünde https anahtarı ne işe yarar?
Anahtar, hedef adresin şemasını (http ya da https) seçer; değer ise proxy'nin kendi adresidir. HTTPS hedefler için bile proxy adresi çoğunlukla http:// ile başlar, çünkü istemci proxy'ye düz bağlanıp CONNECT ile tünel açar.
Parolamda @ ve # gibi karakterler varsa ne yapmalıyım?
Kullanıcı adı ve parolayı urllib.parse.quote(değer, safe="") ile yüzde kodlamasından geçirip proxy adresine yazın. Kodlanmamış @ adresin nerede bittiğini bozar ve kimlik doğrulama sessizce başarısız olur.
SOCKS5 kullanırken socks5 ile socks5h arasındaki fark nedir?
Şema olarak socks5h:// yazılırsa alan adını proxy çözer, socks5:// yazılırsa istemci kendi makinesinde çözer. IPv6 çıkışlı bir proxy ile çalışırken alan adı çözümünün proxy tarafında yapılması çoğu zaman istediğiniz davranıştır.
httpx'te proxies parametresi neden hata veriyor?
httpx 0.26 sürümünde proxies kullanımdan kaldırıldı ve sonraki sürümlerde çıkarıldı. Tek proxy için proxy=, desene göre farklı proxy için mounts= kullanın.
/112İlgili sayfalar
- RehbercURL ile Proxy Testi ve Sorun GidermecURL ile proxy nasıl test edilir: -x, kimlik doğrulama, socks5 ve socks5h, -v ile CONNECT gözlemi, zaman aşımı, IPv6…
- RehberNode.js ile Proxy Kullanımı: undici ve fetchNode.js 20 ve 22'de fetch, undici ProxyAgent, https modülü ile CONNECT ve socks-proxy-agent kullanımı; kimlik…
- AraçProxy KontrolHTTP, HTTPS ve SOCKS5 proxy bağlantısını sınar
- AraçIPv6 Adres KontrolüAdresin geçerliliğini, türünü ve kapsamını çözümler
/128Ürün
IPv6 Proxy ürününü inceleyin
Adet bazlı fiyatlanan IPv6 proxy paketleri. Satışı Sağlam Proxy (saglamproxy.com) üzerinden yapılır.