Setiap library HTTP Python menerima proxy sebagai URL dengan format scheme://user:pass@host:port; yang membedakan adalah nama parameter, apakah diatur per klien atau per permintaan, dan bagaimana SOCKS5 serta DNS ditangani. Snippet di bawah ini adalah kode persis yang berfungsi dengan versi terkini requests, httpx dan aiohttp — masing-masing dijalankan melalui proxy yang memerlukan autentikasi sebelum artikel ini diterbitkan — diikuti oleh tiga hal yang menyebabkan sebagian besar pertanyaan “proxy saya tidak berfungsi di Python”: nama parameter yang salah disalin dari tutorial lama, ekstra SOCKS yang hilang, dan sidik jari TLS yang membuat skrip terdeteksi meskipun IP-nya benar.

URL proxy

http://user:pass@proxy.example.com:8080     # Proxy HTTP, digunakan untuk target http:// dan https://
socks5://user:pass@proxy.example.com:1080   # SOCKS5, DNS diselesaikan secara lokal
socks5h://user:pass@proxy.example.com:1080  # SOCKS5, DNS diselesaikan oleh proxy (gunakan ini)

Dua hal yang sering membuat orang bingung. Pertama, proxy HTTP juga menangani target HTTPS — klien mengirim CONNECT dan membuat terowongan TLS melaluinya — jadi Anda hampir tidak perlu skema proxy https://; itu berarti TLS ke proxy itu sendiri, yang jarang ditawarkan penyedia. Kedua, jika username Anda mengandung parameter rotasi (user-country-de-session-abc123) atau password Anda mengandung @, : atau /, lakukan percent-encode (urllib.parse.quote(pw, safe='')) atau URL akan diurai dengan salah.

requests

import requests

PROXY = "http://user:pass@proxy.example.com:8080"
proxies = {"http": PROXY, "https": PROXY}

# per permintaan
r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=20)
print(r.json())

# per sesi (menggunakan kembali koneksi; cara yang umum)
s = requests.Session()
s.proxies.update(proxies)
r = s.get("https://api.ipify.org?format=json", timeout=20)

Kamus tersebut menggunakan kunci berdasarkan skema target: permintaan ke URL http:// menggunakan entri "http", permintaan ke URL https:// menggunakan "https". Setel keduanya ke proxy yang sama kecuali ada alasan untuk tidak melakukannya. Selalu berikan timeout; jika tidak, proxy yang menggantung akan membuat skrip Anda menggantung selamanya.

SOCKS5 memerlukan ekstra: pip install "requests[socks]". Kemudian proxies = {"http": "socks5h://…", "https": "socks5h://…"}. Tanpa ekstra tersebut Anda akan mendapatkan InvalidSchema: Missing dependencies for SOCKS support.

Variabel lingkungan: requests menghormati HTTP_PROXY / HTTPS_PROXY / NO_PROXY secara default (trust_env=True). Jika proxy tiba-tiba digunakan padahal Anda tidak mengaturnya, atau tidak digunakan padahal Anda mengaturnya, periksa lingkungan.

httpx

import httpx

PROXY = "http://user:pass@proxy.example.com:8080"

# sinkron
with httpx.Client(proxy=PROXY, timeout=20) as client:
    r = client.get("https://api.ipify.org?format=json")
    print(r.json())

# asinkron
import asyncio
async def main():
    async with httpx.AsyncClient(proxy=PROXY, timeout=20) as client:
        r = await client.get("https://api.ipify.org?format=json")
        print(r.json())
asyncio.run(main())

Parameternya adalah proxy= (tunggal). Tutorial lama menunjukkan proxies={"http://": …, "https://": …}; kata kunci itu tidak digunakan lagi di httpx 0.26 dan dihapus di 0.28, dan mengirimkannya sekarang akan memunculkan TypeError: Client.__init__() got an unexpected keyword argument 'proxies'. Jika Anda memerlukan proxy yang berbeda untuk target yang berbeda, gunakan mounts:

mounts = {
    "https://api.example.com": httpx.HTTPTransport(proxy="http://user:pass@dc-proxy:8080"),
    "all://": httpx.HTTPTransport(proxy="http://user:pass@resi-proxy:8080"),
}
client = httpx.Client(mounts=mounts)

SOCKS5: pip install "httpx[socks]", lalu proxy="socks5://…". httpx menyelesaikan nama host melalui proxy SOCKS secara default. HTTP/2: pip install "httpx[http2]" dan httpx.Client(http2=True, …) — relevan karena browser yang diproksi biasanya menggunakan HTTP/2 (lihat HTTP/2 dan HTTP/3 melalui proxy).

aiohttp

import aiohttp, asyncio

PROXY = "http://user:pass@proxy.example.com:8080"

async def main():
    async with aiohttp.ClientSession() as session:
        async with session.get("https://api.ipify.org?format=json",
                               proxy=PROXY,
                               timeout=aiohttp.ClientTimeout(total=20)) as r:
            print(await r.json())

asyncio.run(main())

Proxy diteruskan per permintaan (atau diatur sekali melalui connector khusus). Kredensial dimasukkan ke dalam URL; bentuk terpisah proxy_auth=aiohttp.BasicAuth(...) masih berfungsi di 3.x tetapi tidak digunakan lagi sejak 3.14 dan dijadwalkan untuk dihapus di 4.0, jadi lebih baik gunakan bentuk URL. aiohttp tidak membaca variabel lingkungan HTTP_PROXY kecuali Anda membuat sesi dengan trust_env=True. aiohttp asli hanya mendukung proxy HTTP; untuk SOCKS gunakan paket aiohttp-socks dan ProxyConnector-nya.

Rotasi proxy: pola session-ID

Dengan gateway backconnect (lihat cara kerja gateway rotasi) Anda jarang melakukan rotasi di Python sama sekali — Anda berotasi dengan mengubah username. ID sesi baru berarti IP keluar baru; ID yang digunakan kembali akan mempertahankannya:

import secrets, requests

def proxy_for(session_id: str, country: str = "de") -> dict:
    user = f"customer-country-{country}-session-{session_id}"   # format khusus penyedia
    url  = f"http://{user}:PASSWORD@gate.provider.com:7777"
    return {"http": url, "https": url}

# sticky: IP yang sama untuk alur multi-langkah
sid = secrets.token_hex(4)
s = requests.Session(); s.proxies.update(proxy_for(sid))
s.get("https://shop.example/login"); s.post("https://shop.example/cart", data=...)

# rotasi: IP baru per item
for url in urls:
    requests.get(url, proxies=proxy_for(secrets.token_hex(4)), timeout=20)

Rotasi juga saat gagal: tangkap 403/429 dan penanda CAPTCHA, lalu coba lagi dengan ID sesi baru dan cookie jar baru — IP yang sama dengan cookie yang sama adalah pengunjung yang sama.

Kesalahan yang tidak bisa diperbaiki proxy: sidik jari TLS

Ketiga library membuat koneksi TLS melalui modul ssl Python (OpenSSL). Sistem anti-bot mengambil sidik jari dari handshake tersebut dan tahu itu bukan browser, apa pun User-Agent yang Anda atur. Di balik IP residensial yang sempurna, skrip tetap teridentifikasi sebagai skrip — mekanismenya dijelaskan dalam penjelasan sidik jari TLS. Untuk target yang dilindungi, beralihlah ke klien yang meniru; curl_cffi mempertahankan API mirip requests:

# pip install curl_cffi
from curl_cffi import requests as cffi_requests

r = cffi_requests.get("https://protected.example/",
                      impersonate="chrome",                 # mereproduksi sidik jari TLS + HTTP/2 Chrome
                      proxies={"https": "http://user:pass@proxy.example.com:8080"},
                      timeout=20)

Kemudian jaga konsistensi cerita lainnya — User-Agent Chrome, petunjuk klien sec-ch-ua yang cocok, Accept-Language yang masuk akal untuk negara proxy. Untuk situs yang juga memerlukan tantangan JavaScript, klien HTTP saja tidak cukup; gunakan browser sungguhan seperti pada Proxies di Playwright, Puppeteer dan Selenium.

Error dan artinya

Anda melihatArtinyaPerbaikan
ProxyError … 407 Proxy Authentication RequiredKredensial salah, atau IP Anda tidak masuk daftar putihPeriksa user/pass (string rotasi panjang!), lakukan percent-encode karakter khusus, verifikasi daftar putih
InvalidSchema: Missing dependencies for SOCKS supportrequests tanpa ekstra sockspip install "requests[socks]"
TypeError: … unexpected keyword argument 'proxies'httpx ≥ 0.28 dengan parameter yang dihapusGunakan proxy= atau mounts=
ProxyError … Cannot connect to proxy / ConnectTimeoutHost/port salah, proxy mati, atau firewallVerifikasi dengan curl -x; coba protokol lain
IP asli dikembalikan oleh endpoint echo IPProxy tidak diterapkan (kunci dict salah, override env var, parameter per-permintaan hilang di aiohttp)Cetak session.proxies; periksa trust_env; berikan proxy= pada permintaan
SSLError hanya melalui proxyProxy menyadap TLS (MITM) atau skema salahGunakan skema http:// untuk proxy; tanyakan penyedia apakah mereka menghentikan TLS
403/CAPTCHA di situs yang dilindungi, IP terlihat baikSidik jari TLS/HTTP mengidentifikasi Pythoncurl_cffi dengan impersonate, atau browser sungguhan
Berfungsi beberapa saat, lalu 429Batas kecepatan per-IP tercapaiRotasi ID sesi; perlambat; lihat panduan rotasi

Template minimal yang benar

import requests, secrets
from urllib.parse import quote

GATE, PORT = "gate.provider.com", 7777
USER_BASE, PASS = "customer-country-de", quote("p@ss:word", safe="")

def make_session() -> requests.Session:
    sid = secrets.token_hex(4)
    url = f"http://{USER_BASE}-session-{sid}:{PASS}@{GATE}:{PORT}"
    s = requests.Session()
    s.proxies.update({"http": url, "https": url})
    s.headers.update({"User-Agent": "python-requests"})   # UA jujur untuk target yang toleran
    return s

s = make_session()
r = s.get("https://api.ipify.org?format=json", timeout=20)
r.raise_for_status()
print(r.json())

Verifikasi IP berubah, lalu bangun di atasnya. Untuk pra-penerbangan lengkap (kebocoran, header, daftar blokir) lihat Cara menguji proxy; untuk memilih datacenter vs residensial untuk target tertentu, perbandingan jenis proxy.

Pertanyaan yang sering diajukan

Bagaimana cara menggunakan proxy dengan Python requests?

Berikan proxies={"http": url, "https": url} ke permintaan atau atur pada Session, di mana url adalah http://user:pass@host:port. Tambahkan timeout=. Untuk SOCKS5 instal requests[socks] dan gunakan socks5h://.

Mengapa httpx mengatakan ‘unexpected keyword argument proxies’?

Karena proxies= dihapus di httpx 0.28. Gunakan proxy="http://…" untuk satu proxy, atau mounts= untuk proxy per-target.

Bagaimana cara mengatur proxy di aiohttp?

Berikan proxy="http://user:pass@host:port" ke setiap permintaan (session.get(url, proxy=…)). Parameter proxy_auth= tidak digunakan lagi; masukkan kredensial di URL. Gunakan aiohttp-socks untuk SOCKS.

Bagaimana cara merotasi proxy di Python?

Dengan penyedia backconnect, ubah ID sesi di username proxy per permintaan atau per alur — tidak perlu daftar IP. Rotasi saat 403/429 dan pasangkan setiap IP baru dengan cookie jar baru.

Mengapa skrip saya diblokir padahal browser saya di proxy yang sama tidak?

Karena sidik jari TLS dan HTTP/2: modul ssl Python tidak terlihat seperti browser. Gunakan curl_cffi dengan impersonate= atau otomatiskan browser sungguhan.

Haruskah saya menggunakan socks5 atau socks5h?

socks5h. Huruf h membuat proxy menyelesaikan nama host, mencegah kebocoran DNS dan memungkinkan Anda menjangkau host yang hanya bisa diselesaikan oleh proxy.