Kalau satu IP dipakai untuk seluruh crawl, CAPTCHA akan muncul terus dan pipeline Anda melambat. Solusinya bukan salah satu, tapi dua lapis: rotasi proxy menurunkan seberapa sering CAPTCHA dipicu, dan CaptchaAI menyelesaikan CAPTCHA yang tetap lolos. Digabung, keduanya membuat scraping tetap jalan tanpa harus berhenti tiap kali muncul tantangan verifikasi.
Panduan ini menunjukkan cara memilih jenis proxy, merotasinya dengan cerdas, dan menyambungkan hasilnya ke API CaptchaAI — lengkap dengan contoh Python yang bisa langsung Anda pakai.
Kenapa dua lapis, bukan satu
Banyak yang mengira cukup pakai solver saja atau proxy saja. Kenyataannya keduanya menangani masalah yang berbeda. Proxy mengurangi frekuensi CAPTCHA dengan menyebar permintaan ke banyak IP, sehingga tidak ada satu IP pun yang terlihat mencurigakan. CaptchaAI menangani CAPTCHA yang tetap muncul — dan pada target yang agresif, CAPTCHA pasti tetap muncul sesekali betapapun rapinya rotasi Anda.
Pembagian tugasnya jelas:
- Rotasi proxy — menurunkan berapa sering CAPTCHA dipicu dengan menyebar beban ke banyak IP.
- CaptchaAI — menyelesaikan CAPTCHA yang tetap lolos, mengembalikan token yang bisa langsung dipakai.
Kalau hanya mengandalkan proxy, setiap CAPTCHA yang lolos akan menghentikan crawl. Kalau hanya mengandalkan solver tanpa rotasi, satu IP akan cepat dicap buruk dan biaya penyelesaian membengkak karena CAPTCHA muncul di hampir setiap permintaan. Kombinasi keduanya menekan biaya sekaligus menjaga kecepatan.
Bagaimana rotasi proxy menurunkan frekuensi CAPTCHA
Situs memicu CAPTCHA berdasarkan pola permintaan per IP. Berikut perbedaan antara satu IP dan rotasi proxy:
| Faktor | Satu IP | Dengan rotasi proxy |
|---|---|---|
| Permintaan per menit | 10+ langsung memicu CAPTCHA | Tersebar ke banyak IP |
| Reputasi IP | Menurun seiring waktu | IP baru dari pool |
| Pola sesi | Pola mencurigakan mudah terlihat | Pola tersebar di banyak IP |
| Konsistensi geografis | Satu lokasi saja | Keragaman geografis alami |
Intinya: makin merata beban permintaan, makin kecil kemungkinan sebuah IP menyentuh ambang yang memunculkan verifikasi.
Memilih jenis proxy sesuai target
Tidak semua target butuh proxy termahal. Cocokkan jenis proxy dengan seberapa ketat proteksi situsnya:
| Jenis | Cocok untuk | Frekuensi CAPTCHA | Biaya |
|---|---|---|---|
| Residensial | Target bernilai tinggi (Google, Amazon) | Terendah | $$$ |
| Seluler | Deteksi sangat rendah | Terendah | $$$$ |
| ISP/Statis | Sesi berkelanjutan | Rendah | $$ |
| Pusat data | Situs bervolume tinggi, proteksi ringan | Lebih tinggi | $ |
Aturan praktis memilih
Rekomendasi: untuk situs dengan pemicu CAPTCHA yang agresif, gunakan proxy dengan IP residensial. Untuk situs yang proteksinya ringan, proxy pusat data sudah cukup dan jauh lebih hemat. Mulai dari yang termurah yang masih menjaga frekuensi CAPTCHA tetap wajar, lalu naik kelas hanya kalau ambang deteksi target menuntutnya.
Rotasi proxy dasar dengan Python
Mulai dari pola paling sederhana: pilih proxy acak per sesi, deteksi kalau ada CAPTCHA, lalu kirim ke CaptchaAI untuk diselesaikan.
import requests
import random
import time
PROXIES = [
"http://user:pass@proxy1.example.com:8080",
"http://user:pass@proxy2.example.com:8080",
"http://user:pass@proxy3.example.com:8080",
]
API_KEY = "YOUR_API_KEY"
def get_random_proxy():
proxy = random.choice(PROXIES)
return {"http": proxy, "https": proxy}
def scrape_with_rotation(url):
proxy = get_random_proxy()
session = requests.Session()
session.proxies = proxy
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
resp = session.get(url)
# If CAPTCHA appears, solve it
if "g-recaptcha" in resp.text or "captcha" in resp.text.lower():
from bs4 import BeautifulSoup
soup = BeautifulSoup(resp.text, "html.parser")
rc = soup.find("div", class_="g-recaptcha")
if rc:
site_key = rc["data-sitekey"]
token = solve_captcha(site_key, url)
resp = session.post(url, data={"g-recaptcha-response": token})
return resp.text
def solve_captcha(site_key, page_url):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": site_key, "pageurl": page_url
})
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id
})
if result.text == "CAPCHA_NOT_READY": continue
if result.text.startswith("OK|"): return result.text.split("|")[1]
raise Exception(result.text)
raise TimeoutError()
Polanya mengikuti empat langkah baku CaptchaAI: kirim task ke in.php, simpan task ID, polling res.php, lalu pakai token pada permintaan berikutnya.
Rotasi cerdas berbasis skor
Rotasi acak boros. Lebih baik catat proxy mana yang sering memicu CAPTCHA lalu prioritaskan proxy yang riwayatnya bersih:
from collections import defaultdict
import random
class SmartProxyRotator:
def __init__(self, proxies):
self.proxies = proxies
self.captcha_count = defaultdict(int)
self.success_count = defaultdict(int)
def get_proxy(self):
# Prefer proxies with lower CAPTCHA rates
scored = []
for proxy in self.proxies:
total = self.captcha_count[proxy] + self.success_count[proxy]
if total == 0:
score = 0.5 # Unknown proxy, neutral score
else:
score = self.success_count[proxy] / total
scored.append((proxy, score))
# Weight selection by score
scored.sort(key=lambda x: x[1], reverse=True)
top_proxies = scored[:max(len(scored) // 2, 1)]
proxy = random.choice(top_proxies)[0]
return proxy
def report_success(self, proxy):
self.success_count[proxy] += 1
def report_captcha(self, proxy):
self.captcha_count[proxy] += 1
# Usage
rotator = SmartProxyRotator(PROXIES)
def scrape(url):
proxy = rotator.get_proxy()
resp = requests.get(url, proxies={"http": proxy, "https": proxy})
if "captcha" in resp.text.lower():
rotator.report_captcha(proxy)
# Solve CAPTCHA...
else:
rotator.report_success(proxy)
return resp.text
Dengan skor keberhasilan per proxy, pool Anda menyembuhkan diri sendiri: proxy yang mulai memicu banyak CAPTCHA otomatis jarang terpilih.
Rotasi proxy di Selenium
Untuk target yang butuh browser sungguhan, atur proxy per sesi driver:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def create_driver_with_proxy(proxy_url):
options = Options()
options.add_argument(f"--proxy-server={proxy_url}")
return webdriver.Chrome(options=options)
# Rotate proxy per session
proxy = random.choice(PROXIES)
driver = create_driver_with_proxy(proxy)
driver.get("https://example.com")
Meneruskan proxy ke CaptchaAI untuk Cloudflare
Cloudflare Challenge berbeda dari CAPTCHA biasa: cookie hasilnya terikat pada IP. Karena itu proxy yang Anda pakai harus diteruskan ke CaptchaAI agar cookie yang dikembalikan valid dari IP yang sama:
proxy = "http://user:pass@proxy.example.com:8080"
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "cloudflare_challenge",
"pageurl": "https://example.com",
"proxy": proxy,
"proxytype": "HTTP"
})
task_id = resp.text.split("|")[1]
# Poll for qa_validation_cookie cookie
# Use the same proxy for subsequent requests
Praktik terbaik rotasi proxy
- Cocokkan geo proxy dengan target — pakai proxy AS untuk situs AS agar konten dan sinyal lokasi konsisten.
- Satu sesi per proxy — jangan pakai ulang satu sesi di proxy yang berbeda.
- Batasi laju per proxy — maksimal 5–10 permintaan/menit per IP.
- Pantau frekuensi CAPTCHA — lacak proxy mana yang paling sering memicu tantangan.
- Pakai sesi persisten (sticky session) — pertahankan proxy yang sama untuk alur multi-langkah seperti login lalu checkout.
- Tangani kegagalan proxy — lakukan coba ulang dengan proxy lain saat terjadi kesalahan koneksi.
Mengatasi masalah umum
| Masalah | Solusi |
|---|---|
| Semua proxy memicu CAPTCHA | Beralih ke proxy dengan IP residensial; turunkan laju permintaan |
| Kesalahan timeout proxy | Buang proxy lambat dari pool; perbesar batas waktu |
| Konten berbeda per proxy | Beberapa situs menyajikan konten spesifik geografis; normalisasi hasilnya |
| Token CAPTCHA gagal dengan proxy | Pastikan token dipakai dari sesi/IP yang sama |
Biaya: pasangkan proxy dengan paket thread
Bagi banyak freelancer scraping dan tim data di Indonesia, biaya adalah faktor penentu. Di sinilah model penagihan CaptchaAI membantu: penagihan dihitung per thread bersamaan, bukan per penyelesaian, dengan penyelesaian tak terbatas per thread selama sebulan. Artinya semakin efektif rotasi proxy Anda menekan frekuensi CAPTCHA, semakin kecil pula thread yang perlu Anda beli.
Untuk scraping ringan, paket BASIC ($15/bulan, 5 thread) sudah cukup menampung lonjakan CAPTCHA sesekali. Volume yang lebih besar cocok dengan ADVANCE ($90/bulan, 50 thread) karena banyak CAPTCHA bisa diselesaikan paralel tanpa biaya per solve. Tidak ada batas harian dan tidak ada biaya tambahan berdasarkan jenis CAPTCHA. Kalau infrastruktur Anda berjalan di region seperti ap-southeast-1 (Singapura) atau ap-southeast-3 (Jakarta), latensi ke API tetap ringan sehingga polling terasa cepat.
Satu catatan kepatuhan: di bawah UU Pelindungan Data Pribadi (UU 27/2022), scraping sebaiknya dibatasi pada data yang memang Anda berwenang memprosesnya dan hindari data pribadi yang di balik login milik orang lain.
Pertanyaan umum
Apakah CaptchaAI mendukung proxy SOCKS5 dan HTTP?
Ya. Saat mengirim task yang butuh proxy — seperti Cloudflare Challenge — Anda meneruskan proxy lewat parameter proxy dan menyebut tipenya di proxytype (misalnya HTTP). Gunakan proxy yang sama untuk permintaan lanjutan agar cookie hasil tetap valid.
Berapa laju permintaan per proxy yang aman?
Sebagai titik awal, batasi 5–10 permintaan per menit per IP, lalu sesuaikan berdasarkan frekuensi CAPTCHA yang Anda pantau. Target yang agresif mungkin menuntut laju lebih rendah; situs yang longgar bisa lebih tinggi.
Apakah scraping dengan rotasi proxy legal di Indonesia?
Teknik rotasi proxy dan penyelesaian CAPTCHA itu sendiri bersifat netral. Yang menentukan legalitas adalah data yang Anda ambil: batasi pada data yang Anda berwenang memprosesnya sesuai UU 27/2022 dan hindari data pribadi orang lain. Artikel ini bukan nasihat hukum.
Kenapa proxy harus sama untuk Cloudflare Challenge?
Karena cookie qa_validation_cookie yang dihasilkan terikat pada IP yang menyelesaikan tantangan. Kalau Anda menyelesaikannya lewat satu IP lalu memakai cookie dari IP lain, situs akan menganggapnya tidak valid. Untuk jenis CAPTCHA lain, token umumnya valid terlepas dari IP.