Jawaban cepat
Apa arti 429 Too Many Requests dengan proxy?
429 Too Many Requests artinya situs membatasi laju Anda: Anda mengirim lebih banyak permintaan daripada yang diterima dalam jendela waktu. Perbaikannya adalah mengirim lebih sedikit, bukan menyembunyikan lebih banyak. Dengan proxy residential CrawlRelay, hargai header Retry-After, batasi konkurensi per host, dan lakukan backoff eksponensial dengan jitter acak. Rotasi IP untuk melebihi batas situs melanggar sebagian besar ketentuan penggunaan.
429 Too Many Requests sekilas
| Kesalahan | 429 Too Many Requests |
|---|---|
| Tipe | Kode status HTTP (4xx, kesalahan klien) |
| Dikirim oleh | Situs target atau gateway API-nya |
| Didefinisikan dalam | RFC 6585, section 4 (Retry-After: RFC 9110, section 10.2.3) |
| Mencoba lagi? | Ya, setelah jeda Retry-After atau backoff eksponensial |
| Periksa pertama | Baca header Retry-After dan laju permintaan per detik per host Anda |
Apa arti 429 Too Many Requests?
RFC 6585 memperkenalkan 429 untuk pembatasan laju. Server bisa menambahkan header Retry-After, berupa jumlah detik atau tanggal HTTP, untuk memberi tahu kapan harus kembali. API sering menambahkan header sendiri, seperti X-RateLimit-Remaining.
429 adalah jawaban paling sopan yang bisa diberikan situs kepada scraper. Itu menandakan konten tersedia, hanya saja tidak secepat laju Anda saat ini. Situs yang mengabaikan 429 biasanya akan menaikkan menjadi 403, CAPTCHA atau blokir permanen.
Seperti apa a 429 dalam Python, curl, Node.js, dan browser?
Kegagalan yang sama dicetak berbeda di setiap alat. Ini adalah pesan yang perlu dicari di log Anda:
- Python requests / httpx:
status_code == 429, biasanya denganRetry-After: 30 - Scrapy: ditangani oleh
RetryMiddleware, karena 429 ada diRETRY_HTTP_CODESbawaan - curl:
HTTP/2 429diikutiretry-after:di header respons - API: dengan body JSON seperti
{"error": "rate_limited"}
Apa penyebab a 429?
Kemungkinan besar pertama:
- Terlalu banyak konkurensi per host. Lima puluh pekerja paralel di satu domain terlihat seperti serangan bagi kebanyakan situs.
- Tanpa jeda antar permintaan, atau jeda tetap yang membuat banyak pekerja melakukan permintaan bersamaan.
- Retry tanpa backoff. Gelombang retry setelah 429 pertama meningkatkan beban.
- Batas berbagi. Beberapa situs menghitung permintaan per akun, per kunci API, atau per cookie sesi, bukan per IP.
- Endpoint berat. URL pencarian dan penyaringan sering memiliki batas lebih ketat daripada halaman statis.
Bagaimana cara mendiagnosis a 429 langkah demi langkah?
- Catat nilai
Retry-Afterdan header pembatas laju saat 429 pertama muncul. - Ukur laju permintaan nyata Anda per host, bukan total laju.
- Periksa apakah batas mengikuti IP, cookie, atau kunci API: ubah satu per satu.
- Baca dokumentasi API atau robots.txt situs; baris
Crawl-delaymenyatakan kecepatan yang diminta.
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URLBagaimana cara memperbaiki a 429?
- Hormati Retry-After. Tunggu minimal waktu yang diminta server.
- Batasi konkurensi per host, bukan hanya secara global. Scrapy memiliki
CONCURRENT_REQUESTS_PER_DOMAINdanAUTOTHROTTLE_ENABLED. - Lakukan backoff eksponensial dengan jitter: 1 detik, 2 detik, 4 detik, dst, plus fraksi acak, dibatasi maksimum.
- Ambil lebih sedikit. Cache respons, kirim
If-Modified-SinceatauIf-None-Match, dan lewati halaman yang tidak berubah. - Gunakan API resmi jika situs menyediakannya; batasannya biasanya terdokumentasi.
import random
import time
import requests
PROXY = "http://USERNAME:[email protected]:7777"
PROXIES = {"http": PROXY, "https": PROXY}
RETRY_STATUSES = {429, 502, 503, 504}
def fetch(url, attempts=5, timeout=(10, 30)):
for attempt in range(attempts):
try:
r = requests.get(url, proxies=PROXIES, timeout=timeout)
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout):
r = None # dropped exit, reset or timeout: a new connection gets a new exit
if r is not None and r.status_code not in RETRY_STATUSES:
return r
retry_after = r.headers.get("Retry-After", "") if r is not None else ""
if retry_after.isdigit():
wait = int(retry_after)
else:
wait = min(60, 2 ** attempt) + random.uniform(0, 1)
time.sleep(wait)
raise RuntimeError("giving up on %s after %d attempts" % (url, attempts))Haruskah saya mencoba lagi setelah a 429?
Ya, 429 memang dimaksudkan untuk dicoba ulang nanti. Tunggu jeda Retry-After jika server mengirimnya; jika tidak, gunakan backoff eksponensial dengan jitter dan batas maksimum. Hitung 429 berturut-turut per host dan turunkan konkurensi host saat jumlahnya bertambah. Fungsi Python di bawah ini melakukan bagian dasar tersebut.
Bagaimana 429 Too Many Requests berlaku untuk CrawlRelay?
429 yang Anda terima lewat CrawlRelay membawa header dan body target sendiri: batasan milik situs, dan penjadwalan per host adalah tugas Anda. Gunakan sesi sticky saat situs menghitung permintaan per sesi, agar laju Anda tetap terukur, dan lihat panduan konkurensi untuk angka awal.
Gateway: gw.crawlrelay.com, port 7777 (HTTP, HTTPS melalui CONNECT) dan port 7778 (SOCKS5). Format username: USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}. Terkait: 403 Forbidden · 503 Service Unavailable · Panduan konkurensi.
429 Too Many Requests: pertanyaan yang sering ditanyakan pengembang
Haruskah saya merotasi IP untuk menghindari error 429?
Tidak. 429 adalah permintaan situs agar Anda memperlambat. Menyebar laju permintaan yang sama ke lebih banyak IP untuk tetap di bawah batas per-IP adalah penghindaran, dan sebagian besar ketentuan penggunaan melarangnya. Rotasi berguna untuk penyebaran beban dan lokasi, bukan untuk melewati batas yang diumumkan. Turunkan laju Anda dan gunakan cache jika bisa.
Berapa lama harus menunggu setelah 429?
Tunggu jumlah detik di header Retry-After, atau sampai tanggal yang diberikan. Tanpa header, mulai dari satu atau dua detik dan gandakan jeda setelah setiap 429 baru, dengan tambahan acak dan batas sekitar satu menit. Lanjutkan dengan laju lebih rendah, bukan laju yang menyebabkan 429.
Mengapa saya mendapat 429 dengan hanya beberapa permintaan per menit?
Batas kemungkinan per akun, cookie, atau kunci API, bukan per IP, atau endpoint bisa berat, seperti halaman pencarian. Beberapa situs juga menetapkan batas rendah untuk klien yang mereka klasifikasikan sebagai bot. Periksa header respons dan dokumentasi API situs, dan minta akses jika perlu lebih.
Kesalahan proxy lain dalam referensi ini
Kode status HTTP
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
Kesalahan browser dan klien
Error koneksi dan TLS
Proxy residensial dengan dokumentasi yang membahas kasus kegagalan
Proxy residensial CrawlRelay dari US$0,50/GB, lalu lintas yang tidak pernah kedaluwarsa.