Rotasi Proxy Scrapy: Cara Merotasi Proxy di Scrapy (dan Kapan Gateway WireGuard Khusus Lebih Baik)
Implementasikan rotasi proxy di Scrapy dengan middleware kustom, tangani blokir dengan baik, dan pelajari kapan gateway WireGuard stabil seperti NordLayer adalah pilihan yang tepat untuk pemantauan SEO dan scraping web.
Ringkasan
Web scraping dalam skala besar sering terkena batas laju, blokir IP, atau pembatasan geografis. Scrapy, kerangka kerja Python yang populer, tidak merotasi proxy secara bawaan. Tutorial ini menunjukkan cara membangun middleware proxy rotasi untuk Scrapy, mengonfigurasi percobaan ulang, dan memutuskan kapan gateway VPN WireGuard khusus (seperti NordLayer) lebih cocok daripada kumpulan proxy rotasi.
Anda akan mempelajari dua pendekatan:
- Proxy rotasi: gunakan banyak IP per sesi untuk mendistribusikan permintaan dan menghindari blokir.
- Gateway WireGuard khusus: gunakan satu IP stabil untuk tugas yang memerlukan konsistensi, seperti pelacakan peringkat, verifikasi iklan, atau mengakses konten spesifik geografis yang menghukum perubahan IP.
NordLayer menyediakan tunnel WireGuard kelas bisnis dengan gateway khusus dan penagihan bulanan tetap. Ini bukan layanan proxy rotasi, tetapi dapat berfungsi sebagai IP keluar yang stabil untuk spider Scrapy Anda saat konsistensi penting.
Prasyarat
- Python 3.7 atau lebih baru
- Pemahaman dasar tentang Scrapy
- Daftar proxy HTTP/HTTPS atau SOCKS5 (untuk pendekatan rotasi)
- Opsional: akun NordLayer dengan gateway WireGuard khusus (untuk pendekatan IP stabil)
- Server Linux atau mesin lokal (perintah ditampilkan untuk Debian/Ubuntu; sesuaikan untuk sistem lain)
Memahami Rotasi Proxy di Scrapy
Scrapy menggunakan middleware downloader untuk memproses permintaan dan respons. Untuk merotasi proxy, Anda mencegat setiap permintaan, menetapkan proxy dari kumpulan, dan secara opsional mencoba ulang dengan proxy baru saat permintaan gagal.
Konsep kunci:
- Kumpulan proxy: daftar URL proxy (dengan kredensial jika diperlukan).
- Strategi rotasi: pemilihan acak, round-robin, atau berbobot berdasarkan kesehatan proxy.
- Logika percobaan ulang: antrekan ulang permintaan yang gagal dengan proxy berbeda.
Kapan harus mempertimbangkan gateway WireGuard khusus:
- Anda memerlukan IP yang konsisten untuk pelacakan peringkat SEO di berbagai lokasi.
- Situs target Anda memblokir perubahan IP yang sering lebih agresif daripada IP statis.
- Anda menginginkan akses terenkripsi yang dikelola tim tanpa memelihara daftar proxy.
Langkah-langkah
1. Instal Scrapy dan buat proyek
Jika belum, instal Scrapy dan buat kerangka proyek baru.
pip install scrapy
scrapy startproject proxy_scraper
cd proxy_scraper
scrapy genspider example example.com
2. Buat middleware proxy rotasi
Buka proxy_scraper/middlewares.py dan tambahkan middleware berikut. Ini memilih proxy acak untuk setiap permintaan dan mencoba ulang pada kode status blokir yang umum.
# proxy_scraper/middlewares.py
import random
from scrapy import signals
from scrapy.exceptions import NotConfigured
class RotatingProxyMiddleware:
def __init__(self, proxy_list):
self.proxy_list = proxy_list
self.current_proxy = None
@classmethod
def from_crawler(cls, crawler):
proxy_list = crawler.settings.getlist('ROTATING_PROXY_LIST')
if not proxy_list:
raise NotConfigured('ROTATING_PROXY_LIST kosong')
return cls(proxy_list)
def process_request(self, request, spider):
self.current_proxy = random.choice(self.proxy_list)
request.meta['proxy'] = self.current_proxy
spider.logger.debug(f'Menggunakan proxy: {self.current_proxy}')
def process_response(self, request, response, spider):
if response.status in [403, 429]:
spider.logger.warning(f'Diblokir dengan proxy {self.current_proxy}. Mencoba ulang...')
new_request = request.copy()
new_request.dont_filter = True
return new_request
return response
3. Konfigurasikan pengaturan untuk mengaktifkan middleware dan tentukan proxy
Edit proxy_scraper/settings.py untuk mengaktifkan middleware dan menyediakan daftar proxy Anda. Ganti contoh proxy dengan milik Anda.
# proxy_scraper/settings.py
DOWNLOADER_MIDDLEWARES = {
'proxy_scraper.middlewares.RotatingProxyMiddleware': 543,
}
ROTATING_PROXY_LIST = [
'http://user:[email protected]:8080',
'http://user:[email protected]:8080',
'socks5://user:[email protected]:1080',
]
# Opsional: pengaturan percobaan ulang
RETRY_TIMES = 5
RETRY_HTTP_CODES = [500, 502, 503, 504, 522, 524, 408, 429, 403]
4. Uji rotasi dengan spider sederhana
Jalankan spider Anda dan perhatikan log DEBUG untuk memastikan proxy yang berbeda digunakan.
scrapy crawl example -L DEBUG
Jika Anda melihat baris seperti Using proxy: http://..., middleware berfungsi. Jika semua permintaan menggunakan proxy yang sama, periksa urutan middleware dan pastikan ROTATING_PROXY_LIST tidak kosong.
5. Tingkatkan keandalan dengan pemeriksaan kesehatan dan backoff
Untuk scraping produksi, tambahkan pelacakan kesehatan proxy dasar. Contoh ini menandai proxy sebagai gagal setelah blokir berulang dan menghapusnya sementara.
# proxy_scraper/middlewares.py (ditingkatkan)
import random
from collections import defaultdict
class RotatingProxyMiddleware:
def __init__(self, proxy_list):
self.proxy_list = proxy_list
self.failure_count = defaultdict(int)
self.max_failures = 3
@classmethod
def from_crawler(cls, crawler):
proxy_list = crawler.settings.getlist('ROTATING_PROXY_LIST')
return cls(proxy_list)
def process_request(self, request, spider):
available = [p for p in self.proxy_list if self.failure_count[p] < self.max_failures]
if not available:
spider.logger.error('Semua proxy habis')
return
proxy = random.choice(available)
request.meta['proxy'] = proxy
def process_response(self, request, response, spider):
proxy = request.meta.get('proxy')
if response.status in [403, 429]:
self.failure_count[proxy] += 1
new_request = request.copy()
new_request.dont_filter = True
return new_request
else:
self.failure_count[proxy] = 0
return response
6. Kapan beralih ke gateway WireGuard khusus
Proxy rotasi sangat baik untuk scraping stateless skala besar. Tetapi beberapa tugas memerlukan IP khusus yang stabil:
- Pelacakan peringkat SEO di mana Anda memerlukan data lokasi yang konsisten
- Mengakses API yang mengikat sesi ke IP
- Scraping berbasis tim di mana beberapa pengguna berbagi IP keluar yang sama
Tunnel WireGuard NordLayer memberi Anda gateway khusus dengan penagihan bulanan tetap. Anda dapat merutekan semua lalu lintas Scrapy melalui tunnel, secara efektif menggunakan satu IP statis.
7. Siapkan WireGuard di Linux dan rutekan Scrapy melaluinya
Instal WireGuard dan konfigurasikan tunnel menggunakan kredensial dari gateway NordLayer Anda.
sudo apt update
sudo apt install wireguard
Buat file konfigurasi di /etc/wireguard/wg0.conf (ganti placeholder dengan nilai NordLayer Anda).
[Interface]
PrivateKey = <your-private-key>
Address = 10.0.0.2/32
DNS = 1.1.1.1
[Peer]
PublicKey = <nordlayer-public-key>
Endpoint = <gateway-ip>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
Aktifkan tunnel:
sudo wg-quick up wg0
Sekarang semua lalu lintas Scrapy (dan lalu lintas lainnya) keluar melalui gateway NordLayer. Verifikasi IP publik Anda telah berubah:
curl ifconfig.me
Jalankan spider Scrapy Anda seperti biasa. Ini akan menggunakan IP gateway yang stabil.
8. Gabungkan pendekatan untuk scraping hibrida
Anda dapat menggunakan keduanya: rutekan sebagian besar permintaan melalui proxy rotasi, tetapi kirim permintaan yang memerlukan IP konsisten melalui tunnel WireGuard. Di Scrapy, Anda dapat mengatur proxy secara kondisional ke None (yang menggunakan rute default sistem, yaitu tunnel WireGuard) untuk permintaan tertentu.
# Contoh: di spider, untuk permintaan pelacakan peringkat, jangan set proxy
# Rute default (WireGuard) akan digunakan.
def start_requests(self):
# Proxy rotasi untuk halaman umum
yield scrapy.Request('https://example.com/general', meta={'proxy': None})
# Untuk pelacakan peringkat, lewati middleware rotasi
yield scrapy.Request('https://example.com/serp', meta={'proxy': 'direct'})
Kemudian modifikasi middleware untuk melewati rotasi ketika proxy == 'direct':
def process_request(self, request, spider):
if request.meta.get('proxy') == 'direct':
return None # gunakan rute default
# ... sisa logika rotasi
Pemecahan Masalah
- Middleware tidak diterapkan: Pastikan
DOWNLOADER_MIDDLEWARESmenyertakan jalur yang benar dan nilai (543) tidak bertentangan dengan middleware lain. Periksa urutan middleware default Scrapy. - Semua permintaan masih menggunakan IP yang sama: Verifikasi bahwa
ROTATING_PROXY_LISTterisi danprocess_requestmiddleware berjalan. Tambahkanprintatau log debug. - Error 403/429 sering terjadi: Proxy Anda mungkin diblokir atau terlalu lambat. Kurangi
CONCURRENT_REQUESTSdanDOWNLOAD_DELAY, atau beralih ke proxy berkualitas lebih tinggi. Pertimbangkan gateway WireGuard khusus jika situs target memblokir IP rotasi secara agresif. - Tunnel WireGuard gagal terhubung: Periksa kembali kunci privat, kunci publik, endpoint, dan aturan firewall (port UDP 51820 secara default). Jalankan
sudo wg showuntuk melihat status handshake. - Scrapy mengabaikan tunnel WireGuard: Jika Anda mengatur
AllowedIPs = 0.0.0.0/0, semua lalu lintas harus dirutekan melalui tunnel. Konfirmasi denganip routedan uji dengancurl ifconfig.me.
Ringkasan
Anda sekarang tahu cara mengimplementasikan rotasi proxy di Scrapy menggunakan middleware kustom, menambahkan logika percobaan ulang, dan memantau kesehatan proxy. Untuk proyek yang memerlukan IP khusus yang stabil—seperti pelacakan peringkat SEO atau akses berbasis tim—gateway WireGuard seperti NordLayer dapat melengkapi atau menggantikan proxy rotasi. Pilih pendekatan yang sesuai dengan tujuan scraping Anda: rotasi untuk skala dan anonimitas, gateway khusus untuk konsistensi dan kontrol.