Skip to content
Advanced / 7 min read

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.

Linux WireGuard Web Scraping Pemantauan SEO

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_MIDDLEWARES menyertakan 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_LIST terisi dan process_request middleware berjalan. Tambahkan print atau log debug.
  • Error 403/429 sering terjadi: Proxy Anda mungkin diblokir atau terlalu lambat. Kurangi CONCURRENT_REQUESTS dan DOWNLOAD_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 show untuk melihat status handshake.
  • Scrapy mengabaikan tunnel WireGuard: Jika Anda mengatur AllowedIPs = 0.0.0.0/0, semua lalu lintas harus dirutekan melalui tunnel. Konfirmasi dengan ip route dan uji dengan curl 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.