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.

Pakete göre proxy şeması
PaketPython'da kullanılacak şemaNot
Mobil Proxy Türkiye, haftalık ve aylıkSipariş 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öreFormda protokol alanı yoktur; satın almadan önce WhatsApp'tan teyit edin
Rotating Mobil Proxy Türkiyehttp://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 aiohttp
Sanal ortam ve paketlerin kurulumu

requests 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"])
requests ile HTTP proxy üzerinden istek

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"])
requests ile SOCKS5; alan adı proxy tarafında çözülür

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"
Kimlik bilgilerini ortam değişkeni olarak tanımlama

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"])
Ortam değişkeninden okunan ve URL kodlamasıyla güvenli hale getirilen proxy adresi

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)
requests ile sınırlı yeniden deneme ve hata türlerine göre yakalama

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"])
httpx senkron istemci ile HTTP proxy

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())
httpx asenkron istemci ve sınırlı eşzamanlılık

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())
aiohttp ile HTTP proxy ve ayrı kimlik bilgisi

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.

requests ile proxy hataları ve ilk kontrol
Mesajda geçen ifadeOlası nedenNe yapmalı
407 Proxy Authentication RequiredKullanıcı adı ya da şifre hatalı, özel karakter kodlanmamışBilgileri ortam değişkeninden yeniden okuyun; quote ile kodlayın
Missing dependencies for SOCKS supportSOCKS ek paketi kurulu değilpip install "requests[socks]" komutunu çalıştırın
ConnectTimeout ya da Max retries exceededProxy adresine veya portuna ulaşılamıyor, hat yeniden bağlanıyor olabilirAdres 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 tersiPaketinizin protokolüyle şemayı eşleştirin
SSLErrorAraya giren bir ağ cihazı ya da yanlış şema; HTTP proxy adresini https:// ile yazmakProxy 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

  1. Her istekte bir zaman aşımı değeri verin.
  2. Kimlik bilgilerini ortam değişkeninden okuyun ve URL kodlamasıyla yerleştirin.
  3. SOCKS5 kullanıyorsanız socks5h:// şemasını tercih edin ve paketinizin SOCKS5 sunduğundan emin olun.
  4. Yeniden denemeleri sınırlı tutun, 429 yanıtında bekleyin.
  5. Eşzamanlı istek sayısını hedef siteyi yormayacak düzeyde sınırlayın.
  6. 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

Tüm sorular

Satın alma adımı

Paketleri inceleyin

Python projeniz için Mobil Proxy paketlerini ve protokol seçeneklerini inceleyin.

Satın alma, güvenli ödeme sayfasında tamamlanır.

WhatsApp'tan sorun (WhatsApp, yeni sekmede açılır)+90 850 550 34 60