Proxy untuk Python
Python — bahasa nomor 1 untuk parsing data dan otomatisasi. Namun, setiap skrip cepat atau lambat akan terkena blokir IP. Untuk menghindari hal ini, Anda perlu mengintegrasikan proxy dengan benar.
Dalam panduan ini, kita akan membahas cara menghubungkan proxy dalam empat skenario terpopuler: dari permintaan sederhana hingga kontrol browser.
📌 Metode 1. Pustaka requests (Paling Populer)
Jika Anda menulis parser sederhana atau bekerja dengan API, Anda menggunakan requests. Di sini, proxy dikirimkan melalui kamus (dict) biasa.
Kode:
import requests
# Format: login:password@ip:port
# Di CyberYozh App kami menggunakan port 5959 untuk HTTP
proxy = "http://user:pass@51.77.190.247:5959"
proxies = {
"http": proxy,
"https": proxy
}
try:
# Wajib sertakan timeout!
response = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)
print(f"IP Anda: {response.json()['origin']}")
except Exception as e:
print(f"Kesalahan: {e}")
Saran: Jangan melakukan hardcode proxy di dalam kode. Lebih baik simpan di variabel lingkungan (os.getenv).
Jika Anda ingin menggunakan SOCKS5 di Python, Anda perlu:
1. Instal pustaka tambahan: requests sendiri tidak bisa bekerja dengan SOCKS. Anda perlu menginstal add-on:
pip install requests[socks]
# atau
pip install pysocks
2. Ubah skema di kode: Di sini port dan sintaksis berubah menjadi 9595 dan socks5h://.
import requests
# Gunakan socks5h untuk melindungi dari kebocoran DNS (Remote DNS resolution)
socks_proxy = "socks5h://user:pass@51.77.190.247:9595"
proxies = {
"http": socks_proxy,
"https": socks_proxy
}
try:
response = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)
print(f"IP Anda melalui SOCKS5: {response.json()['origin']}")
except Exception as e:
print(f"Kesalahan: {e}")
🤖 Metode 2. Pustaka Selenium (Imitasi Browser)
Jika situs menggunakan JavaScript yang rumit (React, Vue), Single Page Application (SPA), atau perlindungan Cloudflare, requests biasa tidak akan sanggup — ia tidak bisa mengeksekusi kode JS. Anda butuh Selenium, yang membuka dan mengontrol browser asli (Chrome/Firefox).
⚠️ Masalah Utama: Autentikasi
Chrome standar memiliki fitur yang kurang menguntungkan: ia tidak mendukung pengiriman login dan password proxy melalui argumen peluncuran. Jika Anda mencoba mengirim http://user:pass@ip:port, browser akan mengabaikan autentikasi dan menampilkan jendela popup untuk memasukkan kata sandi, yang akan merusak otomatisasi.
✅ Solusi: Pustaka selenium-wire
Ini adalah ekstensi di atas Selenium biasa yang bisa mencegat permintaan dan secara otomatis mengisi login dan password proxy.
Instalasi:
pip install selenium-wire
Kode (Pengaturan Benar dengan Autentikasi):
# Perhatikan: impor webdriver dari seleniumwire, bukan dari selenium
from seleniumwire import webdriver
# Data proxy Anda dari CyberYozh App
PROXY_HOST = "51.77.190.247"
PROXY_PORT = "5959" # Port untuk HTTP
PROXY_USER = "login_anda"
PROXY_PASS = "password_anda"
# Membentuk kamus pengaturan
proxy_options = {
'proxy': {
'http': f'http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}',
'https': f'http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}',
'no_proxy': 'localhost,127.0.0.1' # Jangan mem-proxy alamat lokal
}
}
# Inisialisasi browser dengan opsi seleniumwire_options
driver = webdriver.Chrome(seleniumwire_options=proxy_options)
print("Browser berjalan, memeriksa IP...")
driver.get("https://httpbin.org/ip")
# Menampilkan konten halaman (seharusnya ada IP proxy Anda di sana)
print(driver.find_element("tag name", "body").text)
driver.quit()
Mengapa ini berhasil: selenium-wire membuat server perantara lokal yang menangani komunikasi dengan proxy Anda. Browser mengira ia bekerja tanpa kata sandi, sementara pustaka itu sendiri "menempelkan" header otorisasi yang diperlukan. Ini adalah cara paling andal untuk Python.
Selenium dan SOCKS5:
Sama seperti untuk requests, agar selenium-wire bisa bekerja dengan proxy SOCKS, Anda perlu menginstal pustaka pysocks (jika belum terinstal):
pip install pysocks
Kode untuk SOCKS5 (Selenium Wire)
Logikanya tetap sama: kunci kamus ('http', 'https') memberi tahu pustaka lalu lintas mana yang harus dicegat, dan nilainya (socks5://...) menentukan ke mana harus diarahkan.
from seleniumwire import webdriver # Impor khusus dari seleniumwire!
# Data proxy SOCKS5 Anda
PROXY_HOST = "51.77.190.247"
PROXY_PORT = "9595" # Pastikan ini port untuk SOCKS5 (seringkali berbeda dari HTTP)
PROXY_USER = "login_anda"
PROXY_PASS = "password_anda"
# Pengaturan
proxy_options = {
'proxy': {
# Skema berubah menjadi socks5://
'http': f'socks5://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}',
'https': f'socks5://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}',
'no_proxy': 'localhost,127.0.0.1'
}
}
# Menjalankan browser
# Bisa menambahkan opsi Chrome biasa (headless, dll) melalui chrome_options=...
driver = webdriver.Chrome(seleniumwire_options=proxy_options)
try:
print("Browser berjalan, memeriksa IP...")
driver.get("https://httpbin.org/ip")
# Menampilkan IP
print(driver.find_element("tag name", "body").text)
# Disarankan periksa tipe proxy di checker yang lebih detail
# driver.get("https://browserleaks.com/ip")
except Exception as e:
print(f"Kesalahan: {e}")
finally:
driver.quit()
Apa Perbedaannya?
Di kamus proxy_options kita mengganti skema dari http:// menjadi socks5://.
Perhatikan kunci kamusnya: Kita TIDAK mengganti kunci 'http' dan 'https' menjadi 'socks'.
-
Kunci
'https'berarti: "Ketika browser meminta situs HTTPS..." -
Nilai
socks5://...berarti: "...kirimkan melalui terowongan SOCKS5 ini".
Lalu bagaimana dengan DNS (socks5h)?
Di selenium-wire, logika internal pustaka yang bertanggung jawab atas penyelesaian DNS. Biasanya ia menangani sendiri pengalihan permintaan DNS melalui proxy jika skema socks5 digunakan, karena selenium-wire bekerja sebagai Man-in-the-Middle (perantara) antara browser dan internet.
Jika tiba-tiba Anda melihat kebocoran DNS (provider Anda terlihat di checker), coba tentukan socks5h:// di string koneksi — selenium-wire mendukung format ini berkat pustaka requests di balik layarnya.
🚀 Metode 3. Pustaka aiohttp (Asinkron)
Ketika perlu mem-parsing 10.000 halaman per menit, pendekatan asinkron (async/await) digunakan. Di sini requests standar tidak akan cocok, Anda butuh aiohttp.
Kode:
import aiohttp
import asyncio
async def fetch_ip():
proxy_auth = aiohttp.BasicAuth('user', 'pass') # Login dan password terpisah
proxy_url = "http://51.77.190.247:5959"
async with aiohttp.ClientSession() as session:
async with session.get("https://httpbin.org/ip",
proxy=proxy_url,
proxy_auth=proxy_auth) as resp:
print(await resp.json())
asyncio.run(fetch_ip())
SOCKS5 untuk aiohttp
Untuk aiohttp situasinya sedikit lebih rumit daripada untuk requests. Pustaka aiohttp sendiri tidak mendukung proxy SOCKS secara langsung. Ia hanya bisa bekerja dengan proxy HTTP.
Untuk "mengajarinya" bekerja dengan SOCKS5, Anda perlu menggunakan connector khusus.
1. Instalasi
Anda butuh pustaka penghubung tambahan aiohttp-socks:
pip install aiohttp-socks
2. Kode (pendekatan yang benar melalui Connector)
Berbeda dengan contoh HTTP di mana kita mengirim proxy di setiap permintaan (session.get(..., proxy=...)), untuk SOCKS5 kita mengatur proxy satu kali saat membuat sesi.
Ini bahkan lebih baik untuk performa (koneksi Keep-Alive).
import aiohttp
import asyncio
from aiohttp_socks import ProxyConnector # Impor connector
async def fetch_ip():
# Membentuk string koneksi.
# Perhatikan: login dan password dimasukkan langsung ke string URL.
socks_url = "socks5://user:pass@51.77.190.247:9595"
# Membuat connector
# rdns=True — ini analog dengan socks5h (perlindungan kebocoran DNS).
# Ini WAJIB untuk anonimitas.
connector = ProxyConnector.from_url(socks_url, rdns=True)
# Mengirim connector ke ClientSession
# Sekarang seluruh sesi ini akan bekerja melalui SOCKS5
async with aiohttp.ClientSession(connector=connector) as session:
try:
# PERHATIAN: Di dalam .get() TIDAK PERLU lagi menulis proxy=...
# Proxy sudah "tertanam" di session melalui connector.
async with session.get("https://httpbin.org/ip") as resp:
print(await resp.json())
except Exception as e:
print(f"Kesalahan: {e}")
if __name__ == '__main__':
# Peluncuran yang benar untuk Windows/Linux
asyncio.run(fetch_ip())
🔍 Apa perbedaan utama dari varian HTTP?
-
Pustaka: Kita menambahkan
from aiohttp_socks import ProxyConnector. -
Tempat Pengaturan:
-
Sebelumnya:
session.get(..., proxy=...)(pengaturan di setiap permintaan). -
Sekarang:
aiohttp.ClientSession(connector=...)(pengaturan seluruh sesi).
-
-
DNS (rdns=True): Parameter
rdns=Truemelakukan hal yang sama dengansocks5h— memaksa domain diselesaikan di sisi proxy, menyembunyikan ke mana Anda pergi dari provider.
Kode ini sangat ideal untuk mem-parsing 10.000 halaman, karena connector secara efektif mengelola kumpulan koneksi melalui terowongan SOCKS.
🔧 Metode 4. Penggunaan Variabel Lingkungan (Praktik Terbaik)
Pengembang profesional tidak menulis proxy di dalam kode. Ini tidak aman (jika Anda mengunggah kode ke GitHub, proxy Anda akan dicuri). Python bisa secara otomatis mengambil proxy dari sistem.
Di terminal (Linux/Mac):
export HTTP_PROXY="http://user:pass@51.77.190.247:5959"
Di dalam kode:
import requests
# Tidak perlu mengirim argumen proxies=... apapun!
# Pustaka akan menemukan sendiri pengaturan di sistem.
requests.get("https://httpbin.org/ip")
💡 Proxy mana yang harus dipilih untuk skrip Python?
Kode hanyalah setengah dari pekerjaan. Yang terpenting adalah kualitas proxy itu sendiri dan cara mengelola rotasinya. Tergantung pada tugasnya, arsitektur skrip Anda akan berubah.
1. Server IPv4, IPv6 (Server Data Center)
Ideal untuk: Permintaan API sederhana, mengunduh file, bekerja dengan situs tanpa perlindungan ketat.
-
Logika di Python: Jika IP terkena ban — cukup ganti dengan yang berikutnya dari daftar proxy Anda melalui skrip.
-
Kelebihan: Kecepatan tinggi (hingga 1 Gbit/s) dan harga murah.
2. Residensial Rotasi (Residential Rotating)
Ideal untuk: Parsing ketat (Amazon, Avito), melewati Cloudflare, dan mengumpulkan data dalam jumlah besar.
-
Cara kerja rotasi: Anda tidak perlu menulis kode rotasi yang rumit. Di CyberYozh App kami menggunakan «Generator Kredensial Pintar». Anda mengubah logika perilaku proxy cukup dengan mengubah login:
-
login-res-any: Skrip mendapatkan IP baru pada setiap permintaan (requests.get). login-res-any-sid-12345678: IP akan tertahan untuk set angka ini (sid) selama maksimal 1 menit.-
login-resfix: Skrip menahan IP untuk dirinya sendiri (Sticky Session) untuk autentikasi.
-
-
Kelebihan untuk Python: Anda hanya menggunakan satu baris koneksi, namun mendapatkan akses ke jutaan IP.
👉 Lebih lanjut tentang rotasi untuk proxy residensial bisa dibaca di sini.
3. Proxy Seluler (Mobile 4G/LTE)
Ideal untuk: Registrasi akun, bekerja dengan media sosial (Instagram, TikTok), dan emulasi pengguna nyata melalui Selenium/Appium. Tingkat kepercayaan (trust) tertinggi.
Ada dua skenario pengelolaan dalam kode di sini:
-
🅰️ Privat (Private): Rotasi melalui tautan Anda menyewa seluruh modem. Untuk mengganti IP, skrip Python Anda harus «memanggil» tautan API khusus.
-
Contoh logika:
# 1. Melakukan siklus tindakan do_registration() # 2. Merestart modem melalui API requests.get("https://app.cyberyozh.com/api/v1/...") time.sleep(15) # Tunggu sampai modem aktif kembali # 3. Memulai siklus baru
-
-
🅱️ Bersama (Shared): Rotasi otomatis IP berubah sendiri berdasarkan pengatur waktu layanan (misalnya, setiap 5 atau 30 menit).
- Logika di Python: Anda perlu menangani pemutusan koneksi. Jika selama permintaan modem sedang restart — skrip harus menangkap kesalahan
ConnectionError, tunggu beberapa detik, lalu ulangi permintaan (Retry).
- Logika di Python: Anda perlu menangani pemutusan koneksi. Jika selama permintaan modem sedang restart — skrip harus menangkap kesalahan
👉 Lebih lanjut tentang proxy seluler bisa dibaca di sini.
Kesimpulan
Integrasi proxy di Python hanya membutuhkan 3-5 baris kode. Yang terpenting adalah memilih jenis proxy yang tepat untuk tugas dan pustaka yang sesuai.
👉 Siap untuk mulai coding? Di katalog CyberYozh App Anda akan menemukan semua jenis proxy yang disebutkan. Cukup pilih tarif yang sesuai dengan tugas Anda (parsing, registrasi, atau surfing), salin aksesnya, dan integrasikan ke proyek Anda dalam beberapa menit.