Memutar proxy perumahan menetapkan IP pengguna nyata baru untuk setiap permintaan (atau per sesi). Untuk alur kerja yang banyak CAPTCHA, strategi rotasi yang tepat dapat mengurangi tingkat tantangan sebesar 50-80% — dan CaptchaAI menangani sisanya.
Mengapa IP Perumahan Mengurangi CAPTCHA
| Jenis Proxy | Sumber IP | Tarif CAPTCHA | Mengapa |
|---|---|---|---|
| Pusat Data | Penyedia Cloud/hosting | Tinggi (30-70%) | Rentang IP yang diketahui ditandai |
| Perumahan | ISP rumah sebenarnya | Rendah (5-15%) | Sepertinya pengguna sebenarnya |
| Seluler | Operator seluler | Sangat rendah (1-5%) | Dibagikan oleh ribuan pengguna |
| ISP | Kelas perumahan statis | Rendah (5-10%) | Menggabungkan kecepatan + kepercayaan |
Sistem CAPTCHA (terutama reCAPTCHA) memeriksa database reputasi IP. IP residensial dari ISP asli memiliki riwayat yang bersih karena mereka milik pelanggan sebenarnya.
Strategi Rotasi
1. Rotasi Per Permintaan (Default)
import requests
proxies = {
"http": "http://user:pass@gateway.proxy.com:7777",
"https": "http://user:pass@gateway.proxy.com:7777",
}
# Each request gets a new IP
for url in urls:
resp = requests.get(url, proxies=proxies, timeout=30)
# New IP after each request
Terbaik untuk: Scraping banyak halaman di berbagai situs. Risiko CAPTCHA: Rendah per permintaan, tetapi tidak dapat mempertahankan sesi.
2. Rotasi Sesi Lengket
import random
import string
def get_sticky_session(duration_min=10):
session_id = "".join(random.choices(string.ascii_lowercase, k=8))
return {
"http": f"http://user-session-{session_id}:pass@gateway.proxy.com:7777",
"https": f"http://user-session-{session_id}:pass@gateway.proxy.com:7777",
}
# Same IP for the whole CAPTCHA workflow
session_proxy = get_sticky_session(duration_min=10)
# Step 1: Load page
resp = requests.get("https://staging.example.com/qa-form", proxies=session_proxy)
# Step 2: Solve CAPTCHA (same IP)
token = solve_captcha("https://staging.example.com/qa-form", sitekey)
# Step 3: Submit (same IP — required for token validity)
resp = requests.post("https://target.com/submit", proxies=session_proxy, data={
"g-recaptcha-response": token,
})
Terbaik untuk: Formulir yang dilindungi CAPTCHA dan alur kerja multi-langkah. Risiko CAPTCHA: Sangat rendah — IP yang konsisten membangun kepercayaan.
3. Rotasi Per-Domain
domain_sessions = {}
def get_domain_proxy(domain):
"""Same IP per domain, different IP per domain."""
if domain not in domain_sessions:
session_id = "".join(random.choices(string.ascii_lowercase, k=8))
domain_sessions[domain] = get_sticky_session()
return domain_sessions[domain]
# site-a.com always uses the same IP
proxy_a = get_domain_proxy("site-a.com")
# site-b.com gets a different IP
proxy_b = get_domain_proxy("site-b.com")
Praktik Terbaik
1. Cocokkan Geo dengan Target
# Target site is US-based? Use US residential IP
us_proxy = "http://user-country-us:pass@gateway.proxy.com:7777"
# Target is Germany? Use DE residential IP
de_proxy = "http://user-country-de:pass@gateway.proxy.com:7777"
IP yang tidak cocok secara geografis memicu lebih banyak CAPTCHA (misalnya, mengakses situs AS dari IP Nigeria).
2. Tetapkan Tarif Permintaan yang Realistis
import time
import random
def human_pace_requests(urls, proxy):
results = []
for url in urls:
resp = requests.get(url, proxies=proxy, timeout=30)
results.append(resp)
# Random delay between requests
delay = random.uniform(2, 8)
time.sleep(delay)
return results
| Nilai | Risiko CAPTCHA |
|---|---|
| 1 req/sec | Tinggi (pola bot) |
| 1 req/5-10 detik | Sedang |
| 1 req/10-30 detik | Rendah (seperti manusia) |
| Acak 3-15 detik | Sangat rendah |
3. Gunakan Header yang Tepat
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/126.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"DNT": "1",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
}
resp = requests.get(url, proxies=proxy, headers=headers)
4. Tangani Larangan IP dengan Anggun
def fetch_with_retry(url, max_retries=3):
for attempt in range(max_retries):
# New proxy for each retry
proxy = get_sticky_session()
try:
resp = requests.get(url, proxies=proxy, timeout=30)
if resp.status_code == 403:
print(f"IP banned, rotating... (attempt {attempt + 1})")
time.sleep(5)
continue
if resp.status_code == 429:
print(f"Rate limited, backing off...")
time.sleep(30)
continue
return resp
except requests.exceptions.ProxyError:
print(f"Proxy failed, rotating...")
continue
raise Exception(f"Failed after {max_retries} retries")
5. Pemanasan IP Baru
def warm_up_proxy(proxy):
"""Visit neutral sites before target to build session trust."""
warm_urls = [
"https://www.google.com",
"https://www.wikipedia.org",
]
for url in warm_urls:
try:
requests.get(url, proxies=proxy, timeout=15)
time.sleep(random.uniform(2, 5))
except Exception:
pass
Pola Integrasi CaptchaAI
import requests
import time
import re
import random
import string
CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"
def solve_recaptcha(site_url, sitekey):
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
"key": CAPTCHAAI_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": site_url,
"json": 1,
})
task_id = resp.json()["request"]
for _ in range(60):
time.sleep(5)
resp = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
"key": CAPTCHAAI_KEY, "action": "get",
"id": task_id, "json": 1,
})
data = resp.json()
if data["request"] != "CAPCHA_NOT_READY":
return data["request"]
raise TimeoutError("Timeout")
def scrape_url(url, proxy_config):
"""Complete scrape with proxy + CAPTCHA solving."""
session_id = "".join(random.choices(string.ascii_lowercase, k=8))
proxy = {
"http": f"http://user-session-{session_id}:{proxy_config['pass']}@{proxy_config['host']}",
"https": f"http://user-session-{session_id}:{proxy_config['pass']}@{proxy_config['host']}",
}
resp = requests.get(url, proxies=proxy, timeout=30)
match = re.search(r'data-sitekey="([^"]+)"', resp.text)
if match:
token = solve_recaptcha(url, match.group(1))
resp = requests.post(
url.replace("/form", "/submit"),
proxies=proxy,
data={"g-recaptcha-response": token},
)
return resp.text
Optimasi Biaya
| Strategi | Dampak |
|---|---|
| Gunakan perumahan hanya untuk situs yang banyak CAPTCHA | Hemat 50-70% vs. seluruh perumahan |
| Kurangi frecookiensi CAPTCHA dengan pemanasan sesi | Lebih sedikit panggilan CaptchaAI |
| Batch halaman sebelum halaman yang dilindungi CAPTCHA | Dibutuhkan lebih sedikit sesi melekat |
| Pantau kualitas IP dan hilangkan kumpulan yang buruk | Keberhasilan percobaan pertama yang lebih tinggi |
Pemecahan Masalah
| Masalah | Penyebab | Solusi |
|---|---|---|
| CAPTCHA di setiap halaman | Kumpulan IP buruk | Ganti penyedia atau zona proxy |
| Token ditolak | IP diputar antara selesaikan dan kirim | Gunakan sesi yang melekat |
| 407 kesalahan | Format autentikasi salah | Periksa format nama pengguna penyedia yang sebenarnya |
| Respons lambat | Gerbang kelebihan beban | Coba jam di luar jam sibuk atau endpoint yang berbeda |
| Sesi berakhir di tengah alur kerja | TTL lengket terlalu pendek | Minta durasi sesi lebih lama |
Pertanyaan Umum
Berapa banyak IP perumahan yang saya perlukan?
Untuk scraping sedang (1000 halaman/day), kumpulan penyedia utama mana pun sudah cukup. Gerbang rotasi menangani manajemen IP secara otomatis.
Apakah saya merotasi IP selama solve CAPTCHA?
Tidak pernah. Pertahankan IP yang sama dari pemuatan halaman hingga pengiriman token. Putar setelah tugas selesai.
Apakah berputar lebih cepat daripada lengket?
Rotasi per permintaan memiliki latensi lebih rendah (tidak ada overhead sesi). Sticky menambahkan beberapa ms per permintaan. Untuk alur kerja CAPTCHA, perbedaannya dapat diabaikan.
Panduan Terkait
- Data Cerah + CaptchaAI
- Sesi Lengket vs Berputar
- Kualitas Proxy Mempengaruhi Tingkat Solve
Optimalkan rotasi proxy Anda untuk mengurangi CAPTCHA —dapatkan kunci CaptchaAI Andauntuk menyelesaikan sisanya.