# Python'da dönen konut proxyler: requests, httpx ve aiohttp

> Python'da dönen konut proxyler: requests ile yeniden denemeler, httpx senkron ve asenkron, aiohttp, yapışkan oturumlar ve byte sayımları. Söz dizimi denetlenmiş kod.

- URL: https://crawlrelay.com/tr/docs/python/
- Son güncelleme: 2026-10-13
- Publisher: CrawlRelay (https://crawlrelay.com)

Üretim desenleri, tek satırlık değil: Retry-After'a saygı duyan yeniden denemeler, isteğe özel yeni IP ya da akış başına bir IP, asyncio'da host başına eşzamanlılık ve her sayfanın gerçek byte maliyeti.

**Hızlı cevap — Python'da dönen konut proxyleri nasıl kullanırım?**

Hem requests'te `http` hem de `https` için proxy olarak `http://USERNAME:PASSWORD@gw.crawlrelay.com:7777` geçin, httpx 0.26+'da `proxy=` olarak veya aiohttp'da isteğe özel `proxy=` olarak kullanın. **CrawlRelay** konut proxyleri her yeni bağlantıda döner ve kullanıcı adında `-session-<id>` ile yapışkan kalır. 1 GB için $1,50 ve 50 GB’dan itibaren $0,50/GB maliyetlidir. KYC olmadan, kripto ile ödenir.

## Python kurulumu kısa bakış

| Özellik | Değer |
| --- | --- |
| requests | `proxies={"http": url, "https": url}`; urllib3 üzerinden yeniden denemeler `Retry` |
| httpx | `httpx.Client(proxy=url)`; eski `proxies=` argümanı httpx 0.28'de kaldırıldı |
| aiohttp | `session.get(url, proxy="http://USER:PASS@host:port")`, proxy URL'sinde kimlik bilgileri |
| SOCKS5 | `pip install "requests[socks]"` veya `httpx[socks]`, ardından `socks5h://`, port 7778 |
| İstek başına yeni IP | Keep-alive devre dışı bırak: `Connection: close`, `max_keepalive_connections=0` veya `force_close=True` |
| Aynı akış için aynı IP | Kullanıcı adında `-session-<id>-ttl-<minutes>`, 30 dakikaya kadar |
| Proxy URL şeması | HTTP portu için her zaman `http://` kullanın, HTTPS sitelerde bile |

## Retry-After'a uyan yeniden denemelerle requests ile proxy nasıl kullanılır?

Bir `HTTPAdapter`'ı urllib3'ün `Retry` üzerine`Session` olarak kurun. Bağlantı hatalarını ve sizin listelediğiniz statü kodlarını tekrar dener, üstel geri çekilme ile bekler ve sitelerin 429 ve 503 ile gönderdikleri `Retry-After` başlığını dikkate alır. Proxy’nizi geçersiz kılabilecek kalmış `HTTPS_PROXY` değişkenini önlemek için `trust_env = False` ayarlayın.

*requests + urllib3 Retry*

```python
import os

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

USER = os.environ.get("CRAWLRELAY_USER", "USERNAME-country-us")
PASSWORD = os.environ.get("CRAWLRELAY_PASSWORD", "PASSWORD")
PROXY = "http://%s:%s@gw.crawlrelay.com:7777" % (USER, PASSWORD)

retry = Retry(
    total=4,
    connect=2,
    backoff_factor=1.0,  # waits of 0 s, 2 s, 4 s, 8 s (Retry-After wins on 429/503)
    status_forcelist=(429, 502, 503, 504),
    allowed_methods=frozenset({"GET", "HEAD"}),
    respect_retry_after_header=True,
)

session = requests.Session()
session.trust_env = False  # ignore HTTP(S)_PROXY from the environment
session.mount("http://", HTTPAdapter(max_retries=retry))
session.mount("https://", HTTPAdapter(max_retries=retry))
session.proxies = {"http": PROXY, "https": PROXY}
session.headers["User-Agent"] = "ExampleCrawler/1.0 (+https://example.com/crawler-info)"
session.headers["Connection"] = "close"  # new connection per request, so usually a new exit IP

r = session.get("https://api.ipify.org", timeout=(10, 30))
print(r.status_code, r.text)
```

## Hedefe yönelik proxy URL’leri nasıl güvenli oluştururum?

Kullanıcı adını tek bir fonksiyonda oluşturup doğrulayın. Ülke kodunda yazım hatası veya şifrede kodlanmamış karakter 407](https://crawlrelay.com/tr/docs/errors/407-proxy-authentication-required/) hatası verir ve bu kimlik bilgisi problemi gibi görünür. Aşağıdaki yardımcı, belgelenmiş sırayı (`USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}`) korur, bilinmeyen anahtarları reddeder ve her iki kimliği URL'e uygun şekilde kodlar.

*Kullanıcı adı oluşturucu ve proxy URL*

```python
import re
from urllib.parse import quote

ORDER = ("country", "state", "city", "zip", "asn", "session", "ttl")
VALUE = re.compile(r"^[a-z0-9_]+$")


def build_username(base, **params):
    """build_username("USERNAME", country="us", city="new_york", session="job1", ttl=30)"""
    parts = [base]
    for key in ORDER:
        value = params.pop(key, None)
        if value is None:
            continue
        value = str(value).lower()
        if not VALUE.match(value):
            raise ValueError("bad value for %s: %r" % (key, value))
        if key == "ttl" and not 1 <= int(value) <= 30:
            raise ValueError("ttl must be 1 to 30 minutes")
        parts.append("%s-%s" % (key, value))
    if params:
        raise ValueError("unknown parameters: %s" % ", ".join(sorted(params)))
    return "-".join(parts)


def proxy_url(username, password, socks=False):
    scheme, port = ("socks5h", 7778) if socks else ("http", 7777)
    return "%s://%s:%s@gw.crawlrelay.com:%d" % (
        scheme, quote(username, safe=""), quote(password, safe=""), port)


print(proxy_url(build_username("USERNAME", country="us", state="ny", city="new_york", session="job1", ttl=20), "p@ss:word"))
```

## httpx ile her istekte nasıl yeni IP alırım?

Keep-alive kapatın. httpx varsayılan olarak bağlantıları havuzlar ve tekrar kullanılan bağlantı çıkış IP’sini korur. `max_keepalive_connections=0` ile her istek gateway’e yeni bağlantı açar ve genellikle farklı bir konut proxy IP’den çıkar. `num_bytes_downloaded`, trafikteki byte'ları verir, ki bu da trafik faturalamasına en yakın değerdir.

*httpx: dönen istemci*

```python
import httpx

PROXY = "http://USERNAME-country-gb:PASSWORD@gw.crawlrelay.com:7777"

# No keep-alive: every request opens a new connection, so it usually gets a new exit IP
with httpx.Client(
    proxy=PROXY,
    timeout=httpx.Timeout(30.0, connect=10.0),
    limits=httpx.Limits(max_keepalive_connections=0),
    follow_redirects=True,
) as client:
    for _ in range(3):
        r = client.get("https://api.ipify.org")
        print(r.text, r.num_bytes_downloaded, "bytes on the wire")
```

## asyncio ile aynı anda nasıl kazıma yaparım ama bir siteyi aşırı yüklemem?

Eşzamanlılığı sadece genel değil, **host başına sınırla**. Global 50 limiti URL listeniz alan adına göre sıralandığında tüm 50 istek aynı siteye gider. Her host için semafor, her siteyi nazikçe tutar, tüm tarama hızlı kalır. Host başına 2-4 arası başla, artırmadan önce [eşzamanlılık rehberini](https://crawlrelay.com/tr/docs/concurrency/) oku.

*Host başına semafor ile httpx.AsyncClient*

```python
import asyncio
from collections import defaultdict
from urllib.parse import urlsplit

import httpx

PROXY = "http://USERNAME-country-us:PASSWORD@gw.crawlrelay.com:7777"
PER_HOST = 4  # parallel requests per target host
host_slots = defaultdict(lambda: asyncio.Semaphore(PER_HOST))


async def fetch(client, url):
    async with host_slots[urlsplit(url).hostname]:
        try:
            r = await client.get(url)
            return url, r.status_code, r.num_bytes_downloaded
        except httpx.HTTPError as exc:
            return url, type(exc).__name__, 0


async def main(urls):
    limits = httpx.Limits(max_connections=50, max_keepalive_connections=0)
    timeout = httpx.Timeout(30.0, connect=10.0)
    async with httpx.AsyncClient(proxy=PROXY, limits=limits, timeout=timeout) as client:
        for result in await asyncio.gather(*(fetch(client, u) for u in urls)):
            print(*result)


asyncio.run(main(["https://example.com/", "https://example.org/", "https://example.net/"]))
```

## aiohttp ile proxy nasıl kullanılır?

Gateway'i her istekte `proxy=` olarak, kimlik bilgilerini proxy URL'sinde geçin. Bu, uyarısız tüm aiohttp 3.x sürümlerinde çalışır; `BasicAuth` ve `proxy_auth=` parametreleri aiohttp 3.14’ten beri kaldırılmıştır ve 4.0’da tamamen kaldırılacak. `TCPConnector(force_close=True)` her yanıt sonrası bağlantıyı kapatır, böylece genellikle her istek yeni bir çıkış alır. Yoksa aiohttp bağlantıları tekrar kullanır ve IP bir süre aynı kalır.

*Kimlik bilgileri proxy URL’sinde olan aiohttp*

```python
import asyncio

import aiohttp

# Credentials go in the proxy URL; percent-encode a password that contains @ or :
PROXY = "http://USERNAME-country-fr:PASSWORD@gw.crawlrelay.com:7777"


async def main():
    # force_close=True: one connection per request, so each request usually gets a new exit IP
    connector = aiohttp.TCPConnector(limit=20, force_close=True)
    timeout = aiohttp.ClientTimeout(total=60, sock_connect=10)
    async with aiohttp.ClientSession(connector=connector, timeout=timeout) as session:
        for _ in range(3):
            async with session.get("https://api.ipify.org", proxy=PROXY) as resp:
                print(resp.status, await resp.text())


asyncio.run(main())
```

## Çok adımlı bir akışta tek IP nasıl tutulur?

Her akış için bir oturum ID’si oluştur ve TTL’si akıştan uzun olacak şekilde kullanıcı adına koy. Keep-alive doğru, çünkü aynı çıkışı istiyorsun. Eğer konut cihaz arka planda çevrimdışıysa IP TTL bitmeden değişebilir, bu yüzden akışı son kontrol noktasından yeniden başlatılabilir yap.

*requests ile yapışkan oturum*

```python
import uuid

import requests

session_id = uuid.uuid4().hex[:10]  # one ID per flow, lowercase letters and digits
user = "USERNAME-country-us-state-ca-session-%s-ttl-20" % session_id
proxy = "http://%s:PASSWORD@gw.crawlrelay.com:7777" % user

with requests.Session() as s:
    s.proxies = {"http": proxy, "https": proxy}
    first = s.get("https://api.ipify.org", timeout=(10, 30)).text
    second = s.get("https://api.ipify.org", timeout=(10, 30)).text
    print(first, second, "same exit" if first == second else "exit changed")
```

## Python kazıyıcı sayfa başına ne kadar trafik kullanır?

Hacim almadan önce 100 gerçek sayfada ölçün. httpx’de `num_bytes_downloaded`’yi, kendi ara katmanınızda sıkıştırılmış gövdenin uzunluğunu kaydedin ve sayfa sayınızla çarpın. Sadece HTML istekleri genellikle sayfa başına onlarca kilobayt maliyetlidir; [bant genişliği rehberi](https://crawlrelay.com/tr/guides/bandwidth-calculator/) rakamları ve sayfa başına 1.000 için maliyeti CrawlRelay fiyatlarıyla verir.

Üç alışkanlık trafiği azaltır, sonuçları değiştirmeden:

- `Accept-Encoding: gzip, br` gönderin (httpx ve requests varsayılan olarak gzip gönderir) böylece sayfalar sıkıştırılmış gider.
- Site izin veriyor ve belgeliyorsa, tam HTML yerine sayfanın yüklediği JSON uç noktasını alın.
- Değişmeyen sayfaları `If-None-Match` veya `If-Modified-Since` ile atlayın: `304 Not Modified` sadece birkaç yüz byte tutar.

## Python ve proxyler: sorular

### requests, httpx veya aiohttp: hangisini scraping için kullanmalıyım?

Basit betikler ve küçük taramalar için requests kullanın. Senkron ve asenkron kodda aynı API’yi ve HTTP/2 desteğini `httpx[http2]` üzerinden kullanmak isterseniz httpx tercih edin. Çok yüksek eşzamanlılık için saf asyncio’da aiohttp kullanın. Zamanlama, tekrarsızlaştırma ve boru hatları içeren bir tarama için, bu parçaları kendiniz yazmak yerine [Scrapy](https://crawlrelay.com/tr/docs/scrapy/) kullanın.

### Python’da proxy ile neden SSL: WRONG_VERSION_NUMBER hatası alıyorum?

Muhtemelen proxy adresinin önüne `https://` yazdınız. Ağ geçidinin 7777 portu sade HTTP konuşur ve HTTPS siteleri için CONNECT tüneli açar; bu yüzden proxy URL’si `http` ve `https` anahtarlarında `http://` ile başlamalıdır. Detaylar için [hata sayfasına](https://crawlrelay.com/tr/docs/errors/ssl-wrong-version-number/) bakın.

### Python’da SOCKS5 proxyleri nasıl kullanırım?

Ek modülü yükleyin (`pip install "requests[socks]"` veya `pip install "httpx[socks]"`), sonra `socks5h://USERNAME:PASSWORD@gw.crawlrelay.com:7778` kullanın. `h`, ana makine isimlerini proxy’e gönderir; böylece DNS çıkışta çözülür ve yerel ziyaretçilerle aynı bölgesel yanıtları görürsünüz.

### Döner proxy neden aynı IP’yi iki kez döndürüyor?

İstemciniz tutulan bağlantıyı yeniden kullandı, oysa rotasyon her yeni bağlantıda gerçekleşir. requests’de `Connection: close` gönderin, httpx’de `max_keepalive_connections=0` ayarlayın veya aiohttp’da `force_close=True` kullanın. Ayrıca kullanıcı adında `session-` kısmı olmadığından emin olun; aksi halde bir IP kasıtlı tutulur.

### Proxyli istekler için zaman aşımını nasıl ayarlarım?

Açıkça belirtin: requests’e varsayılan zaman aşımı yoktur. HTML sayfalar için yaklaşık 10 saniye bağlantı ve 30 saniye okuma zaman aşımı uygundur; mobil çıkışlar ve yavaş hedefler için 45 ila 60 saniye gerekir. Daha uzun beklemek yerine, zaman aşımı durumunda yeni bağlantı ile bir kere yeniden deneyin. [okuma zaman aşımı için](https://crawlrelay.com/tr/docs/errors/read-timeout/) bakın.

### Bu proxyleri Jupyter veya pandas ile kullanabilir miyim?

Evet. requests veya httpx kullanan her şey aynı proxy ayarlarını alır. URL’de `pandas.read_html` veya `read_csv` var ise, önce proxyli requests çağrısı ile içeriği indirin, sonra metin ya da byte’ları pandas’a iletin.

**Python scraper’ınızı konut IP adreslerinden çalıştırın** $1,50 için 1 GB, $0,50/GB 50 GB'ten. [Fiyatları gör](https://crawlrelay.com/tr/pricing/) · [Scrapy rehberi](https://crawlrelay.com/tr/docs/scrapy/)

---

CrawlRelay: CrawlRelay, kazıyıcılar ve AI veri hatları için geliştirici odaklı dönen konut proxy ve 4G/5G mobil proxy hizmetidir: süresiz, kullanılan kadar ödenen trafik $0,50/GB'dan itibaren, kripto ile ödenir, kimlik yüklemesi yoktur. KYC yok — kimlik, selfie veya belge istemez. Kripto ile ödeyin.
