← Semua artikel

Cara Menggunakan Proxy di Python Requests: HTTP, SOCKS5 & Rotasi

Diperbarui 02 Oct 2026

Kalau kamu sedang membuat script Python untuk mengambil data dari API, melakukan monitoring, testing koneksi, atau menjalankan proses scraping yang memang diizinkan, kebutuhan proxy biasanya muncul ketika request harus keluar melalui IP tertentu. Di Python, salah satu cara paling praktis adalah memakai library Requests karena konfigurasi proxy bisa dimasukkan langsung ke setiap request tanpa harus mengubah proxy seluruh komputer.

Masalahnya, implementasi proxy di Python tidak berhenti pada memasukkan IP dan port. Kamu juga perlu memahami perbedaan HTTP, HTTPS, SOCKS5, autentikasi, DNS, timeout, retry, hingga apa yang terjadi ketika proxy mati di tengah proses.

Kalau kamu masih belum familiar dengan format proxy, baca dulu panduan apa itu IP proxy. Format seperti 203.0.113.10:8080 akan sering digunakan pada contoh di artikel ini.

Apa yang Dibutuhkan Sebelum Menggunakan Proxy di Python?

Sebelum menulis kode, pastikan kamu mempunyai data proxy yang lengkap. Tidak semua proxy cukup dengan IP dan port karena sebagian layanan menggunakan autentikasi username dan password.

Data Fungsi Contoh
Host / IP Alamat server proxy. 203.0.113.10
Port Port layanan proxy. 8080
Protokol Jenis proxy yang digunakan. HTTP, HTTPS, SOCKS5
Username Autentikasi jika proxy membutuhkannya. user123
Password Password autentikasi proxy. pass123

IP yang digunakan pada contoh di artikel ini hanya alamat dokumentasi. Kamu tetap harus menggantinya dengan proxy yang benar-benar kamu miliki.

Install Python Requests

Kalau library Requests belum terpasang, instal terlebih dahulu melalui pip.

python -m pip install requests

Setelah itu lakukan pengecekan sederhana:

python -c "import requests; print(requests.__version__)"

Kalau versi Requests muncul tanpa error, library sudah siap digunakan.

Cara Menggunakan HTTP Proxy di Python Requests

Requests menerima parameter proxies berupa dictionary. Biasanya kamu menentukan proxy untuk request HTTP dan HTTPS secara terpisah.

import requests proxies = { "http": "http://203.0.113.10:8080", "https": "http://203.0.113.10:8080", } response = requests.get( "https://httpbin.org/ip", proxies=proxies, timeout=15 ) print(response.text)

Perhatikan bahwa key https pada dictionary menunjukkan jenis URL tujuan. URL proxy-nya sendiri masih bisa menggunakan skema http:// jika server tersebut memang merupakan HTTP proxy yang menangani koneksi HTTPS melalui tunneling.

Jangan asal mengganti semua URL proxy menjadi https://. Gunakan skema yang memang diberikan oleh penyedia proxy. Format proxy dan protokol tujuan merupakan dua hal yang berbeda.

Cara Mengecek Proxy Sudah Benar-Benar Aktif

Salah satu kesalahan yang cukup sering terjadi adalah script tidak error, tetapi request ternyata masih keluar melalui IP asli. Karena itu lakukan pengecekan IP sebelum memakai proxy dan sesudah proxy dipasang.

Contoh sederhana:

import requests proxies = { "http": "http://203.0.113.10:8080", "https": "http://203.0.113.10:8080", } response = requests.get( "https://httpbin.org/ip", proxies=proxies, timeout=15 ) response.raise_for_status() print(response.json())

Kalau IP yang muncul sesuai dengan exit IP proxy, berarti request sudah melewati proxy tersebut.

Kenapa Perlu Memakai raise_for_status()?

Requests tidak otomatis menganggap semua HTTP status selain 200 sebagai exception. Karena itu, kalau kamu ingin mengetahui response seperti 403, 404, atau 500 dengan lebih jelas, gunakan raise_for_status().

response = requests.get( "https://example.com", proxies=proxies, timeout=15 ) response.raise_for_status()

Ini membantu supaya script tidak melanjutkan proses seolah-olah request berhasil padahal server sebenarnya mengembalikan error.

Butuh Proxy untuk Testing Script Python?

GudangProxy menyediakan daftar proxy gratis yang dapat difilter berdasarkan negara, protokol, tingkat anonimitas, dan status koneksi. Kamu bisa memilih proxy lalu mengujinya langsung melalui Python Requests.

Lihat Daftar Proxy Gratis →

Cara Menggunakan Proxy dengan Username dan Password

Beberapa private proxy menggunakan autentikasi. Format yang paling umum adalah memasukkan username dan password ke dalam URL proxy.

import requests proxy = "http://user123:[email protected]:8080" proxies = { "http": proxy, "https": proxy, } response = requests.get( "https://httpbin.org/ip", proxies=proxies, timeout=15 ) print(response.text)

Kalau autentikasi salah, proxy biasanya menolak request dan dapat mengembalikan error seperti 407 Proxy Authentication Required.

Hindari menyimpan username dan password langsung di repository Git. Untuk project produksi, gunakan environment variable, secret manager, atau mekanisme penyimpanan credential yang sesuai.

Cara Memakai Environment Variable untuk Proxy

Requests juga dapat membaca konfigurasi proxy dari environment variable. Cara ini berguna kalau kamu tidak ingin hardcode proxy ke dalam setiap file Python.

Pada Linux atau macOS:

export HTTP_PROXY="http://203.0.113.10:8080" export HTTPS_PROXY="http://203.0.113.10:8080"

Lalu kode Python dapat dibuat lebih sederhana:

import requests response = requests.get( "https://httpbin.org/ip", timeout=15 ) print(response.text)

Requests juga mengenal variable seperti NO_PROXY untuk host tertentu yang tidak perlu dilewatkan melalui proxy.

export NO_PROXY="localhost,127.0.0.1,.internal.example"

Konsep ini mirip dengan konfigurasi environment proxy di Linux. Kalau kamu ingin memahami konfigurasi pada level sistem lebih dulu, baca panduan fungsi proxy.

Proxy per Request atau Session?

Kalau kamu hanya membuat satu atau dua request, parameter proxies langsung sudah cukup. Tetapi kalau ada banyak request menuju host yang sama, requests.Session() bisa lebih praktis karena koneksi dapat digunakan ulang.

Metode Cocok untuk Kelebihan
proxies per request Testing dan script sederhana Konfigurasi jelas pada setiap request
Session Banyak request berulang Dapat menggunakan connection pooling dan menyimpan konfigurasi
Environment variable Konfigurasi global aplikasi Tidak perlu menulis credential di source code

Cara Menggunakan Proxy dengan requests.Session()

import requests session = requests.Session() session.proxies.update({ "http": "http://203.0.113.10:8080", "https": "http://203.0.113.10:8080", }) response = session.get( "https://httpbin.org/ip", timeout=15 ) print(response.text)

Session juga berguna karena koneksi HTTP dapat digunakan kembali. Pada proses yang mengirim banyak request ke host yang sama, ini biasanya lebih efisien daripada membuat koneksi baru terus-menerus.

Ada satu detail yang perlu diperhatikan: konfigurasi proxy dari environment variable dapat memengaruhi nilai pada Session. Kalau kamu membutuhkan proxy tertentu secara deterministik, memasukkan parameter proxies secara langsung pada request biasanya lebih mudah dilacak saat debugging.

Cara Menggunakan SOCKS5 Proxy di Python Requests

Requests mendukung SOCKS, tetapi dependency tambahannya tidak terpasang secara default. Instal dengan:

python -m pip install "requests[socks]"

Setelah itu SOCKS5 dapat digunakan seperti berikut:

import requests proxies = { "http": "socks5://203.0.113.20:1080", "https": "socks5://203.0.113.20:1080", } response = requests.get( "https://httpbin.org/ip", proxies=proxies, timeout=15 ) print(response.text)

Kalau kamu memang membutuhkan SOCKS5 secara khusus, pembahasan dasar protokolnya bisa dibaca di artikel SOCKS5 Proxy.

Apa Bedanya socks5:// dan socks5h://?

Perbedaannya ada pada tempat resolusi DNS dilakukan.

Skema Resolusi DNS Kapan Digunakan
socks5:// Dilakukan dari sisi client Jika DNS lokal memang ingin digunakan
socks5h:// Dilakukan melalui proxy Jika hostname ingin di-resolve dari sisi proxy

Contoh dengan remote DNS:

proxies = { "http": "socks5h://203.0.113.20:1080", "https": "socks5h://203.0.113.20:1080", }

Perbedaan ini cukup penting ketika lokasi DNS resolution ikut memengaruhi hasil pengujian jaringan atau geolocation.

Kenapa Timeout Wajib Dipasang?

Proxy publik atau proxy yang sedang overload dapat berhenti merespons kapan saja. Kalau kamu tidak memasang timeout, worker Python bisa menunggu terlalu lama dan membuat seluruh proses terasa hang.

Contoh sederhana:

requests.get( "https://example.com", proxies=proxies, timeout=10 )

Kamu juga dapat memisahkan connect timeout dan read timeout:

requests.get( "https://example.com", proxies=proxies, timeout=(5, 20) )

Pada contoh tersebut, angka pertama digunakan untuk proses koneksi, sedangkan angka kedua digunakan untuk menunggu data dari server setelah koneksi terbentuk.

Cara Menangani Proxy Error dengan Try Except

Script produksi sebaiknya tidak langsung berhenti hanya karena satu proxy gagal. Requests menyediakan beberapa exception yang dapat ditangani secara terpisah.

import requests try: response = requests.get( "https://example.com", proxies=proxies, timeout=(5, 20) ) response.raise_for_status() print(response.status_code) except requests.exceptions.ProxyError: print("Proxy gagal digunakan.") except requests.exceptions.ConnectTimeout: print("Koneksi ke proxy timeout.") except requests.exceptions.SSLError: print("Terjadi masalah SSL/TLS.") except requests.exceptions.RequestException as error: print("Request gagal:", error)

Dengan pola ini, kamu dapat menentukan tindakan berbeda untuk proxy mati, timeout, masalah SSL, atau error request lainnya.

Cara Rotasi Proxy di Python

Kalau kamu mempunyai beberapa proxy untuk testing, monitoring, atau data collection yang memang diizinkan, kamu bisa memilih proxy dari sebuah list.

import random import requests proxy_list = [ "http://203.0.113.10:8080", "http://203.0.113.11:8080", "http://203.0.113.12:8080", ] proxy = random.choice(proxy_list) proxies = { "http": proxy, "https": proxy, } response = requests.get( "https://httpbin.org/ip", proxies=proxies, timeout=15 ) print("Proxy:", proxy) print(response.text)

Rotasi seperti ini masih sangat sederhana. Dalam aplikasi yang lebih serius, kamu biasanya perlu mencatat proxy mana yang berhasil, berapa latency-nya, kapan terakhir gagal, serta berapa kali error terjadi.

Jangan Rotasi Proxy Hanya untuk Menghindari Rate Limit

Kalau server memberikan status 429 Too Many Requests, itu merupakan sinyal bahwa request terlalu banyak. Solusi yang lebih sehat adalah menurunkan request rate dan menghormati kebijakan API atau website tersebut, bukan sekadar mengganti IP terus-menerus.

Proxy sebaiknya dipakai untuk kebutuhan yang memang sah seperti testing dari lokasi berbeda, monitoring endpoint, pengujian jaringan, pengumpulan data yang diizinkan, atau pemisahan trafik aplikasi.

Cara Menambahkan Retry pada Request

Retry berguna ketika terjadi error sementara seperti koneksi putus atau server sedang tidak tersedia. Tetapi retry tetap harus diberi batas agar script tidak melakukan request tanpa henti.

import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry retry = Retry( total=3, connect=3, read=2, status=3, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504], allowed_methods={"GET", "HEAD"}, respect_retry_after_header=True, ) session = requests.Session() adapter = HTTPAdapter(max_retries=retry) session.mount("http://", adapter) session.mount("https://", adapter) response = session.get( "https://example.com", proxies=proxies, timeout=(5, 20) ) print(response.status_code)

backoff_factor memberi jeda antarpercobaan sehingga retry tidak langsung membanjiri server. Untuk request yang mempunyai efek samping seperti POST transaksi, jangan melakukan retry otomatis tanpa memahami konsekuensinya.

Contoh Rotasi Proxy dengan Fallback

Kalau proxy pertama gagal, kamu bisa mencoba proxy berikutnya secara terkontrol.

import requests proxy_list = [ "http://203.0.113.10:8080", "http://203.0.113.11:8080", "http://203.0.113.12:8080", ] for proxy in proxy_list: proxies = { "http": proxy, "https": proxy, } try: response = requests.get( "https://httpbin.org/ip", proxies=proxies, timeout=(5, 10) ) response.raise_for_status() print("Berhasil:", proxy) print(response.text) break except requests.exceptions.RequestException: print("Gagal:", proxy)

Pola seperti ini lebih aman daripada loop tanpa batas karena jumlah proxy yang akan dicoba sudah jelas.

Cara Mengukur Proxy Cepat atau Lambat

Selain mengecek apakah proxy hidup, kamu bisa mencatat berapa lama request selesai.

import time import requests start = time.perf_counter() response = requests.get( "https://example.com", proxies=proxies, timeout=15 ) duration = time.perf_counter() - start print("Status:", response.status_code) print("Waktu:", round(duration, 2), "detik")

Data latency seperti ini bisa dipakai untuk membandingkan beberapa proxy. Proxy yang online belum tentu cocok dipakai kalau response time-nya terlalu tinggi atau sering timeout.

Kenapa HTTPS Proxy Bisa Memunculkan SSL Error?

Ketika koneksi HTTPS melewati proxy tertentu, ada kondisi di mana certificate chain perlu dikenali oleh komputer atau environment Python. Kalau certificate tidak dipercaya, Requests dapat menghasilkan SSLError.

Jangan menjadikan verify=False sebagai solusi permanen. Menonaktifkan verifikasi certificate membuat koneksi lebih rentan terhadap serangan man-in-the-middle.

Untuk environment perusahaan atau proxy TLS inspection, gunakan CA bundle yang memang diberikan oleh administrator jaringan dan konfigurasikan Requests agar mempercayai certificate tersebut.

Error Proxy yang Sering Muncul di Python Requests

Error / Gejala Kemungkinan Penyebab Yang Perlu Dicek
ProxyError Server proxy tidak bisa dijangkau. IP, port, firewall, status proxy.
ConnectTimeout Proxy terlalu lambat atau offline. Timeout dan latency proxy.
407 Proxy Authentication Required Autentikasi belum ada atau salah. Username dan password.
SSLError Certificate tidak valid atau tidak dipercaya. CA bundle dan konfigurasi TLS.
IP tidak berubah Proxy tidak digunakan oleh request. Parameter proxies dan environment variable.
Name resolution failed Masalah DNS. Coba SOCKS5H atau cek DNS lokal.
429 Too Many Requests Request terlalu cepat. Kurangi rate dan hormati Retry-After.

Proxy Gratis atau Private Proxy untuk Python?

Keduanya bisa digunakan melalui Requests selama format dan protokolnya didukung. Perbedaannya lebih banyak pada stabilitas, autentikasi, kecepatan, dan kepercayaan terhadap operator proxy.

Aspek Proxy Gratis Private Proxy
Biaya Gratis Berbayar
Stabilitas Dapat berubah cepat Umumnya lebih konsisten
Autentikasi Sering tanpa login Umumnya username/password atau IP whitelist
Cocok untuk Testing ringan Workflow yang membutuhkan konsistensi

Jangan mengirim credential akun penting atau informasi sensitif melalui proxy publik yang operatornya tidak jelas.

Apakah Proxy Sama dengan VPN di Python?

Tidak. Proxy yang dipasang melalui Requests hanya memengaruhi request yang memang dibuat menggunakan konfigurasi tersebut. Aplikasi Python lain, browser, atau trafik sistem tidak otomatis ikut menggunakan proxy yang sama.

VPN biasanya bekerja pada level jaringan yang lebih luas. Kalau masih bingung membedakan keduanya, baca artikel Proxy vs VPN.

Contoh Struktur Script Proxy yang Lebih Rapi

Kalau project mulai membesar, sebaiknya pisahkan fungsi request dari data proxy.

import requests def get_with_proxy(url, proxy_url): proxies = { "http": proxy_url, "https": proxy_url, } response = requests.get( url, proxies=proxies, timeout=(5, 20) ) response.raise_for_status() return response proxy = "http://203.0.113.10:8080" response = get_with_proxy( "https://example.com", proxy ) print(response.status_code)

Dengan pola seperti ini, logic proxy tidak tersebar di banyak tempat sehingga lebih mudah dirawat dan dites.

Kapan Proxy di Python Requests Berguna?

  • Menguji aplikasi dari IP atau lokasi jaringan berbeda.
  • Monitoring API melalui jalur koneksi tertentu.
  • Memisahkan trafik antarworker.
  • Testing geolocation pada aplikasi yang memang kamu kelola.
  • Mengambil data dari API atau website yang mengizinkan automated access.
  • Menjalankan integration test terhadap environment tertentu.
  • Membandingkan latency beberapa jaringan atau endpoint proxy.

Proxy bukan pengganti izin akses. Kalau sebuah website atau API mempunyai Terms of Service, rate limit, authentication requirement, atau kebijakan automation, aturan tersebut tetap harus dihormati.

FAQ Proxy di Python Requests

Bagaimana cara menggunakan proxy di Python Requests?

Buat dictionary proxies dengan key http dan https, kemudian kirim dictionary tersebut melalui parameter proxies pada requests.get(), requests.post(), atau method lainnya.

Apakah Requests mendukung SOCKS5?

Ya. Instal dependency tambahan menggunakan python -m pip install "requests[socks]", kemudian gunakan URL dengan format socks5://host:port atau socks5h://host:port.

Apa bedanya socks5 dan socks5h?

socks5:// melakukan resolusi DNS dari sisi client, sedangkan socks5h:// meminta proxy melakukan resolusi hostname.

Bagaimana cara menggunakan proxy dengan username dan password?

Gunakan format URL seperti http://username:password@host:port. Untuk project produksi, hindari menyimpan credential langsung di source code.

Kenapa proxy di Python timeout?

Penyebabnya bisa berupa server proxy offline, latency tinggi, port tertutup, jaringan memblokir proxy, atau server tujuan tidak merespons. Gunakan timeout dan coba endpoint lain untuk membandingkan.

Kenapa proxy menghasilkan error 407?

Error 407 biasanya berarti server proxy meminta autentikasi. Periksa username, password, metode authentication, dan format URL proxy.

Apakah perlu memakai Session?

Tidak selalu. Untuk satu atau dua request, parameter proxy per-request sudah cukup. Session lebih berguna kalau kamu melakukan banyak request dan ingin menggunakan kembali koneksi.

Apakah aman menggunakan verify=False?

Tidak disarankan untuk penggunaan normal. Menonaktifkan verifikasi SSL membuat aplikasi menerima certificate yang tidak tervalidasi dan meningkatkan risiko serangan man-in-the-middle.

Apakah rotasi proxy bisa dipakai untuk melewati rate limit?

Sebaiknya jangan menggunakan rotasi IP untuk menghindari batas yang sengaja diterapkan oleh penyedia layanan. Jika server mengembalikan status 429, turunkan request rate dan ikuti kebijakan serta header Retry-After yang diberikan.