Skip to content
advanced

Advanced Web Scraping with Dataimpulse Rotating Residential Proxies and Scrapy on Linux

Build a production-ready Scrapy spider that rotates Dataimpulse residential proxies, handles retries, and scales on Linux.

Linux SOCKS5 HTTP(S) Web Scraping

Overview

Scrapy is a powerful Python framework for large-scale web scraping. This tutorial demonstrates how to integrate Dataimpulse rotating residential proxies into a Scrapy project on Linux, with custom middleware for rotation, retry logic, and SOCKS5 support. We'll also cover scaling with multiple spiders.

Prerequisites

  • Linux server (Ubuntu 20.04+ recommended)
  • Python 3.8+
  • Scrapy installed (pip install scrapy)
  • Dataimpulse residential proxy credentials (HTTP or SOCKS5)
  • Basic knowledge of Scrapy middleware and settings

Architecture

We'll use a custom downloader middleware to rotate proxies per request. Dataimpulse provides a rotating endpoint (a single host:port that rotates IPs automatically) or a list of sticky session endpoints. Check your Dataimpulse dashboard for the exact endpoint format.

Steps

  1. Set up a Scrapy project.

    pip install scrapy
    scrapy startproject advanced_scraper
    cd advanced_scraper
    
  2. Store your proxy credentials securely. Create a .env file (and add it to .gitignore) or export environment variables:

    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. Create a custom proxy middleware. In advanced_scraper/middlewares.py, add:

    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. Enable the middleware and configure Scrapy settings. In advanced_scraper/settings.py, update:

    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. Create a spider that uses the middleware. In 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']}
    

    Run it:

    scrapy crawl example
    

    The output should show a Dataimpulse IP.

  6. Implement proxy rotation for sticky sessions (optional). If you have multiple sticky session endpoints, modify the middleware to select a random proxy from a list:

    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. Scale with multiple spiders using scrapyd. Install scrapyd:

    pip install scrapyd scrapyd-client
    

    Deploy your project and schedule multiple spiders with different proxy endpoints. Use a job queue to distribute URLs.

  8. Monitor and handle errors. Log proxy failures in the middleware:

    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
    

Troubleshooting

  • SOCKS5 not working: Ensure you use socks5:// scheme in request.meta['proxy'] and that Scrapy's HttpProxyMiddleware is disabled. Scrapy relies on txsocksx or PySocks; install pip install txsocksx if needed.
  • Authentication errors: URL-encode special characters in username/password.
  • High ban rates: Increase delay, reduce concurrency, and ensure you're using rotating endpoints. Consider using Dataimpulse's sticky sessions for login-required sites.
  • Memory leaks: Monitor Scrapy's memory usage with scrapy stats and restart spiders periodically.

Summary

Integrating Dataimpulse rotating residential proxies with Scrapy on Linux involves a custom downloader middleware, proper retry settings, and optionally SOCKS5 for protocol flexibility. By scaling with scrapyd and monitoring proxy performance, you can build a robust scraping pipeline. Always respect target websites' terms of service and robots.txt.