← Kembali ke blog

Cara Mengatasi Pembatasan API Rate Saat Mengambil Data Melalui Proxy: Pengaturan Rotasi dan Pemilihan IP

Membahas penyebab pemblokiran API saat menggunakan proxy dan menunjukkan metode konkret untuk mengatasi pembatasan laju: dari pengaturan rotasi IP hingga pemilihan jenis proxy yang tepat.

šŸ“…19 Februari 2026
```html

Anda telah mengatur parser, menghubungkan proxy, tetapi API tetap mengembalikan kesalahan 429 "Terlalu Banyak Permintaan" atau memblokir akses? Masalahnya bukan pada proxy itu sendiri, tetapi pada strategi penggunaannya yang salah. Rate limiting adalah mekanisme perlindungan API yang membatasi jumlah permintaan dari satu alamat IP dalam periode tertentu. Dalam artikel ini, kita akan membahas mengapa pemblokiran terjadi saat bekerja melalui proxy dan bagaimana mengatur sistem dengan benar untuk menghindari batasan.

Apa itu API rate limiting dan bagaimana cara kerjanya

Rate limiting (pembatasan frekuensi permintaan) adalah mekanisme perlindungan API dari kelebihan beban dan penyalahgunaan. Layanan menetapkan batas pada jumlah permintaan yang dapat dilakukan dari satu sumber dalam periode waktu tertentu. Misalnya, API populer menggunakan batasan seperti:

  • Twitter API: 300 permintaan dalam 15 menit untuk akses standar
  • Instagram Graph API: 200 permintaan per jam per aplikasi
  • Google Maps API: tergantung pada tarif, biasanya 100-1000 permintaan per hari
  • Wildberries API: batasan tidak resmi sekitar 60 permintaan per menit dari satu IP
  • Avito API: 10 permintaan per detik untuk pengambilan iklan

Ada beberapa metode untuk menentukan sumber permintaan yang menerapkan rate limiting:

Alamat IP: metode yang paling umum. API menghitung jumlah permintaan dari IP tertentu dalam jendela waktu.

Kunci API: jika Anda menggunakan otorisasi melalui kunci, batasan terikat pada kunci tersebut terlepas dari IP.

User-Agent dan sidik jari: beberapa API menganalisis header browser dan membuat sidik jari digital untuk klien.

Sesi (cookies): batasan dapat terikat pada sesi pengguna melalui cookies.

Ketika batas terlampaui, API mengembalikan status HTTP 429 "Terlalu Banyak Permintaan" dan header Retry-After, yang menunjukkan waktu hingga batasan direset. Beberapa layanan menggunakan "jendela bergulir" (rolling window), di mana batasan diperbarui secara bertahap, dan yang lain menggunakan jendela tetap yang direset pada waktu tertentu.

Mengapa proxy tidak secara otomatis menyelamatkan dari rate limiting

Banyak pengembang salah berpikir bahwa cukup menghubungkan proxy — dan mereka dapat mengirimkan jumlah permintaan yang tidak terbatas. Dalam praktiknya, masalah berikut muncul:

Menggunakan satu proxy untuk semua permintaan

Jika skrip Anda menggunakan alamat IP proxy yang sama untuk semua permintaan, API melihatnya sebagai pengguna biasa dan menerapkan batasan standar. Misalnya, Anda telah mengatur parser harga dari Wildberries melalui satu proxy residensial. Parser membuat 100 permintaan per menit, tetapi batasnya adalah 60 permintaan. Hasilnya: pemblokiran IP selama 10-30 menit.

Rotasi IP yang lambat

Beberapa orang menggunakan kumpulan 5-10 proxy dan beralih di antara mereka secara berurutan. Masalahnya adalah setiap IP tetap mencapai batas lebih cepat daripada rotasi penuh terjadi. Misalkan Anda memiliki 10 proxy dan batas 100 permintaan per jam per IP. Jika Anda membuat 1000 permintaan per jam, setiap proxy akan mendapatkan 100 permintaan — tepat pada batas. Setiap ketidakseimbangan distribusi akan menyebabkan pemblokiran.

Mengabaikan faktor identifikasi lainnya

Bahkan dengan rotasi IP yang sempurna, Anda dapat diblokir jika:

  • Semua permintaan datang dengan User-Agent yang sama (misalnya, python-requests/2.28.0)
  • Menggunakan satu kunci API untuk semua permintaan
  • Permintaan datang dengan periodisitas yang sempurna (setiap 0.5 detik) — ini terlihat seperti bot
  • Alamat IP proxy berada dalam subnet yang sama (misalnya, semua dalam rentang 192.168.1.x)

Reputasi alamat IP

Proxy data center sering masuk dalam daftar hitam, karena IP mereka digunakan oleh ratusan pengguna lain untuk pengambilan data. API dapat menerapkan batasan yang lebih ketat pada alamat tersebut atau memblokirnya segera. Misalnya, Instagram dan Facebook secara agresif memblokir data center, bahkan jika Anda tidak melebihi batas resmi.

Strategi rotasi IP untuk menghindari batasan

Rotasi proxy yang benar adalah kunci untuk menghindari rate limiting. Mari kita lihat strategi efektif tergantung pada tugas.

Rotasi setelah setiap permintaan

Strategi paling agresif: setiap permintaan melalui IP baru. Cocok untuk tugas dengan batasan yang sangat ketat (1-5 permintaan per IP) atau ketika perlu menyebarkan beban secara maksimal. Untuk ini digunakan proxy residensial dengan rotasi otomatis — mereka menyediakan kumpulan jutaan IP, dan setiap permintaan secara otomatis mendapatkan alamat baru.

Contoh penggunaan: pengambilan data Instagram melalui API tidak resmi, di mana batasnya adalah 5 permintaan per menit dari satu IP. Dengan rotasi setelah setiap permintaan, Anda dapat melakukan 300 permintaan per menit melalui 300 IP yang berbeda.

Keuntungan: perlindungan maksimal terhadap rate limiting, setiap IP digunakan seminimal mungkin.

Kerugian: biaya tinggi (proxy residensial lebih mahal), kemungkinan ada penundaan saat berganti IP, lebih sulit untuk mempertahankan sesi.

Rotasi berdasarkan waktu (sticky sessions)

Alamat IP digunakan selama waktu tertentu (5-30 menit), kemudian diganti dengan yang baru. Strategi ini cocok untuk API yang memerlukan penyimpanan sesi, atau ketika perlu melakukan beberapa permintaan terkait dari satu "pengguna".

Perhitungan waktu rotasi yang optimal: jika batas API adalah 100 permintaan per jam, dan Anda berencana untuk melakukan 50 permintaan melalui satu IP, gunakan sticky session selama 30 menit. Dalam waktu ini, Anda akan melakukan 25 permintaan (dengan beban yang merata), yang dua kali lebih rendah dari batas.

Rotasi berdasarkan kumpulan dengan pemantauan batasan

Strategi canggih: skrip Anda melacak jumlah permintaan dari setiap IP dan secara otomatis beralih ke yang baru saat mendekati batas. Misalnya, Anda memiliki kumpulan 20 proxy, batas API adalah 100 permintaan per jam. Skrip melacak penghitung untuk setiap IP dan beralih ke yang berikutnya saat mencapai 90 permintaan.

Strategi ini memerlukan pemrograman logika, tetapi memberikan efisiensi maksimal: Anda menggunakan setiap proxy dengan penuh daya tanpa melebihi batas.

Rotasi geografis

Beberapa API menerapkan batasan yang berbeda tergantung pada wilayah. Misalnya, layanan dapat membatasi permintaan dari AS lebih ketat dibandingkan dari Eropa. Dalam kasus seperti itu, gunakan proxy dari negara yang berbeda dan distribusikan beban di antara mereka.

Strategi rotasi Kapan digunakan Jenis proxy
Setelah setiap permintaan Batas ketat (1-10 permintaan/IP), pengambilan data media sosial Proxy residensial dengan rotasi otomatis
Berdasarkan waktu (5-30 menit) Memerlukan sesi, batasan sedang (50-200 permintaan/jam) Proxy residensial sticky atau mobile
Berdasarkan kumpulan dengan pemantauan batasan Volume pengambilan data besar, batasan API yang diketahui Jenis apa pun dengan kumpulan 10+ IP
Geografis Batasan regional, pengambilan data konten lokal Proxy residensial dari negara yang berbeda

Pengaturan penundaan antara permintaan

Bahkan dengan rotasi IP yang sempurna, penting untuk mengatur penundaan antara permintaan dengan benar. Permintaan yang terlalu cepat terlihat seperti serangan, bahkan jika berasal dari IP yang berbeda.

Perhitungan penundaan minimal

Rumus: penundaan = (jendela waktu dalam detik / batas permintaan) Ɨ koefisien keamanan

Contoh: API mengizinkan 100 permintaan per jam (3600 detik). Penundaan minimal = 3600 / 100 = 36 detik. Tambahkan koefisien keamanan 1.2: 36 Ɨ 1.2 = 43 detik antara permintaan dari satu IP.

Jika Anda menggunakan 10 proxy dengan rotasi, Anda dapat melakukan permintaan setiap 4.3 detik (43 / 10), tanpa melebihi batas pada satu IP pun.

Penundaan acak (jitter)

Alih-alih penundaan tetap 5 detik, gunakan interval acak, misalnya, dari 3 hingga 7 detik. Ini membuat lalu lintas Anda terlihat seperti tindakan pengguna nyata. Banyak sistem perlindungan bot menganalisis pola: jika permintaan datang tepat setiap 5.0 detik, itu mencurigakan.

Penundaan eksponensial saat terjadi kesalahan

Ketika Anda menerima kesalahan 429, jangan terus mengirim permintaan segera. Gunakan penundaan eksponensial: percobaan pertama setelah 1 detik, kedua setelah 2, ketiga setelah 4, keempat setelah 8, dan seterusnya. Ini adalah praktik standar yang diharapkan API dari klien.

Tip: Periksa header Retry-After dalam respons API. Ini menunjukkan waktu tepat kapan Anda dapat mengulangi permintaan. Gunakan nilai ini alih-alih penundaan acak.

Jenis proxy mana yang harus dipilih untuk bekerja dengan API

Pemilihan jenis proxy sangat mempengaruhi keberhasilan menghindari rate limiting. Mari kita bahas pro dan kontra dari setiap opsi untuk bekerja dengan API.

Proxy residensial

Proxy residensial menggunakan alamat IP pengguna nyata yang disediakan oleh penyedia layanan internet. Untuk API, ini terlihat seperti internet rumah biasa.

Keuntungan untuk API:

  • Kepercayaan tinggi: API jarang memblokir IP rumah
  • Kumpulan besar: jutaan IP untuk rotasi
  • Keberagaman geografis: IP dari berbagai kota dan negara
  • Cocok untuk media sosial dan API ketat (Instagram, Facebook, TikTok)

Kerugian:

  • Biaya tinggi: pembayaran biasanya berdasarkan lalu lintas (dari $5-15 per 1 GB)
  • Kecepatan bervariasi: tergantung pada internet pengguna akhir
  • Ketidakstabilan: IP dapat terputus kapan saja

Kapan digunakan: pengambilan data Instagram, Facebook, TikTok, bekerja dengan API marketplace (Wildberries, Ozon), tugas apa pun di mana reputasi IP sangat penting.

Proxy mobile

Proxy mobile menggunakan IP dari operator seluler (4G/5G). Satu IP sering digunakan oleh ribuan pengguna nyata secara bersamaan, sehingga API sangat jarang memblokirnya.

Keuntungan untuk API:

  • Kepercayaan maksimal: API tidak dapat memblokir IP operator seluler
  • Ideal untuk aplikasi mobile dan API (Instagram, TikTok, Snapchat)
  • Perubahan otomatis IP saat reconnect (mode pesawat)
  • Satu IP dapat melakukan lebih banyak permintaan tanpa diblokir

Kerugian:

  • Biaya sangat tinggi: dari $50-150 per satu IP per bulan
  • Kumpulan kecil: sulit mendapatkan ratusan IP mobile
  • Kecepatan bervariasi: tergantung pada kualitas sinyal seluler

Kapan digunakan: bekerja dengan API mobile, pengambilan data Instagram/TikTok dalam volume besar, ketika perlindungan maksimal dari pemblokiran diperlukan.

Proxy data center

Proxy data center adalah alamat IP dari server yang ditempatkan di data center. Mereka tidak terkait dengan pengguna nyata.

Keuntungan untuk API:

  • Biaya rendah: dari $1-5 per IP per bulan
  • Kecepatan tinggi: saluran 1-10 Gbps
  • Stabilitas: IP tidak terputus secara acak
  • Kumpulan besar: mudah mendapatkan ratusan IP

Kerugian:

  • Kepercayaan rendah: banyak API memblokir data center
  • IP sering masuk dalam daftar hitam karena pengguna lain
  • Tidak cocok untuk media sosial dan layanan ketat

Kapan digunakan: pengambilan data dari API publik tanpa perlindungan ketat (cuaca, kurs mata uang, berita), bekerja dengan API sendiri, pengujian, dan pengembangan.

Kriteria Proxy residensial Proxy mobile Data center
Kepercayaan API Tinggi Maksimal Rendah
Ukuran kumpulan Jutaan IP Ratusan IP Ribuan IP
Kecepatan Sedang (10-50 Mbit/s) Sedang (5-100 Mbit/s) Tinggi (100+ Mbit/s)
Biaya $5-15/GB $50-150/IP/bulan $1-5/IP/bulan
Untuk media sosial āœ… Sangat baik āœ… Ideal āŒ Tidak cocok
Untuk API publik āœ… Baik āœ… Baik (mahal) āœ… Sangat baik

Implementasi praktis: contoh kode dalam Python

Mari kita lihat contoh konkret implementasi untuk menghindari rate limiting dengan menggunakan proxy. Semua contoh dalam Python dengan pustaka requests.

Rotasi sederhana dari kumpulan proxy

Implementasi dasar dengan rotasi siklik IP dari daftar:

import requests
import time
from itertools import cycle

# Daftar proxy (format: protocol://user:pass@host:port)
PROXY_LIST = [
    'http://user1:pass1@proxy1.example.com:8080',
    'http://user2:pass2@proxy2.example.com:8080',
    'http://user3:pass3@proxy3.example.com:8080',
]

# Membuat iterator siklik
proxy_pool = cycle(PROXY_LIST)

def make_request(url):
    proxy = next(proxy_pool)  # Mengambil proxy berikutnya dari kumpulan
    proxies = {
        'http': proxy,
        'https': proxy
    }
    
    try:
        response = requests.get(url, proxies=proxies, timeout=10)
        return response
    except requests.exceptions.RequestException as e:
        print(f"Kesalahan dengan proxy {proxy}: {e}")
        return None

# Contoh penggunaan
for i in range(10):
    response = make_request('https://api.example.com/data')
    if response and response.status_code == 200:
        print(f"Permintaan {i+1}: sukses")
    time.sleep(2)  # Penundaan antara permintaan

Rotasi dengan pemantauan batasan

Versi yang lebih canggih, yang menghitung permintaan untuk setiap proxy dan beralih saat mendekati batas:

import requests
import time
from collections import defaultdict

class ProxyRotator:
    def __init__(self, proxy_list, max_requests_per_ip=90, time_window=3600):
        self.proxy_list = proxy_list
        self.max_requests = max_requests_per_ip  # Batas permintaan per IP
        self.time_window = time_window  # Jendela waktu dalam detik
        self.request_counts = defaultdict(list)  # Riwayat permintaan untuk setiap IP
        self.current_index = 0
    
    def get_proxy(self):
        """Mengembalikan proxy dengan jumlah permintaan paling sedikit"""
        current_time = time.time()
        
        # Menghapus catatan lama di luar jendela waktu
        for proxy in self.request_counts:
            self.request_counts[proxy] = [
                t for t in self.request_counts[proxy]
                if current_time - t < self.time_window
            ]
        
        # Mencari proxy dengan jumlah permintaan paling sedikit
        available_proxies = []
        for proxy in self.proxy_list:
            count = len(self.request_counts[proxy])
            if count < self.max_requests:
                available_proxies.append((proxy, count))
        
        if not available_proxies:
            # Jika semua proxy telah mencapai batas, tunggu
            oldest_request = min(
                min(times) for times in self.request_counts.values() if times
            )
            wait_time = self.time_window - (current_time - oldest_request) + 1
            print(f"Semua proxy telah mencapai batas. Menunggu {wait_time:.0f} detik...")
            time.sleep(wait_time)
            return self.get_proxy()
        
        # Memilih proxy dengan jumlah permintaan paling sedikit
        proxy = min(available_proxies, key=lambda x: x[1])[0]
        self.request_counts[proxy].append(current_time)
        return proxy
    
    def make_request(self, url, **kwargs):
        proxy = self.get_proxy()
        proxies = {'http': proxy, 'https': proxy}
        
        try:
            response = requests.get(url, proxies=proxies, timeout=10, **kwargs)
            return response
        except requests.exceptions.RequestException as e:
            print(f"Kesalahan dengan proxy {proxy}: {e}")
            return None

# Contoh penggunaan
PROXY_LIST = [
    'http://user:pass@proxy1.example.com:8080',
    'http://user:pass@proxy2.example.com:8080',
]

rotator = ProxyRotator(PROXY_LIST, max_requests_per_ip=100, time_window=3600)

for i in range(500):  # Melakukan 500 permintaan
    response = rotator.make_request('https://api.example.com/data')
    if response and response.status_code == 200:
        print(f"Permintaan {i+1}: sukses")
    time.sleep(1)  # Penundaan minimal

Penanganan kesalahan 429 dengan penundaan eksponensial

Penanganan yang benar terhadap respons "Terlalu Banyak Permintaan" dengan mempertimbangkan header Retry-After:

import requests
import time

def make_request_with_retry(url, proxies, max_retries=5):
    """Melakukan permintaan dengan pengulangan otomatis saat terjadi kesalahan 429"""
    
    for attempt in range(max_retries):
        try:
            response = requests.get(url, proxies=proxies, timeout=10)
            
            if response.status_code == 200:
                return response
            
            elif response.status_code == 429:
                # Memeriksa header Retry-After
                retry_after = response.headers.get('Retry-After')
                
                if retry_after:
                    wait_time = int(retry_after)
                    print(f"Batas permintaan. Menunggu {wait_time} detik (dari Retry-After)")
                else:
                    # Penundaan eksponensial: 2^attempt detik
                    wait_time = 2 ** attempt
                    print(f"Batas permintaan. Percobaan {attempt+1}, menunggu {wait_time} detik")
                
                time.sleep(wait_time)
                continue
            
            else:
                print(f"Kesalahan HTTP {response.status_code}")
                return None
        
        except requests.exceptions.RequestException as e:
            print(f"Kesalahan koneksi: {e}")
            if attempt < max_retries - 1:
                time.sleep(2 ** attempt)
                continue
            return None
    
    print(f"Jumlah percobaan terlampaui ({max_retries})")
    return None

# Contoh penggunaan
proxies = {
    'http': 'http://user:pass@proxy.example.com:8080',
    'https': 'http://user:pass@proxy.example.com:8080'
}

response = make_request_with_retry('https://api.example.com/data', proxies)
if response:
    print("Data diterima:", response.json())

Menggunakan proxy residensial dengan rotasi otomatis

Banyak penyedia proxy residensial menyediakan satu endpoint yang secara otomatis mengubah IP setiap kali permintaan dilakukan. Contoh pengaturannya:

import requests
import random
import time

# Proxy residensial dengan rotasi otomatis
# Format: protocol://username:password@gateway:port
ROTATING_PROXY = 'http://customer-USER:PASS@proxy.provider.com:12321'

def make_request_rotating(url):
    """Permintaan melalui proxy yang berotasi (IP baru setiap kali)"""
    proxies = {
        'http': ROTATING_PROXY,
        'https': ROTATING_PROXY
    }
    
    # Menambahkan User-Agent acak untuk lebih banyak anonimitas
    user_agents = [
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
        'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36',
    ]
    
    headers = {
        'User-Agent': random.choice(user_agents)
    }
    
    try:
        response = requests.get(url, proxies=proxies, headers=headers, timeout=15)
        return response
    except requests.exceptions.RequestException as e:
        print(f"Kesalahan: {e}")
        return None

# Melakukan 100 permintaan melalui IP yang berbeda
for i in range(100):
    response = make_request_rotating('https://api.example.com/data')
    if response and response.status_code == 200:
        print(f"Permintaan {i+1}: sukses, IP telah diubah")
    
    # Penundaan acak 1-3 detik
    time.sleep(random.uniform(1, 3))

Pemantauan batasan dan penanganan kesalahan

Bekerja secara efektif dengan API memerlukan pemantauan batasan yang konstan dan penanganan kesalahan yang benar. Berikut adalah praktik kunci:

Analisis header respons

Banyak API mengembalikan informasi tentang batasan dalam header respons. Header standar:

  • X-RateLimit-Limit — jumlah maksimum permintaan dalam jendela
  • X-RateLimit-Remaining — berapa banyak permintaan yang tersisa
  • X-RateLimit-Reset — waktu reset batas (timestamp Unix)
  • Retry-After — dalam berapa detik Anda dapat mengulangi permintaan

Contoh membaca header ini:

response = requests.get(url, proxies=proxies)

# Memeriksa header batasan
limit = response.headers.get('X-RateLimit-Limit')
remaining = response.headers.get('X-RateLimit-Remaining')
reset_time = response.headers.get('X-RateLimit-Reset')

if remaining:
    remaining = int(remaining)
    if remaining < 10:
        print(f"Perhatian! Hanya tersisa {remaining} permintaan")
        
if reset_time:
    import datetime
    reset_dt = datetime.datetime.fromtimestamp(int(reset_time))
    print(f"Batas akan direset pada {reset_dt}")

Logging dan statistik

Simpan statistik terperinci dari permintaan untuk setiap proxy. Ini akan membantu mengidentifikasi IP yang bermasalah dan mengoptimalkan rotasi:

import json
from datetime import datetime

class RequestLogger:
    def __init__(self):
        self.stats = {}
    
    def log_request(self, proxy, status_code, response_time):
        if proxy not in self.stats:
            self.stats[proxy] = {
                'total': 0,
                'success': 0,
                'rate_limited': 0,
                'errors': 0,
                'avg_response_time': 0
            }
        
        self.stats[proxy]['total'] += 1
        
        if status_code == 200:
            self.stats[proxy]['success'] += 1
        elif status_code == 429:
            self.stats[proxy]['rate_limited'] += 1
        else:
            self.stats[proxy]['errors'] += 1
        
        # Memperbarui rata-rata waktu respons
        current_avg = self.stats[proxy]['avg_response_time']
        total = self.stats[proxy]['total']
        self.stats[proxy]['avg_response_time'] = (
            (current_avg * (total - 1) + response_time) / total
        )
    
    def print_stats(self):
        print("\n=== Statistik proxy ===")
        for proxy, data in self.stats.items():
            success_rate = (data['success'] / data['total'] * 100) if data['total'] > 0 else 0
            print(f"\nProxy: {proxy}")
            print(f"  Total permintaan: {data['total']}")
            print(f"  Sukses: {data['success']} ({success_rate:.1f}%)")
            print(f"  Rate limited: {data['rate_limited']}")
            print(f"  Kesalahan: {data['errors']}")
            print(f"  Rata-rata waktu respons: {data['avg_response_time']:.2f}s")

# Penggunaan
logger = RequestLogger()

start_time = time.time()
response = requests.get(url, proxies=proxies)
response_time = time.time() - start_time

logger.log_request(proxy, response.status_code, response_time)
logger.print_stats()

Pengalihan strategi otomatis

Jika Anda terus-menerus menerima kesalahan 429, secara otomatis perlambat permintaan atau tingkatkan kumpulan proxy:

class AdaptiveRateLimiter:
    def __init__(self, initial_delay=1.0):
        self.delay = initial_delay
        self.consecutive_429 = 0
    
    def on_success(self):
        """Permintaan sukses - bisa sedikit mempercepat"""
        self.consecutive_429 = 0
        self.delay = max(0.5, self.delay * 0.95)  # Mengurangi penundaan sebesar 5%
    
    def on_rate_limit(self):
        """Mendapatkan 429 - perlu melambat"""
        self.consecutive_429 += 1
        self.delay *= 1.5  # Meningkatkan penundaan 1.5 kali
        
        if self.consecutive_429 > 5:
            print("PERHATIAN: Terlalu banyak kesalahan 429. Periksa pengaturan!")
    
    def wait(self):
        """Menunggu sebelum permintaan berikutnya"""
        time.sleep(self.delay)
        return self.delay

# Penggunaan
limiter = AdaptiveRateLimiter(initial_delay=2.0)

for i in range(1000):
    response = make_request(url)
    
    if response.status_code == 200:
        limiter.on_success()
    elif response.status_code == 429:
        limiter.on_rate_limit()
    
    delay = limiter.wait()
    print(f"Permintaan {i+1}, penundaan: {delay:.2f}s")

Penanganan captcha dan pemblokiran lainnya

Beberapa API menunjukkan captcha alih-alih pemblokiran langsung saat batas terlampaui. Tanda-tandanya:

  • Kode status 403 dengan body respons yang berisi "captcha" atau "recaptcha"
  • Redirect ke halaman captcha (status 302)
  • Header khusus seperti X-Captcha-Required: true

Dalam kasus seperti itu, Anda harus:

  1. Segera berhenti menggunakan IP ini
  2. Beralih ke proxy lain dari kumpulan
  3. Tingkatkan penundaan antara permintaan
  4. Tambahkan lebih banyak variasi pada User-Agent dan header lainnya

Penting: Jika Anda sering menghadapi captcha saat menggunakan proxy residensial, masalahnya kemungkinan besar terletak pada pola perilaku (header yang sama, permintaan terlalu cepat), bukan pada alamat IP.

Kesimpulan

Menghindari API rate limiting saat menggunakan proxy bukan hanya pengaturan teknis, tetapi strategi komprehensif yang mencakup pemilihan jenis proxy yang tepat, pengaturan rotasi IP, manajemen penundaan, dan pemantauan batasan. Kesimpulan kunci dari artikel ini:

  • Proxy itu sendiri tidak menyelesaikan masalah rate limiting — diperlukan strategi rotasi yang tepat
  • Untuk media sosial dan API ketat, gunakan proxy residensial atau mobile, untuk API publik, data center cocok
  • Hitung ukuran kumpulan proxy berdasarkan batasan API dan kecepatan pengambilan data yang diinginkan
  • Selalu perhatikan pola perilaku dan sesuaikan strategi sesuai kebutuhan.
```