Teknik
Python ile Mobil Proxy Kullanımı (requests, httpx, SOCKS5)
Kısaca
Python'da mobil proxy kullanmak için istemciye bir proxy adresi vermeniz yeterlidir: requests ve httpx bunu http://KULLANICI_ADI:[email protected]:PORT biçiminde alır, SOCKS5 için socks5h:// şeması ve ek paket gerekir. Bu rehber çalışan örneklerin yanında zaman aşımı, yeniden deneme ve kimlik bilgisi güvenliğini de anlatır.
Son güncelleme: Okuma süresi: yaklaşık 7 dk
Başlamadan önce
Örneklerde gerçek bağlantı bilgileri yerine KULLANICI_ADI, SIFRE, proxy.example.com ve PORT yer tutucularını kullanıyoruz; siz paketinizin bağlantı bilgilerini yazın. Kod Python 3.9 ve üstü için yazıldı. Çıkış IP'sini görmek için herkese açık bir test hizmeti olan httpbin.org/ip adresini kullanıyoruz; dilerseniz kendi doğrulama adresinizi kullanabilirsiniz. Önce bilgilerin çalıştığını tarayıcıda IP Adresim ya da Proxy Kontrol aracıyla görmek, koddaki hatayı proxy'deki hatadan ayırmanızı kolaylaştırır.
| Paket | Python'da kullanılacak şema | Not |
|---|---|---|
| Mobil Proxy Türkiye, haftalık ve aylık | Sipariş formunda seçtiğiniz protokole göre http:// ya da socks5h:// | Protokol siparişte seçilir |
| Mobil Proxy Türkiye günlük ve yurt dışı | Size verilen protokole göre | Formda protokol alanı yoktur; satın almadan önce WhatsApp'tan teyit edin |
| Rotating Mobil Proxy Türkiye | http:// | Sağlayıcı beyanına göre yalnızca HTTP ve HTTPS; SOCKS5 sunulmaz |
| Rotating Mobil Proxy yurt dışı | http:// ya da socks5h:// | Sağlayıcı beyanına göre SOCKS5 de sunulur |
Ürün bilgileri satıcının ürün sayfalarında belirtilen bilgilere dayanır; ölçülmüş bir sonuç ya da taahhüt değildir.
Bash
python -m venv .venv
# Windows: .venv\Scripts\activate macOS/Linux: source .venv/bin/activate
pip install requests "requests[socks]" httpx aiohttprequests ile HTTP proxy
requests, proxy'yi şemaya göre eşleyen bir sözlükle alır. Sözlükteki https anahtarı hedefin şemasını anlatır, proxy'nin değil: HTTPS sitelere giden istekler de HTTP proxy üzerinden CONNECT tüneliyle taşınır. Bu yüzden iki anahtara da aynı http:// adresi yazılır.
Python
import requests
PROXY_URL = "http://KULLANICI_ADI:SIFRE@proxy.example.com:PORT"
PROXIES = {"http": PROXY_URL, "https": PROXY_URL}
# timeout=(bağlantı, okuma) saniye cinsinden; vermezseniz istek süresiz bekleyebilir
yanit = requests.get("https://httpbin.org/ip", proxies=PROXIES, timeout=(10, 30))
yanit.raise_for_status()
print("Çıkış IP'si:", yanit.json()["origin"])timeout parametresini hiçbir zaman atlamayın. requests varsayılan olarak zaman aşımı uygulamaz; mobil hat yeniden bağlanırken ya da proxy yanıt vermediğinde betiğiniz sonsuza kadar bekleyebilir. İki değerli biçim, bağlantı kurma ve yanıt okuma için ayrı sınırlar koymanızı sağlar.
Çok sayıda istek göndereceğiniz işlerde requests.Session kullanmak bağlantıları yeniden kullanarak her istekte yeni bir TCP ve TLS kurulumu yapılmasını önler. Bu, sabit hatlı bir pakette verimli bir davranıştır. Her istekte değişen IP ile çalışan rotating paketlerde ise aynı bağlantının yeniden kullanılması art arda isteklerin aynı tünelden gitmesine yol açabilir; bu ayrımı aşağıdaki rotasyon bölümünde ele alıyoruz.
requests ile SOCKS5 (socks5h)
SOCKS5 için önce requests[socks] ekini kurun. Şemadaki h harfi önemlidir: socks5h:// alan adını proxy tarafında çözdürür, socks5:// ise adı kendi bilgisayarınızda çözüp proxy'ye yalnızca IP gönderir. İkinci durumda yerel DNS sorgularınız kendi bağlantınızdan çıkar. Farkın arka planı HTTP ve SOCKS5 Proxy Farkı rehberinde anlatılır.
Python
# pip install "requests[socks]"
import requests
PROXY_URL = "socks5h://KULLANICI_ADI:SIFRE@proxy.example.com:PORT"
PROXIES = {"http": PROXY_URL, "https": PROXY_URL}
yanit = requests.get("https://httpbin.org/ip", proxies=PROXIES, timeout=(10, 30))
print("Çıkış IP'si:", yanit.json()["origin"])Kimlik bilgileri: ortam değişkenleri ve özel karakterler
Gerçek projelerde şifreyi koda yazmak yerine ortam değişkeninden okuyun. Aynı adımda kullanıcı adını ve şifreyi urllib.parse.quote ile kodlayın: şifrede @, :, / ya da # varsa kodlanmamış adres yanlış ayrıştırılır ve hata, kimlik doğrulama sorunu gibi görünür. safe="" parametresi / karakterinin de kodlanmasını sağlar.
Bash
# macOS / Linux
export PROXY_KULLANICI="KULLANICI_ADI"
export PROXY_SIFRE="SIFRE"
export PROXY_HOST="proxy.example.com"
export PROXY_PORT="PORT"
# Windows PowerShell
$env:PROXY_KULLANICI = "KULLANICI_ADI"
$env:PROXY_SIFRE = "SIFRE"
$env:PROXY_HOST = "proxy.example.com"
$env:PROXY_PORT = "PORT"Python
import os
from urllib.parse import quote
import requests
def proxy_adresi(sema: str = "http") -> str:
kullanici = quote(os.environ["PROXY_KULLANICI"], safe="")
sifre = quote(os.environ["PROXY_SIFRE"], safe="")
host = os.environ["PROXY_HOST"]
port = os.environ["PROXY_PORT"]
return f"{sema}://{kullanici}:{sifre}@{host}:{port}"
adres = proxy_adresi("http") # SOCKS5 sunulan paketlerde: proxy_adresi("socks5h")
yanit = requests.get(
"https://httpbin.org/ip",
proxies={"http": adres, "https": adres},
timeout=(10, 30),
)
print(yanit.json()["origin"])requests ortam değişkenlerini kendiliğinden okur
HTTP_PROXY, HTTPS_PROXY ve NO_PROXY tanımlıysa requests bunları varsayılan olarak kullanır. HTTPS_PROXY değerinin de http:// ile başlaması doğrudur, çünkü şema proxy'nin konuştuğu protokolü anlatır. Bu değişkenler, bir Session nesnesine atadığınız proxy ayarının önüne geçebilir; beklenmedik bir çıkış görüyorsanız proxy'yi her istekte proxies= parametresiyle verin ya da session.trust_env = False kullanın.
Yeniden deneme ve hata yakalama
Mobil hatlar doğası gereği yeniden bağlanabilir; özellikle IP değişimi sırasında kısa süreli bağlantı hataları görmeniz olağandır. Bunu her hatada betiği durdurarak değil, sınırlı ve giderek seyrekleşen yeniden denemelerle karşılayın. urllib3'ün Retry sınıfı bu işi requests içinde yapar.
Python
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
PROXY_URL = "http://KULLANICI_ADI:SIFRE@proxy.example.com:PORT"
PROXIES = {"http": PROXY_URL, "https": PROXY_URL}
yeniden_deneme = Retry(
total=3, # en fazla üç yeniden deneme
backoff_factor=1.0, # denemeler arasında giderek artan bekleme
status_forcelist=(429, 502, 503, 504),
allowed_methods=frozenset({"GET", "HEAD"}),
respect_retry_after_header=True,
)
adaptor = HTTPAdapter(max_retries=yeniden_deneme)
oturum = requests.Session()
oturum.mount("http://", adaptor)
oturum.mount("https://", adaptor)
try:
yanit = oturum.get("https://httpbin.org/ip", proxies=PROXIES, timeout=(10, 30))
yanit.raise_for_status()
print(yanit.json()["origin"])
except requests.exceptions.ProxyError as hata:
# Proxy'ye ulaşılamadı ya da kimlik doğrulama reddedildi (ör. 407)
print("Proxy hatası:", type(hata).__name__)
except requests.exceptions.Timeout:
print("Zaman aşımı: hat yeniden bağlanıyor olabilir, biraz sonra tekrar deneyin.")
except requests.exceptions.HTTPError as hata:
print("Hedef site hata döndürdü:", hata.response.status_code)Hata mesajını yazdırırken proxy adresini tam olarak kayda geçirmemeye dikkat edin; adres şifreyi içerir. Örnekte bu yüzden yalnızca hata türü yazdırılır. 429 yanıtında Retry-After başlığına uymak, hedef sitenin koyduğu sınıra saygı göstermenin en basit yoludur. Yaygın hata mesajlarının ne anlama geldiğini Mobil Proxy Sorun Giderme rehberinde bulabilirsiniz.
httpx ile senkron ve asenkron kullanım
httpx, requests'e benzer bir arayüzle hem senkron hem asenkron istemci sunar. Güncel sürümlerde proxy tek bir proxy parametresiyle verilir; eski kodlarda gördüğünüz proxies parametresi kaldırılmıştır. SOCKS desteği httpx[socks] ekiyle gelir; şema ve alan adı çözümleme davranışı için kütüphanenin belgelerine bakın.
Python
# pip install httpx
import httpx
PROXY_URL = "http://KULLANICI_ADI:SIFRE@proxy.example.com:PORT"
zaman_asimi = httpx.Timeout(30.0, connect=10.0)
with httpx.Client(proxy=PROXY_URL, timeout=zaman_asimi) as istemci:
yanit = istemci.get("https://httpbin.org/ip")
yanit.raise_for_status()
print(yanit.json()["origin"])Asenkron istemciyle çok sayıda isteği aynı anda gönderebilirsiniz; ancak eşzamanlılığı sınırlamak sizin sorumluluğunuzdur. Aşağıdaki örnek bir semafor ile aynı anda en fazla üç istek gönderir. Sayıyı hedef sitenin kurallarına ve paketinizin koşullarına göre seçin.
Python
import asyncio
import httpx
PROXY_URL = "http://KULLANICI_ADI:SIFRE@proxy.example.com:PORT"
ADRESLER = [
"https://example.com/",
"https://example.org/",
"https://example.net/",
]
async def getir(istemci: httpx.AsyncClient, sinir: asyncio.Semaphore, adres: str) -> tuple[str, int]:
async with sinir:
yanit = await istemci.get(adres)
return adres, yanit.status_code
async def main() -> None:
sinir = asyncio.Semaphore(3)
async with httpx.AsyncClient(proxy=PROXY_URL, timeout=30.0) as istemci:
sonuclar = await asyncio.gather(*(getir(istemci, sinir, a) for a in ADRESLER))
for adres, durum in sonuclar:
print(durum, adres)
asyncio.run(main())aiohttp ile kullanım
aiohttp proxy'yi istemci oturumuna değil her isteğe parametre olarak alır. Kimlik bilgisini BasicAuth nesnesiyle ayrı verdiğinizde özel karakterleri kodlamanız gerekmez. aiohttp yerleşik olarak yalnızca HTTP proxy destekler; SOCKS5 için üçüncü taraf bir bağlayıcı paket gerekir.
Python
# pip install aiohttp
import asyncio
import aiohttp
PROXY = "http://proxy.example.com:PORT"
async def main() -> None:
kimlik = aiohttp.BasicAuth("KULLANICI_ADI", "SIFRE")
zaman_asimi = aiohttp.ClientTimeout(total=30, connect=10)
async with aiohttp.ClientSession(timeout=zaman_asimi) as oturum:
async with oturum.get("https://httpbin.org/ip", proxy=PROXY, proxy_auth=kimlik) as yanit:
veri = await yanit.json()
print("Çıkış IP'si:", veri["origin"])
asyncio.run(main())Rotasyon ve IP değişimiyle çalışmak
Rotating Mobil Proxy paketlerinde sağlayıcı beyanına göre varsayılan davranış her istekte değişen bir mobil IP'dir ve koddan ayrıca bir şey yapmanız gerekmez. Ancak yukarıda anlatıldığı gibi istemcinin bağlantıyı yeniden kullanması, art arda isteklerin aynı tünelden gitmesine yol açabilir. Bağımsız istekleri gözlemlemek istiyorsanız her isteği ayrı bir bağlantıyla gönderin; requests'te oturum nesnesi yerine doğrudan requests.get çağırmak bunu sağlar. Sticky oturumun isteğe nasıl ekleneceği ve süresi yayımlanmadığı için bu rehber bir yazım örneği vermez; kullanacaksanız WhatsApp'tan teyit edin.
Mobil Proxy paketlerinde ise sağlayıcı beyanına göre her pakete ait bir IP değiştirme bağlantısı vardır ve bu bağlantıyı bir betikten de çağırabilirsiniz. Değişimin ne kadar sürdüğü yayımlanmamıştır; bu yüzden sabit bir bekleme süresine güvenmek yerine değişimden sonra çıkış IP'sini yeniden okuyun, yeni adresi gördüğünüzde işinize devam edin ve bu döngüye bir üst deneme sınırı koyun. Yöntemlerin ayrıntısı Mobil Proxy IP Değiştirme Yöntemleri rehberindedir.
Sık görülen hata mesajları
Python kütüphaneleri proxy sorunlarını farklı adlarla raporlar. Mesajı doğru okumak, sorunun kimlik bilgisinde mi, protokolde mi yoksa ağda mı olduğunu çoğu zaman tek bakışta söyler. Aşağıdaki tablo requests ile en sık karşılaşılan durumları özetler; httpx ve aiohttp benzer durumlar için kendi hata sınıflarını kullanır.
| Mesajda geçen ifade | Olası neden | Ne yapmalı |
|---|---|---|
407 Proxy Authentication Required | Kullanıcı adı ya da şifre hatalı, özel karakter kodlanmamış | Bilgileri ortam değişkeninden yeniden okuyun; quote ile kodlayın |
Missing dependencies for SOCKS support | SOCKS ek paketi kurulu değil | pip install "requests[socks]" komutunu çalıştırın |
ConnectTimeout ya da Max retries exceeded | Proxy adresine veya portuna ulaşılamıyor, hat yeniden bağlanıyor olabilir | Adres ve portu kontrol edin; kısa bir beklemeden sonra yeniden deneyin |
RemoteDisconnected ya da bağlantının hemen kapanması | Protokol karışmış: SOCKS5 bilgisine http:// ile bağlanmak ya da tersi | Paketinizin protokolüyle şemayı eşleştirin |
SSLError | Araya giren bir ağ cihazı ya da yanlış şema; HTTP proxy adresini https:// ile yazmak | Proxy adresini http:// ile yazın; sertifika doğrulamasını kapatmayın |
Hata metinleri kütüphane sürümüne göre değişebilir.
Bir sorunu kodda ayıklamadan önce aynı bilgilerle tek satırlık bir curl denemesi yapmak, hatanın Python'a mı yoksa proxy bağlantısına mı ait olduğunu ayırır. curl çalışıyor ama Python çalışmıyorsa sorun büyük olasılıkla şemada, kodlamada ya da ortam değişkenlerindedir. verify=False ile sertifika doğrulamasını kapatmak bir çözüm değildir; aradaki bağlantının güvenliğini ortadan kaldırır ve asıl sorunu gizler.
Çıkış IP’sini işin parçası olarak kaydetmek
Proxy ile yapılan her ölçümün yanında hangi çıkış IP'sinden yapıldığını bilmek, sonuçları sonradan yorumlamanın tek güvenilebilir yoludur. Uzun süren işlerde belirli aralıklarla ya da her IP değişiminden sonra çıkış adresini okuyup ölçüm kaydınıza eklemek, beklenmedik bir sonucun hat değişiminden mi yoksa hedef sitedeki bir değişiklikten mi kaynaklandığını ayırmanızı sağlar. Bu kayıtlarda kimlik bilgisi değil, yalnızca adres ve zaman bulunmalıdır.
Kontrol listesi
- Her istekte bir zaman aşımı değeri verin.
- Kimlik bilgilerini ortam değişkeninden okuyun ve URL kodlamasıyla yerleştirin.
- SOCKS5 kullanıyorsanız
socks5h://şemasını tercih edin ve paketinizin SOCKS5 sunduğundan emin olun. - Yeniden denemeleri sınırlı tutun, 429 yanıtında bekleyin.
- Eşzamanlı istek sayısını hedef siteyi yormayacak düzeyde sınırlayın.
- Kayıtlarda ve hata mesajlarında proxy adresini tam olarak yazdırmayın.
Diğer diller için aynı mantığın örnekleri Geliştiriciler sayfasında yer alır. Tarayıcı ve işletim sistemi tarafındaki kurulum için Mobil Proxy Kurulum Rehberi rehberine bakın.
Sorumlu kullanım
Proxy'yi yalnızca hedef sitenin kullanım koşullarına ve yürürlükteki mevzuata uygun işlerde kullanın. Kamuya açık veriyi toplarken robots.txt kurallarına uyun ve siteyi yormayacak bir hız seçin.
Sık sorulan sorular
requests SOCKS desteğini ayrı bir ek paketle sağlar. pip install "requests[socks]" komutu gerekli bağımlılığı (PySocks) kurar. Kurulumdan sonra proxy adresini socks5h:// şemasıyla yazın; böylece alan adları proxy tarafında çözülür.
Proxy adresi kullanıcı:şifre@sunucu:port biçiminde ayrıştırılır; şifredeki @, :, / ya da # bu ayrıştırmayı bozar ve istemci yanlış sunucuya bağlanmaya çalışır ya da kimlik doğrulama başarısız görünür. Kullanıcı adını ve şifreyi urllib.parse.quote(değer, safe="") ile kodlayarak adrese yerleştirin. aiohttp'de BasicAuth kullanıyorsanız kodlama gerekmez.
Python istemcileri bağlantıları yeniden kullanır. HTTPS isteklerinde proxy üzerinden açılan CONNECT tüneli aynı hedefe giden sonraki isteklerde de kullanılabilir; bu durumda art arda istekler aynı çıkıştan gidebilir. Bağımsız istekleri gözlemlemek için her isteği ayrı bir bağlantıyla gönderin. Ayrıca mobil adresler paylaşımlı olduğu için aynı IP'nin tekrar görünmesi olağandır.
Hayır. Sağlayıcı beyanına göre Rotating Mobil Proxy'nin Türkiye paketlerinde HTTP ve HTTPS bulunur, SOCKS5 sunulmaz. Bu paketlerde http:// şemalı örnekleri kullanın. SOCKS5 örnekleri, SOCKS5'in sunulduğu paketler içindir.
Kod depoya gönderildiğinde, paylaşıldığında ya da bir hata kaydına düştüğünde şifre de gider. Bilgileri ortam değişkenlerinde ya da bir gizli bilgi kasasında tutun, .env dosyası kullanıyorsanız onu sürüm kontrolünün dışında bırakın ve hata mesajlarında proxy adresini tam olarak yazdırmayın.