وب اسکرپینگ پیشرفته با پروکسیهای مسکونی چرخشی Dataimpulse و Scrapy روی لینوکس
یک خزنده Scrapy آمادهی تولید بسازید که پروکسیهای مسکونی Dataimpulse را میچرخاند، تلاشهای مجدد را مدیریت میکند و روی لینوکس مقیاسپذیر است.
مرور کلی
Scrapy یک فریمورک قدرتمند پایتون برای وب اسکرپینگ در مقیاس بزرگ است. این آموزش نشان میدهد چگونه پروکسیهای مسکونی چرخشی Dataimpulse را در یک پروژه Scrapy روی لینوکس ادغام کنید، با میانافزار سفارشی برای چرخش، منطق تلاش مجدد و پشتیبانی SOCKS5. همچنین مقیاسبندی با چندین خزنده را پوشش میدهیم.
پیشنیازها
- سرور لینوکس (Ubuntu 20.04+ توصیه میشود)
- Python 3.8+
- Scrapy نصبشده (
pip install scrapy) - اطلاعات ورود پروکسی مسکونی Dataimpulse (HTTP یا SOCKS5)
- دانش پایه از میانافزار و تنظیمات Scrapy
معماری
ما از یک میانافزار دانلودر سفارشی برای چرخش پروکسیها در هر درخواست استفاده میکنیم. Dataimpulse یک endpoint چرخشی (یک host:port واحد که IPها را بهطور خودکار میچرخاند) یا فهرستی از endpointهای نشست چسبنده ارائه میدهد. برای قالب دقیق endpoint، داشبورد Dataimpulse خود را بررسی کنید.
مراحل
-
یک پروژه Scrapy راهاندازی کنید.
pip install scrapy scrapy startproject advanced_scraper cd advanced_scraper -
اطلاعات ورود پروکسی خود را بهصورت امن ذخیره کنید. یک فایل
.envبسازید (و آن را به.gitignoreاضافه کنید) یا متغیرهای محیطی را export کنید: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" -
یک میانافزار پروکسی سفارشی بسازید. در
advanced_scraper/middlewares.py، اضافه کنید: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('Dataimpulse proxy credentials missing') 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 # For SOCKS5, Scrapy requires the proxy scheme in meta # No additional headers needed for SOCKS5 -
میانافزار را فعال کنید و تنظیمات Scrapy را پیکربندی کنید. در
advanced_scraper/settings.py، بهروزرسانی کنید:DOWNLOADER_MIDDLEWARES = { 'advanced_scraper.middlewares.DataimpulseProxyMiddleware': 543, # Disable default proxy middleware if enabled 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None, } # Retry settings RETRY_ENABLED = True RETRY_TIMES = 5 RETRY_HTTP_CODES = [500, 502, 503, 504, 522, 524, 408, 429] # Concurrency and delay CONCURRENT_REQUESTS = 16 DOWNLOAD_DELAY = 0.5 -
یک خزنده بسازید که از میانافزار استفاده میکند. در
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']}اجرا کنید:
scrapy crawl exampleخروجی باید یک IP Dataimpulse نشان دهد.
-
چرخش پروکسی را برای نشستهای چسبنده پیادهسازی کنید (اختیاری). اگر چندین endpoint نشست چسبنده دارید، میانافزار را تغییر دهید تا یک پروکسی تصادفی از یک فهرست انتخاب کند:
import random class RotatingProxyMiddleware: def __init__(self, proxy_list): self.proxy_list = proxy_list @classmethod def from_crawler(cls, crawler): # Build list from environment or config 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) -
با چندین خزنده با استفاده از scrapyd مقیاسبندی کنید. scrapyd را نصب کنید:
pip install scrapyd scrapyd-clientپروژه خود را مستقر کنید و چندین خزنده با endpointهای پروکسی متفاوت زمانبندی کنید. از یک صف کار برای توزیع URLها استفاده کنید.
-
خطاها را پایش و مدیریت کنید. خرابیهای پروکسی را در میانافزار ثبت کنید:
def process_response(self, request, response, spider): if response.status in [403, 429]: spider.logger.warning(f'Blocked with proxy {request.meta.get("proxy")}') return response
عیبیابی
- SOCKS5 کار نمیکند: مطمئن شوید از طرح
socks5://درrequest.meta['proxy']استفاده میکنید و اینکهHttpProxyMiddlewareدر Scrapy غیرفعال است. Scrapy بهtxsocksxیاPySocksوابسته است؛ در صورت نیازpip install txsocksxرا نصب کنید. - خطاهای احراز هویت: کاراکترهای ویژه در نام کاربری/گذرواژه را URL-encode کنید.
- نرخ بالای مسدودسازی: تأخیر را افزایش دهید، همروندی را کاهش دهید و مطمئن شوید از endpointهای چرخشی استفاده میکنید. برای سایتهایی که نیاز به ورود دارند، استفاده از نشستهای چسبنده Dataimpulse را در نظر بگیرید.
- نشتی حافظه: مصرف حافظه Scrapy را با
scrapy statsپایش کنید و خزندهها را بهصورت دورهای ریاستارت کنید.
خلاصه
ادغام پروکسیهای مسکونی چرخشی Dataimpulse با Scrapy روی لینوکس شامل یک میانافزار دانلودر سفارشی، تنظیمات صحیح تلاش مجدد، و بهصورت اختیاری SOCKS5 برای انعطاف پروتکل است. با مقیاسبندی به کمک scrapyd و پایش عملکرد پروکسی، میتوانید یک خط لوله اسکرپینگ مقاوم بسازید. همیشه به شرایط استفاده و robots.txt وبسایتهای هدف احترام بگذارید.