Skip to content
Advanced / 5 min read

Rotasi ProxyScrape Tingkat Lanjut di Scrapy: Middleware Downloader Kustom dengan Retry dan Deteksi Ban

Bangun middleware downloader Scrapy kustom yang merotasi proxy residensial dan datacenter ProxyScrape, menangani retry, dan mendeteksi ban untuk scraping skala besar yang andal.

Linux SOCKS5 HTTP(S) Web Scraping

Ikhtisar

Scrapy adalah framework Python yang kuat untuk scraping web skala besar, tetapi tanpa rotasi proxy Anda akan cepat terkena rate limit dan ban IP. Tutorial ini menunjukkan cara membangun middleware downloader Scrapy kustom yang merotasi proxy residensial dan datacenter ProxyScrape, menangani retry secara otomatis, dan mendeteksi ban untuk pengumpulan data yang andal.

ProxyScrape menyediakan proxy residensial, datacenter, dan mobile dengan dukungan HTTP dan SOCKS5, kumpulan 97M+ IP, dan uptime jangka panjang yang kuat. Anda dapat memilih bayar sesuai penggunaan atau tagihan bulanan tetap tergantung volume scraping Anda.

Prasyarat

  • Python 3.8 atau lebih baru terinstal.
  • Scrapy terinstal (pip install scrapy).
  • Akun ProxyScrape dengan proxy residensial atau datacenter diaktifkan.
  • Endpoint proxy dan kredensial Anda dari dasbor ProxyScrape.
  • Opsional: Daftar endpoint proxy individual jika Anda lebih memilih rotasi statis daripada endpoint berotasi.

Langkah 1: Buat Proyek Scrapy

Buka terminal Anda dan buat proyek Scrapy baru:

pip install scrapy
scrapy startproject proxyscrape_scraper
cd proxyscrape_scraper

Langkah 2: Simpan Kredensial ProxyScrape dengan Aman

Jangan pernah menuliskan kredensial secara hard-code di file sumber Anda. Gunakan variabel lingkungan dan baca di settings.py.

Buat file .env atau ekspor variabel di shell Anda:

export PROXYSCRAPE_USER='your_username'
export PROXYSCRAPE_PASS='your_password'
export PROXYSCRAPE_ENDPOINT='http://proxy.proxyscrape.com:8080'

Lalu di settings.py, tambahkan:

import os

PROXYSCRAPE_USER = os.getenv('PROXYSCRAPE_USER')
PROXYSCRAPE_PASS = os.getenv('PROXYSCRAPE_PASS')
PROXYSCRAPE_ENDPOINT = os.getenv('PROXYSCRAPE_ENDPOINT')

Langkah 3: Bangun Middleware Rotasi

Buat file baru proxyscrape_scraper/middlewares.py dan tentukan middleware yang:

  • Memilih proxy dari daftar atau menggunakan endpoint berotasi Anda.
  • Menyuntikkan kredensial ke URL proxy.
  • Melakukan retry pada kode status HTTP terkait ban.
# proxyscrape_scraper/middlewares.py
import random
import logging
from scrapy import signals
from scrapy.exceptions import NotConfigured

class ProxyScrapeRotationMiddleware:
    def __init__(self, proxy_list, credentials):
        self.proxy_list = proxy_list
        self.credentials = credentials
        self.logger = logging.getLogger(__name__)

    @classmethod
    def from_crawler(cls, crawler):
        proxy_list = crawler.settings.getlist('PROXY_LIST')
        credentials = (
            crawler.settings.get('PROXYSCRAPE_USER'),
            crawler.settings.get('PROXYSCRAPE_PASS'),
        )
        if not proxy_list:
            raise NotConfigured('PROXY_LIST is empty')
        return cls(proxy_list, credentials)

    def process_request(self, request, spider):
        proxy = random.choice(self.proxy_list)
        user, password = self.credentials
        if user and password:
            proxy = proxy.replace('://', f'://{user}:{password}@')
        request.meta['proxy'] = proxy
        self.logger.debug(f'Using proxy: {proxy}')

    def process_response(self, request, response, spider):
        if response.status in [403, 429, 503]:
            self.logger.warning(
                f'Ban detected with status {response.status} on {request.url}'
            )
            request.meta['proxy'] = None
            return request.replace(dont_filter=True)
        return response

Langkah 4: Konfigurasikan Pengaturan untuk Rotasi dan Retry

Di settings.py, tentukan daftar proxy Anda, aktifkan middleware, dan sesuaikan perilaku retry.

# settings.py
PROXY_LIST = [
    'http://proxy1.proxyscrape.com:8080',
    'socks5://proxy2.proxyscrape.com:1080',
    # Add more endpoints from your ProxyScrape dashboard
]

DOWNLOADER_MIDDLEWARES = {
    'proxyscrape_scraper.middlewares.ProxyScrapeRotationMiddleware': 543,
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
}

RETRY_ENABLED = True
RETRY_TIMES = 3
RETRY_HTTP_CODES = [403, 429, 500, 502, 503, 504]

Langkah 5: Opsional — Sesi Sticky dengan ID Sesi

Jika paket ProxyScrape Anda mendukung sesi sticky melalui parameter nama pengguna, Anda dapat menambahkan ID sesi ke nama pengguna. Periksa dasbor ProxyScrape Anda untuk sintaks yang tepat (sering kali seperti username-session-abc123).

# Inside process_request, replace the username logic:
session_id = ''.join(random.choices('abcdef0123456789', k=8))
user = f'{self.credentials[0]}-session-{session_id}'
proxy = proxy.replace('://', f'://{user}:{self.credentials[1]}@')

Gunakan sesi sticky saat Anda perlu mempertahankan IP yang sama di beberapa permintaan ke domain yang sama, seperti selama alur login atau checkout multi-langkah.

Langkah 6: Uji Scraper Berotasi Anda

Buat spider sederhana untuk memverifikasi bahwa permintaan melewati proxy yang berbeda.

# proxyscrape_scraper/spiders/ip_test.py
import scrapy

class IpTestSpider(scrapy.Spider):
    name = 'ip_test'
    start_urls = ['https://httpbin.org/ip']

    def parse(self, response):
        yield {'ip': response.json()['origin']}

Jalankan spider dan simpan hasilnya:

scrapy crawl ip_test -o ips.json

Buka ips.json dan konfirmasi bahwa nilai ip berbeda. Jika Anda melihat IP yang sama berulang kali, periksa PROXY_LIST atau konfigurasi endpoint berotasi Anda.

Memilih Jenis Proxy ProxyScrape yang Tepat untuk Scrapy

Jenis Proxy Paling Cocok Untuk Rotasi Sesi Sticky Dukungan Protokol
Residensial Scraping web umum, data bertarget geo Endpoint berotasi atau daftar Biasanya tersedia melalui ID sesi HTTP, SOCKS5
Datacenter Scraping berkecepatan tinggi untuk situs yang tidak terlindungi Endpoint berotasi atau daftar Sering kali statis HTTP, SOCKS5
Mobile Situs khusus mobile, media sosial, pengujian aplikasi Endpoint berotasi Biasanya tersedia HTTP, SOCKS5

Pemecahan Masalah

  • Kesalahan autentikasi (407 Proxy Authentication Required): Periksa kembali nama pengguna dan kata sandi Anda. Jika menggunakan endpoint berotasi, pastikan kredensial disematkan dengan benar sebagai user:pass@host:port.
  • Timeout koneksi: Coba beralih dari HTTP ke SOCKS5 atau sebaliknya. Beberapa situs memblokir salah satu protokol lebih agresif. Verifikasi juga bahwa firewall Anda mengizinkan lalu lintas keluar pada port proxy.
  • Ban tidak terdeteksi: Jika Anda masih menerima CAPTCHA atau data kosong, perluas deteksi ban Anda untuk mencari indikator CAPTCHA di body respons (misalnya, adanya captcha di HTML). Anda juga dapat mengurangi laju permintaan dan menambah DOWNLOAD_DELAY.
  • Kesalahan SOCKS5: Scrapy memerlukan pustaka requests dengan dukungan SOCKS untuk proxy SOCKS5. Instal dengan pip install requests[socks] jika Anda melihat Missing dependencies for SOCKS support.
  • Sesi sticky tidak berfungsi: Konfirmasi format parameter sesi yang tepat di dasbor ProxyScrape Anda. Beberapa paket menggunakan username-session-{id} sementara yang lain menggunakan kolom kata sandi terpisah.

Ringkasan

Anda sekarang memiliki middleware Scrapy siap produksi yang merotasi proxy ProxyScrape, melakukan retry saat ban, dan secara opsional mempertahankan sesi sticky. Pengaturan ini memungkinkan Anda menskalakan proyek scraping tanpa mengkhawatirkan rate limit atau blokir IP. Untuk hasil terbaik, gabungkan proxy residensial berotasi dengan download delay yang konservatif dan pantau tingkat keberhasilan Anda. Sesuaikan PROXY_LIST dan logika retry Anda saat target scraping berubah.