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.
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
captchadi HTML). Anda juga dapat mengurangi laju permintaan dan menambahDOWNLOAD_DELAY. - Kesalahan SOCKS5: Scrapy memerlukan pustaka
requestsdengan dukungan SOCKS untuk proxy SOCKS5. Instal denganpip install requests[socks]jika Anda melihatMissing 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.