Python'da proxy kullanmak birkaç satırlık bir iştir, ama protokole ve kütüphaneye göre ufak farklar vardır. HTTP proxy requests ile doğrudan çalışır; SOCKS5 için ek bir paket gerekir ve alan adı çözümlemesinin nerede yapıldığına dikkat etmek gerekir.
Bu yazıda requests, httpx ve aiohttp için çalışır örnekler, oturum yönetimi, zaman aşımı ve çıkış IP doğrulama bulacaksınız. Örneklerdeki proxy.example.com, PORT, KULLANICI ve PAROLA yer tutucudur; kendi paket bilgilerinizi yazın. Kodlar yalnızca izinli ve yasal kullanım için yazılmıştır.
requests ile HTTP proxy
requests kütüphanesinde proxy, bir sözlükle verilir. Anahtar hedefin şemasıdır; değer ise proxy adresidir. HTTPS hedefler için de proxy adresi http:// ile başlar, çünkü istemci proxy'ye HTTP üzerinden bağlanır ve CONNECT ile tünel kurar.
import requests
PROXY = "http://KULLANICI:[email protected]:PORT"
proxies = {"http": PROXY, "https": PROXY}
r = requests.get("https://api.ipify.org", proxies=proxies, timeout=(5, 20))
r.raise_for_status()
print("Çıkış IP:", r.text)Zaman aşımı değeri iki parçalıdır: bağlantı için 5, yanıt okuma için 20 saniye. Zaman aşımı vermezseniz requests süresiz bekleyebilir; bu nedenle her istekte vermeniz iyi bir alışkanlıktır.
Parolada @, : ya da / gibi karakterler varsa urllib.parse.quote ile kodlayın. Protokol farkının arka planı için HTTP ve SOCKS5 farkı yazısına bakabilirsiniz.
SOCKS5 için ek paket ve socks5h farkı
requests SOCKS5 için PySocks bağımlılığına ihtiyaç duyar. Kurulumu requests ek paketiyle yapılır:
pip install "requests[socks]"import requests
PROXY = "socks5h://KULLANICI:[email protected]:PORT"
proxies = {"http": PROXY, "https": PROXY}
r = requests.get("https://api.ipify.org", proxies=proxies, timeout=(5, 20))
print(r.text)Şemadaki h harfi önemlidir. socks5:// alan adını yerel makinede çözer, socks5h:// ise çözümlemeyi proxy'ye bırakır. Hangi alan adlarına gittiğinizin yerel ağda görünmesini istemiyorsanız socks5h tercih edilir. Hangi protokolün size uygun olduğunu HTTP & SOCKS5 proxy sayfasından da görebilirsiniz.
Oturum, yeniden deneme ve istek aralığı
Aynı proxy ile çok sayıda istek gönderiyorsanız requests.Session kullanın. Oturum bağlantıları yeniden kullanır ve proxy ayarını bir kez tanımlamanızı sağlar. Yeniden denemeleri ise urllib3 Retry yapısıyla yönetebilirsiniz.
import time
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
PROXY = "http://KULLANICI:[email protected]:PORT"
session = requests.Session()
session.proxies.update({"http": PROXY, "https": PROXY})
retry = Retry(
total=3,
backoff_factor=1.0,
status_forcelist=(429, 502, 503, 504),
respect_retry_after_header=True,
)
adapter = HTTPAdapter(max_retries=retry)
session.mount("http://", adapter)
session.mount("https://", adapter)
urls = ["https://example.com/", "https://example.org/"]
for url in urls:
resp = session.get(url, timeout=(5, 20))
print(url, resp.status_code)
time.sleep(1.0) # istekler arasında bekleyinYeniden deneme listesine 429 ve 5xx kodlarını eklemek mantıklıdır, ama 407 ve 403 gibi kodları körü körüne yeniden denememelisiniz; bunlar çoğunlukla kimlik bilgisi ya da erişim sorunudur. Ayrıntı için proxy hataları 407, 403, 429 yazısına bakın.
httpx ve aiohttp ile eşzamansız kullanım
httpx modern sürümlerde proxy parametresini alır; eski proxies argümanı kaldırılmaya yönelik olduğundan sürümünüzün belgelerini kontrol edin. SOCKS5 için httpx[socks] kurulmalıdır.
import asyncio
import httpx
PROXY = "http://KULLANICI:[email protected]:PORT"
async def main() -> None:
async with httpx.AsyncClient(proxy=PROXY, timeout=20.0) as client:
r = await client.get("https://api.ipify.org")
print(r.text)
asyncio.run(main())aiohttp HTTP proxy'yi her istekte proxy parametresiyle alır. SOCKS5 için ayrı bir bağlayıcı paket (örneğin aiohttp-socks) gerekir.
import asyncio
import aiohttp
PROXY = "http://proxy.example.com:PORT"
async def main() -> None:
auth = aiohttp.BasicAuth("KULLANICI", "PAROLA")
timeout = aiohttp.ClientTimeout(total=20)
async with aiohttp.ClientSession(timeout=timeout) as session:
async with session.get("https://api.ipify.org", proxy=PROXY, proxy_auth=auth) as r:
print(await r.text())
asyncio.run(main())Doğrulama ve sorumlu kullanım
Kodunuzu hedefe yönlendirmeden önce çıkış adresinin beklediğiniz adres olduğunu kontrol edin. Örneklerdeki api.ipify.org çağrısı bu işi görür; web arayüzünden doğrulama için IP Adresim, toplu kontrol için Proxy Kontrol aracını kullanabilirsiniz. Yöntemlerin tamamı proxy nasıl test edilir yazısındadır.
- Kimlik bilgilerini koda gömmeyin; ortam değişkeni ya da gizli bilgi yönetimi kullanın.
- Hedef sitenin
robots.txtdosyasına ve kullanım koşullarına uyun; istekleri makul aralıklarla gönderin. - Kişisel veri işliyorsanız yürürlükteki mevzuata uyun.
Geliştirici odaklı özet için geliştiriciler sayfasına, veri toplama senaryoları için web scraping çözüm sayfasına bakabilirsiniz.