Skip to content
advanced

وب اسکرپینگ پیشرفته با پروکسیهای مسکونی چرخشی Dataimpulse و Scrapy روی لینوکس

یک خزنده Scrapy آمادهی تولید بسازید که پروکسیهای مسکونی Dataimpulse را میچرخاند، تلاشهای مجدد را مدیریت میکند و روی لینوکس مقیاسپذیر است.

لینوکس SOCKS5 HTTP(S) وب اسکرپینگ

مرور کلی

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 خود را بررسی کنید.

مراحل

  1. یک پروژه Scrapy راهاندازی کنید.

    pip install scrapy
    scrapy startproject advanced_scraper
    cd advanced_scraper
    
  2. اطلاعات ورود پروکسی خود را بهصورت امن ذخیره کنید. یک فایل .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"
    
  3. یک میانافزار پروکسی سفارشی بسازید. در 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
    
  4. میانافزار را فعال کنید و تنظیمات 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
    
  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 نشان دهد.

  6. چرخش پروکسی را برای نشستهای چسبنده پیادهسازی کنید (اختیاری). اگر چندین 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)
    
  7. با چندین خزنده با استفاده از scrapyd مقیاسبندی کنید. scrapyd را نصب کنید:

    pip install scrapyd scrapyd-client
    

    پروژه خود را مستقر کنید و چندین خزنده با endpointهای پروکسی متفاوت زمانبندی کنید. از یک صف کار برای توزیع URLها استفاده کنید.

  8. خطاها را پایش و مدیریت کنید. خرابیهای پروکسی را در میانافزار ثبت کنید:

    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 وبسایتهای هدف احترام بگذارید.