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 melihat | Artinya | Perbaikan |
|---|---|---|
ProxyError … 407 Proxy Authentication Required | Kredensial salah, atau IP Anda tidak masuk daftar putih | Periksa user/pass (string rotasi panjang!), lakukan percent-encode karakter khusus, verifikasi daftar putih |
InvalidSchema: Missing dependencies for SOCKS support | requests tanpa ekstra socks | pip install "requests[socks]" |
TypeError: … unexpected keyword argument 'proxies' | httpx ≥ 0.28 dengan parameter yang dihapus | Gunakan proxy= atau mounts= |
ProxyError … Cannot connect to proxy / ConnectTimeout | Host/port salah, proxy mati, atau firewall | Verifikasi dengan curl -x; coba protokol lain |
| IP asli dikembalikan oleh endpoint echo IP | Proxy 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 proxy | Proxy menyadap TLS (MITM) atau skema salah | Gunakan skema http:// untuk proxy; tanyakan penyedia apakah mereka menghentikan TLS |
| 403/CAPTCHA di situs yang dilindungi, IP terlihat baik | Sidik jari TLS/HTTP mengidentifikasi Python | curl_cffi dengan impersonate, atau browser sungguhan |
| Berfungsi beberapa saat, lalu 429 | Batas kecepatan per-IP tercapai | Rotasi 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.