Web Scraping Tingkat Lanjut dengan Dataimpulse Rotating Residential Proxies dan Scrapy di Linux
Bangun spider Scrapy yang siap produksi yang merotasi proxy residensial Dataimpulse, menangani percobaan ulang, dan melakukan penskalaan di Linux.
Gambaran Umum
Scrapy adalah framework Python yang kuat untuk web scraping skala besar. Tutorial ini menunjukkan cara mengintegrasikan proxy residensial rotating Dataimpulse ke dalam proyek Scrapy di Linux, dengan middleware kustom untuk rotasi, logika percobaan ulang, dan dukungan SOCKS5. Kami juga akan membahas penskalaan dengan beberapa spider.
Prasyarat
- Server Linux (disarankan Ubuntu 20.04+)
- Python 3.8+
- Scrapy terinstal (
pip install scrapy) - Kredensial proxy residensial Dataimpulse (HTTP atau SOCKS5)
- Pengetahuan dasar tentang middleware dan pengaturan Scrapy
Arsitektur
Kami akan menggunakan middleware downloader kustom untuk merotasi proxy per permintaan. Dataimpulse menyediakan endpoint rotating (satu host:port yang merotasi IP secara otomatis) atau daftar endpoint sticky session. Periksa dasbor Dataimpulse Anda untuk format endpoint yang tepat.
Langkah-langkah
-
Siapkan proyek Scrapy.
pip install scrapy scrapy startproject advanced_scraper cd advanced_scraper -
Simpan kredensial proxy Anda dengan aman. Buat file
.env(dan tambahkan ke.gitignore) atau ekspor variabel lingkungan:export DAI_PROXY_HOST="your-proxy-host" export DAI_PROXY_PORT="your-proxy-port" export DAI_PROXY_USER="your-username" export DAI_PROXY_PASS="your-password" -
Buat middleware proxy kustom. Di
advanced_scraper/middlewares.py, tambahkan:import os from scrapy import signals from scrapy.exceptions import NotConfigured class DataimpulseProxyMiddleware: def __init__(self, proxy_url): self.proxy_url = proxy_url @classmethod def from_crawler(cls, crawler): proxy_host = os.getenv('DAI_PROXY_HOST') proxy_port = os.getenv('DAI_PROXY_PORT') proxy_user = os.getenv('DAI_PROXY_USER') proxy_pass = os.getenv('DAI_PROXY_PASS') if not all([proxy_host, proxy_port, proxy_user, proxy_pass]): raise NotConfigured('Kredensial proxy Dataimpulse tidak ada') proxy_url = f'socks5://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}' return cls(proxy_url) def process_request(self, request, spider): request.meta['proxy'] = self.proxy_url # Untuk SOCKS5, Scrapy memerlukan skema proxy di meta # Tidak ada header tambahan yang diperlukan untuk SOCKS5 -
Aktifkan middleware dan konfigurasikan pengaturan Scrapy. Di
advanced_scraper/settings.py, perbarui:DOWNLOADER_MIDDLEWARES = { 'advanced_scraper.middlewares.DataimpulseProxyMiddleware': 543, # Nonaktifkan middleware proxy bawaan jika diaktifkan 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None, } # Pengaturan percobaan ulang RETRY_ENABLED = True RETRY_TIMES = 5 RETRY_HTTP_CODES = [500, 502, 503, 504, 522, 524, 408, 429] # Konkurensi dan jeda CONCURRENT_REQUESTS = 16 DOWNLOAD_DELAY = 0.5 -
Buat spider yang menggunakan middleware. Di
advanced_scraper/spiders/example.py:import scrapy class ExampleSpider(scrapy.Spider): name = 'example' start_urls = ['https://httpbin.org/ip'] def parse(self, response): yield {'ip': response.json()['origin']}Jalankan:
scrapy crawl exampleOutputnya harus menunjukkan IP Dataimpulse.
-
Implementasikan rotasi proxy untuk sticky session (opsional). Jika Anda memiliki beberapa endpoint sticky session, ubah middleware untuk memilih proxy acak dari daftar:
import random class RotatingProxyMiddleware: def __init__(self, proxy_list): self.proxy_list = proxy_list @classmethod def from_crawler(cls, crawler): # Bangun daftar dari environment atau konfigurasi proxy_list = [ f'socks5://{os.getenv("DAI_PROXY_USER")}:{os.getenv("DAI_PROXY_PASS")}@{host}:{port}' for host, port in [('host1', 'port1'), ('host2', 'port2')] ] return cls(proxy_list) def process_request(self, request, spider): request.meta['proxy'] = random.choice(self.proxy_list) -
Skalakan dengan beberapa spider menggunakan scrapyd. Instal scrapyd:
pip install scrapyd scrapyd-clientDeploy proyek Anda dan jadwalkan beberapa spider dengan endpoint proxy yang berbeda. Gunakan antrean pekerjaan untuk mendistribusikan URL.
-
Pantau dan tangani kesalahan. Catat kegagalan proxy di middleware:
def process_response(self, request, response, spider): if response.status in [403, 429]: spider.logger.warning(f'Diblokir dengan proxy {request.meta.get("proxy")}') return response
Pemecahan Masalah
- SOCKS5 tidak berfungsi: Pastikan Anda menggunakan skema
socks5://direquest.meta['proxy']dan middlewareHttpProxyMiddlewaremilik Scrapy dinonaktifkan. Scrapy bergantung padatxsocksxatauPySocks; instalpip install txsocksxjika diperlukan. - Kesalahan autentikasi: Enkode URL karakter khusus di username/password.
- Tingkat ban tinggi: Tingkatkan jeda, kurangi konkurensi, dan pastikan Anda menggunakan endpoint rotating. Pertimbangkan menggunakan sticky session Dataimpulse untuk situs yang memerlukan login.
- Kebocoran memori: Pantau penggunaan memori Scrapy dengan
scrapy statsdan mulai ulang spider secara berkala.
Ringkasan
Mengintegrasikan proxy residensial rotating Dataimpulse dengan Scrapy di Linux melibatkan middleware downloader kustom, pengaturan percobaan ulang yang tepat, dan opsional SOCKS5 untuk fleksibilitas protokol. Dengan melakukan penskalaan menggunakan scrapyd dan memantau performa proxy, Anda dapat membangun pipeline scraping yang tangguh. Selalu patuhi ketentuan layanan dan robots.txt situs web target.