Tanpa KYC — tanpa ID, tanpa selfie, tanpa dokumen. Bayar dengan crypto: BTC, USDT, USDC, ETH, SOL, LTC
Bahasa: Bahasa Indonesia
Mulai sekarang

Dokumen · konkruensi · throughput · kesopanan

Konkruensi dan throughput melalui proxy residensial

Gateway mengenakan biaya per GB, bukan per thread, jadi batas nyata Anda adalah setiap situs target. Sesuaikan konkruensi dari throughput yang Anda butuhkan, batasi per host, dan biarkan respons memberi tahu kapan harus melambat.

Terakhir diperbarui: · 6 baca dalam menit

Jawaban cepat

Berapa banyak permintaan konkuren yang bisa saya jalankan melalui proxy residensial?

Sebanyak yang dapat ditoleransi setiap target: CrawlRelay mengenakan biaya trafik residensial per GB (US$0,50/GB dari 50 GB), bukan per thread atau koneksi. Ukur konkruensi dengan hukum Little, permintaan dalam penerbangan = halaman per detik × detik per halaman, lalu batasi per host, mulai dari 2 sampai 4. Turunkan jika muncul respons 429 atau 503. Dibayar dengan crypto, tanpa KYC.

Konkruensi sekilas

PenagihanPer GB trafik; thread dan koneksi tidak dikenai biaya
Aturan pengukuranDalam penerbangan = throughput × latensi (hukum Little)
Titik awal per host2–4 permintaan paralel; 1 dengan jeda untuk situs kecil
Sinyal untuk melambat429, 503, waktu respons yang naik, halaman tantangan
Perhitungan bandwidthHalaman per detik × byte per halaman × 3.600 = byte per jam
Median respons residensial0,93 s di jaringan proxy, 3,21 s di target nyata (Proxyway 2026)

Bagaimana cara mengukur konkruensi dari throughput yang saya butuhkan?

Gunakan hukum Little: jumlah permintaan dalam penerbangan sama dengan laju yang diinginkan dikalikan durasi setiap permintaan. Proxy Market Research 2026 dari Proxyway mengukur median 3,21 detik per permintaan di target nyata melalui proxy residensial, jadi rencanakan dengan 2 sampai 4 detik untuk situs nyata, bukan angka kurang dari satu detik pada jaringan saja.

TujuanWaktu per permintaanPermintaan dalam penerbangan
5 halaman per detik2 s10
20 halaman per detik2 s40
20 halaman per detik4 s80
100 halaman per detik3 s300

Kemudian sebarkan permintaan tersebut ke host. Empat puluh permintaan dalam penerbangan di 200 situs adalah halus; empat puluh di satu situs kecil adalah uji beban yang tidak disetujui situs tersebut.

Berapa banyak bandwidth yang digunakan throughput itu?

Kalikan halaman per detik dengan byte per halaman. Pada 20 halaman HTML per detik dan 50 KB per halaman, crawl bergerak 1 MB per detik, yaitu 3,6 GB per jam dan sekitar 86 GB per hari. Pada 2 MB per halaman yang dirender, laju yang sama akan menggerakkan 40 MB per detik.

Kalikan hasilnya dengan harga per GB rencana Anda, US$0,50/GB dari 50 GB di CrawlRelay, untuk mendapatkan biaya per jam. panduan kalkulator bandwidth memberi berat halaman tipikal berdasarkan jenis halaman.

Batasan per host apa yang harus saya mulai?

TargetPermintaan paralel per hostJeda antar permintaanCatatan
Situs kecil (blog, toko lokal)12–5 sHormati Crawl-delay dalam robots.txt jika ada
Situs menengah2–40,5–2 dPantau waktu respons; kurangi beban saat waktu respons menjadi dua kali lipat
Platform besar dengan CDN4–16AutoThrottle atau adaptifNaikkan hanya saat tingkat 429 dan 5xx tetap stabil
API publikBatas yang didokumentasikanSesuai dokumentasiGunakan kunci API dan batas yang diberikan penyedia

Bagaimana cara menyesuaikan konkurensi secara otomatis?

Gunakan peningkatan aditif dan penurunan multiplikatif, aturan yang digunakan TCP untuk kemacetan: tambahkan satu slot setelah serangkaian respons bersih, kurangi batas menjadi setengah saat 429 atau 503 terjadi. Pembatas di bawah menjaga satu batas per host, menghentikan setiap permintaan ke host tersebut selama Retry-After delay, mencoba ulang sekali, dan tidak pernah melebihi batas atas yang Anda tetapkan. Kesalahan jaringan dikembalikan sebagai nilai, jadi satu timeout tidak menghentikan batch.

Python asyncio: batas adaptif dengan httpx
import asyncio
import random
from urllib.parse import urlsplit

import httpx

PROXY = "http://USERNAME-country-us:[email protected]:7777"


class AdaptiveLimit:
    """One per host: +1 slot after 20 clean responses, halve on 429/503, pause for Retry-After."""

    def __init__(self, start=2, low=1, high=16):
        self.limit, self.low, self.high = start, low, high
        self.in_flight, self.clean = 0, 0
        self.pause_until = 0.0
        self.cond = asyncio.Condition()

    async def __aenter__(self):
        loop = asyncio.get_running_loop()
        while True:
            async with self.cond:
                await self.cond.wait_for(lambda: self.in_flight < self.limit)
                delay = self.pause_until - loop.time()
                if delay <= 0:
                    self.in_flight += 1
                    return self
            await asyncio.sleep(delay)  # the host asked for a pause: wait outside the lock

    async def __aexit__(self, *exc):
        async with self.cond:
            self.in_flight -= 1
            self.cond.notify_all()

    def record(self, status, retry_after=None):
        if status in (429, 503):
            self.limit, self.clean = max(self.low, self.limit // 2), 0
            wait = int(retry_after) if retry_after and retry_after.isdigit() else 5 + random.random()
            now = asyncio.get_running_loop().time()
            self.pause_until = max(self.pause_until, now + wait)
        elif status < 400:
            self.clean += 1
            if self.clean >= 20 and self.limit < self.high:
                self.limit, self.clean = self.limit + 1, 0


gates = {}


def gate_for(url):
    host = urlsplit(url).hostname
    if host not in gates:
        gates[host] = AdaptiveLimit()
    return gates[host]


async def fetch(client, url, attempts=2):
    gate = gate_for(url)
    status = None
    for _ in range(attempts):
        try:
            async with gate:
                r = await client.get(url)
        except httpx.HTTPError as exc:
            return "error: %s" % type(exc).__name__
        status = r.status_code
        gate.record(status, r.headers.get("Retry-After"))
        if status not in (429, 503):
            break  # the retry, if any, waits for the host's pause in __aenter__
    return status


async def main(urls):
    timeout = httpx.Timeout(30.0, connect=10.0)
    async with httpx.AsyncClient(proxy=PROXY, timeout=timeout) as client:
        print(await asyncio.gather(*(fetch(client, u) for u in urls)))
    print({host: gate.limit for host, gate in gates.items()})


asyncio.run(main(["https://example.com/"] * 10))

Apa yang memperlambat crawl dengan proxy selain targetnya?

  • Handshake TLS. Koneksi baru untuk setiap permintaan, yang diperlukan untuk IP baru setiap kali, menambahkan handshake dengan situs setiap kali. Gunakan sesi lengket dengan keep-alive untuk halaman pada satu situs jika keberagaman IP tidak penting.
  • Exit lambat. Exit residensial dan seluler adalah tautan rumah dan seluler yang nyata. Gunakan waktu tunggu dan coba ulang pada koneksi baru daripada menunggu.
  • Target yang sempit. Kota kecil atau ASN tunggal memiliki exit lebih sedikit dibandingkan satu negara. Targetkan dengan sempit hanya di tempat data berubah.
  • Rendering. Browser headless membutuhkan CPU, memori, dan trafik jauh lebih banyak per halaman dibandingkan klien HTTP. Render hanya halaman yang perlu JavaScript.
  • DNS. Dengan socks5h:// atau port HTTP, DNS diselesaikan di exit; Anda tidak membutuhkan cache resolver lokal untuk host target.

Pertanyaan tentang konkurensi

Apakah CrawlRelay membatasi jumlah thread atau koneksi?

Paket dihitung per GB trafik, bukan per thread, koneksi atau permintaan, dan paket yang dipublikasikan tidak menetapkan jumlah thread. Batas praktis adalah toleransi setiap target dan mesin Anda sendiri. Jika Anda merencanakan crawl sangat besar, tulis ke [email protected] terlebih dahulu agar kami bisa memeriksa cakupan target Anda.

Mengapa crawl saya menjadi lebih lambat saat menambah thread?

Biasanya karena target mulai memberi throttle: waktu respons naik, respons 429 atau 503 muncul, dan retry menambah beban. Penyebab umum lain adalah mesin Anda kehabisan CPU atau soket, terutama dengan browser headless. Ukur latensi dan tingkat error per host sebelum menambah thread.

Apakah satu koneksi per permintaan lebih lambat daripada keep-alive?

Ya, karena ada satu handshake TCP dan TLS per permintaan, biasanya beberapa ratus milidetik melalui exit residensial. Itu harga dari IP baru di setiap permintaan. Untuk banyak halaman pada satu situs yang IP-nya tidak penting, sesi lengket dengan keep-alive lebih cepat dan menggunakan lebih sedikit trafik.

Bagaimana cara menghormati crawl-delay robots.txt dalam crawler dengan konkurensi?

Parsing robots.txt sekali per host, simpan cache hingga 24 jam seperti disarankan RFC 9309, dan ubah nilai Crawl-delay menjadi jeda minimum per host antara permintaan dengan konkurensi 1. Python urllib.robotparser mengekspose ini melalui crawl_delay().

Skalakan dengan harga per GB

US$0,50/GB dari 50 GB hingga 1 TB, trafik yang tidak pernah kedaluwarsa.

Dari US$0,50/GB · tanpa KYC

Mulai sekarang