Jawaban cepat
Bagaimana sticky sessions dan rotasi IP bekerja pada proxy residensial?
Di CrawlRelay, username tanpa ID sesi mendapatkan IP dari pool pada setiap koneksi TCP baru, biasanya berbeda, dan -session-<id>-ttl-<minutes> mempertahankan satu IP untuk ID itu selama hingga 30 menit, meskipun IP bisa berubah lebih awal. Rotasi mengikuti koneksi, bukan permintaan HTTP, jadi keep-alive menentukan kapan IP Anda sebenarnya berubah. Trafik residensial dikenai biaya US$0,50/GB mulai dari 50 GB. Dibayar dengan crypto, tanpa KYC.
Aturan sesi secara singkat
| Unit rotasi | Satu IP dari pool per koneksi TCP baru, biasanya berbeda |
|---|---|
| Sticky session | -session-<id>-ttl-<minutes> ditambahkan ke username |
| Panjang sesi | hingga 30 menit |
| ID sesi | 1–32 huruf atau angka; satu ID per alur |
| Apa yang mengakhiri sesi lebih awal | Perangkat residensial di belakangnya offline |
| ID Bersama | Klien yang mengirim ID yang sama berbagi exit yang sama |
| Biaya | Gratis: sesi dan rotasi sudah termasuk dalam harga per-GB |
Apa yang terjadi di gateway saat saya mengirimkan ID sesi?
Gateway membaca username pada setiap koneksi baru. Tanpa bagian sesi, gateway memilih exit proxy residensial yang sesuai dengan target Anda hanya untuk koneksi itu saja. Dengan bagian sesi, gateway mempertahankan exit yang sama untuk ID itu hingga TTL yang Anda tentukan.
IP lengket adalah koneksi rumah nyata, jadi bisa hilang sebelum TTL berakhir: perangkat dimatikan, kehilangan Wi-Fi, atau berganti jaringan. Alur panjang harus bisa bertahan dari hal ini dengan memeriksa IP exit pada titik pemeriksaan dan memulai ulang dari titik pemeriksaan tersebut, bukan gagal seluruh pekerjaan.
Bagaimana setiap library menggunakan ulang koneksi?
Jika sebuah library menjaga koneksi tetap hidup, setiap permintaan pada koneksi itu menggunakan satu exit yang sama. Ini cara mendapatkan tiap perilaku dengan sengaja.
| Library | Default | IP baru per permintaan | Satu IP untuk satu alur |
|---|---|---|---|
| Python requests | Session menjaga koneksi tetap hidup | Header Connection: close, atau Session baru per permintaan | Satu Session dengan ID sesi di username |
| httpx | Klien mengelola kumpulan koneksi | httpx.Limits(max_keepalive_connections=0) | Satu klien per ID sesi |
| aiohttp | TCPConnector mengelola kumpulan koneksi | TCPConnector(force_close=True) | ID sesi di username URL proxy |
| Scrapy | Kumpulan berdasarkan kredensial proxy dan host | meta={"proxy_session": "new"} dengan middleware kami | proxy_session tetap untuk alur |
| Playwright / Puppeteer | Chrome mengelola kumpulan per konteks | Konteks baru per halaman | Satu konteks per ID sesi |
| Node.js undici, axios, got | Agent menjaga socket tetap hidup | Agent baru per permintaan, atau keep-alive mati | Satu agent per ID sesi |
| curl | Satu koneksi per perintah | Sudah seperti itu | ID sesi yang sama di setiap perintah |
Strategi sesi mana cocok dengan pekerjaan scraping mana?
| Pekerjaan | Strategi | TTL yang disarankan |
|---|---|---|
| Halaman produk, artikel, atau listing mandiri | Putar: tanpa ID sesi | — |
| Paginasi dengan halaman berikutnya bergantung pada cookie atau cursor | Satu sesi lengket per listing | 10–30 menit |
| Cari, lalu hasil, lalu halaman detail | Satu sesi lengket per pencarian | 10–20 menit |
| Peramban headless yang merender beberapa halaman dari satu situs | Satu sesi lengket per konteks peramban | Masa hidup konteks, hingga 30 menit |
| Memeriksa apa yang ditampilkan halaman di beberapa kota | Satu sesi pendek per pemeriksaan kota | 5 menit |
| Memeriksa ulang halaman yang sama setiap jam | Putar | — |
Bagaimana cara mengelola pool sesi lengket dalam Python?
Pool kecil mendistribusikan beban ke beberapa exit yang stabil dan pensiun setiap satu setelah sejumlah permintaan tertentu atau setelah tanda exitnya gagal, seperti 502 atau 503. Catat apa yang tidak dilakukannya: tidak menukar IP untuk melewati 403 atau 429. Itu berarti situs ingin Anda lambat, jadi pool meneruskannya ke kode Anda.
import random
import uuid
import requests
GATEWAY = "gw.crawlrelay.com:7777"
BASE_USER, PASSWORD = "USERNAME-country-us", "PASSWORD"
class SlowDown(Exception):
"""The target asked us to slow down (403 or 429): back off, do not rotate."""
class StickySession:
def __init__(self, ttl=15, max_requests=50):
self.id = uuid.uuid4().hex[:10]
self.max_requests, self.used = max_requests, 0
user = "%s-session-%s-ttl-%d" % (BASE_USER, self.id, ttl)
proxy = "http://%s:%s@%s" % (user, PASSWORD, GATEWAY)
self.http = requests.Session()
self.http.proxies = {"http": proxy, "https": proxy}
class SessionPool:
EXIT_PROBLEMS = {502, 503, 504}
def __init__(self, size=5, **options):
self.options = options
self.sessions = [StickySession(**options) for _ in range(size)]
def _replace(self, i):
self.sessions[i].http.close()
self.sessions[i] = StickySession(**self.options)
def get(self, url, **kwargs):
i = random.randrange(len(self.sessions))
s = self.sessions[i]
s.used += 1
try:
r = s.http.get(url, timeout=(10, 30), **kwargs)
except requests.exceptions.RequestException:
self._replace(i) # dropped exit or timeout: start a fresh session
raise
if r.status_code in (403, 429):
raise SlowDown("%s returned %d" % (url, r.status_code))
if r.status_code in self.EXIT_PROBLEMS or s.used >= s.max_requests:
self._replace(i)
return r
pool = SessionPool(size=5, ttl=15, max_requests=50)
print(pool.get("https://api.ipify.org").text)Bagaimana saya tahu IP lengket telah berubah?
Tanya. Minta layanan echo IP seperti https://api.ipify.org melalui sesi yang sama di awal alur dan di setiap checkpoint, lalu bandingkan jawabannya. Perubahan berarti exit di balik sesi berubah: mulai ulang alur dari checkpoint terakhir, atau buka sesi baru. Catat dengan ID sesi agar Anda bisa membedakan perubahan IP dari perilaku situs saat debugging.
Kesalahan sesi mana yang paling merugikan?
- Memutar pada setiap permintaan dalam alur multi-langkah. Situs melihat keranjang, cursor atau token pencarian berpindah antar negara dan mengatur ulang.
- Satu ID sesi untuk setiap pekerja. Sesi dimaksudkan untuk satu alur; berikan setiap pekerja dan alurnya ID sendiri.
- Sesi jauh lebih lama dari pekerjaan. TTL 30 menit untuk alur 2 menit membuat IP sibuk tanpa alasan dan membuat log sulit dibaca.
- Menganggap 429 sebagai masalah IP. IP baru tidak mengubah aturan situs; memperlambatlah yang mengubahnya. Lihat 429 Too Many Requests.
- Mengira rotasi per permintaan. Keep-alive mempertahankan exit; periksa tabel di atas untuk perpustakaan Anda.
Sesi dan rotasi: pertanyaan
Berapa lama sesi lengket bertahan?
Sticky sessions menjaga IP yang sama selama waktu yang Anda atur (ttl, dalam menit), hingga 30 menit. IP bisa berubah lebih awal, misal jika perangkat residensial offline. Pilih TTL sedikit lebih lama dari alur yang dilayani, dan periksa exit di checkpoint.
Apakah sesi lengket lebih mahal daripada rotasi?
Tidak. CrawlRelay membebankan lalu lintas per GB, dan sesi, rotasi serta penargetan termasuk dalam harga itu. Sesi lengket malah dapat menghemat lalu lintas karena satu koneksi keep-alive menghindari handshake TLS baru untuk setiap permintaan.
Apakah rotasi di setiap permintaan lebih baik untuk scraping?
Untuk halaman independen, rotasi mendistribusikan beban dan menghindari mengakses situs dari satu IP selama berjam-jam. Untuk apa pun yang memiliki status, seperti paginasi yang terkait dengan cookie, itu memecah alur. Sebagian besar crawl menggabungkan keduanya: putar antar item, tetap lengket dalam alur.
Bisakah saya memilih IP persis yang saya dapatkan?
Tidak. Gateway proxy residensial menetapkan exit dari pool yang selalu berubah, menyesuaikan dengan penargetan pada username Anda. Anda memilih negara, kota, negara bagian AS, kode pos atau ASN, dan bisa mempertahankan IP dengan sesi; Anda tidak dapat memesan alamat spesifik.
Rotasi dan sesi ada di setiap paket
US$1,50 untuk 1 GB, US$0,50/GB dari 50 GB.