Proxy berputar untuk scraping: cara setup dan jebakannya
Proxy berputar mengubah alamat IP tempat lalu lintas Anda keluar, baik di setiap request maupun setelah interval tertentu. Ini adalah salah satu alat paling umum dalam web scraping, dan salah satu yang paling sering disalahgunakan. Terlalu jarang merotasi, dan satu alamat akan terkena pembatasan laju. Terlalu sering merotasi, dan lalu lintas Anda tidak terlihat seperti pengunjung sama sekali. Panduan ini menjelaskan dua model rotasi, menunjukkan setup Python yang berfungsi dengan retry untuk proxy mati, dan membahas bagaimana bidang proxy cocok dengan pemecahan captcha.
Rotasi versus sesi sticky
Ada dua cara layanan proxy berputar membagikan alamat:
- Rotasi per request. Setiap request mendapat alamat keluar yang baru. Ini cocok untuk crawl besar dengan banyak halaman yang tidak saling terkait, di mana tidak ada halaman yang membutuhkan halaman sebelumnya.
- Sesi sticky. Satu alamat disimpan selama waktu tertentu, sering kali beberapa menit, atau sampai Anda melepaskannya. Ini cocok untuk apa pun yang membutuhkan state: login, keranjang belanja, atau daftar bernomor halaman yang bergantung pada cookie.
Pengunjung sungguhan mempertahankan satu alamat selama seluruh kunjungan. Sesi sticky meniru perilaku itu, jadi biasanya merupakan default yang lebih baik ketika situs menggunakan cookie atau sesi. Gunakan rotasi per request untuk crawling tanpa state.
Pool proxy dasar di Python
Contoh di bawah ini menyimpan pool URL proxy, merotasinya, dan berpindah ke yang berikutnya ketika satu gagal. Simpan kredensial di environment variable, jangan pernah di kode sumber.
import itertools
import os
import requests
# URL proxy diambil dari environment, misalnya:
# PROXY_POOL="http://user:pass@203.0.113.10:8080,http://user:pass@203.0.113.11:8080"
PROXIES = [p.strip() for p in os.environ.get("PROXY_POOL", "").split(",") if p.strip()]
rotation = itertools.cycle(PROXIES)
def fetch(url: str, max_tries: int = 3) -> requests.Response:
last_error = None
for _ in range(max_tries):
proxy = next(rotation)
try:
r = requests.get(
url,
proxies={"http": proxy, "https": proxy},
timeout=30,
)
if r.status_code == 407: # autentikasi proxy gagal
raise requests.RequestException("proxy auth rejected")
return r
except requests.RequestException as exc:
last_error = exc # proxy mati atau lambat: coba yang berikutnya
raise RuntimeError(f"semua percobaan gagal untuk {url}: {last_error}")
Ada dua detail yang penting di sini. Pertama, proxy yang mati harus di-retry pada alamat yang berbeda, bukan alamat yang sama. Kedua, request yang gagal karena error autentikasi harus berhenti dan dilaporkan, bukan menghabiskan seluruh pool.
Pantau kesehatan proxy
Round robin biasa terus mengirim lalu lintas ke proxy yang mulai gagal. Lacak skor sederhana untuk setiap alamat: hitung kegagalan terbaru, dan keluarkan alamat dari pool selama periode cool-down begitu melewati ambang batas. Kembalikan nanti dan pantau lagi. Scraper Anda kemudian menghabiskan request-nya pada bagian pool yang sehat.
Catat proxy yang dipakai untuk setiap hasil. Ketika situs mulai mengembalikan pemblokiran, Anda ingin tahu apakah satu alamat, satu wilayah, atau seluruh pool yang bertanggung jawab.
Atur pacing pool
Rotasi menyebarkan beban ke berbagai alamat, tetapi setiap alamat tetap punya batas laju. Tetapkan jeda per alamat, dan batas global jumlah request per detik di seluruh pool. Rotasi bukanlah izin untuk mengirim lebih banyak lalu lintas. Rotasi adalah cara untuk menjaga lalu lintas dari satu alamat tetap dalam batas yang wajar.
Kesalahan umum
Sebagian besar masalah rotasi berasal dari beberapa kebiasaan. Mengganti alamat di tengah login atau alur checkout merusak sesi dan membuat situs curiga. Respons 429 adalah pembatasan laju di sisi situs, bukan proxy yang rusak, jadi berpindah ke alamat baru dan langsung mencoba ulang hanya memperparah masalah. Mengganti alamat di setiap request sambil mempertahankan cookie yang sama juga tidak konsisten, karena cookie itu diterbitkan untuk pengunjung yang berbeda. Terakhir, pool yang tidak pernah diperiksa akan diam-diam dipenuhi alamat mati, dan tingkat error Anda akan naik tanpa penyebab yang jelas. Periksa pool secara berkala dan buang yang gagal.
Proxy dan pemecahan captcha
Beberapa tugas captcha bisa menggunakan proxy yang dipakai scraper Anda. Anda mengirimkannya di field opsional proxy, dalam format http://user:pass@host:port, dan solve berjalan dari jalur jaringan yang sama dengan request halaman Anda. Tugas proxyless melewati field itu sama sekali. Mana yang dipilih bergantung pada apakah situs mengikat captcha ke alamat jaringan, dan trade-off itu dijelaskan dalam proxy vs proxyless captcha.
Dua poin praktis:
- Gunakan proxy yang sama untuk request halaman dan solve captcha ketika situs memeriksa alamat. Mencampur alamat bisa membuat token gagal.
- Token kedaluwarsa dengan cepat. Minta token tepat sebelum Anda mengirim form, bukan jauh sebelumnya. Lihat masa berlaku token captcha.
Jenis captcha yang aktif di Scarnox saat ini adalah PopularCaptcha. Panduan Python PopularCaptcha menunjukkan request dan cara mengirimkan token yang dikembalikan.
Memilih proxy Anda
Jenis alamat yang Anda rotasi sama pentingnya dengan rotasinya sendiri. Alamat data center cepat dan murah per request, tetapi sering kali mendapat skor rendah. Alamat residensial mendapat skor lebih baik dan lebih lambat. Panduan proxy residensial vs datacenter membandingkannya secara mendalam, dan saran di sana berlaku untuk pool yang Anda bangun di sini.
Scraping secara bertanggung jawab
- Baca
robots.txtdan ketentuan situs yang Anda scrape. - Gunakan proxy untuk menyebarkan beban yang sah, bukan untuk melewati pembatasan yang ditetapkan pemilik situs.
- Hanya gunakan layanan proxy yang alamatnya diperoleh dengan persetujuan. Merutekan lalu lintas melalui perangkat milik orang yang tidak menyetujuinya tidak dapat diterima.
- Jaga kredensial agar tidak masuk ke kode dan log.
Langkah selanjutnya
- Proxy residensial vs datacenter
- Scrape tanpa terblokir
- Proxy vs proxyless captcha
- Retry dan penanganan error yang tahan di produksi
Mulai dengan kredit uji coba gratis, tanpa kartu: buat akun dan uji alur PopularCaptcha dengan proxy Anda sendiri. Untuk tarif terbaru, lihat halaman harga.