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.
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
-
Set up a Scrapy project.
pip install scrapy scrapy startproject advanced_scraper cd advanced_scraper -
Store your proxy credentials securely. Create a
.envfile (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" -
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 -
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 -
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 exampleThe output should show a Dataimpulse IP.
-
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) -
Scale with multiple spiders using scrapyd. Install scrapyd:
pip install scrapyd scrapyd-clientDeploy your project and schedule multiple spiders with different proxy endpoints. Use a job queue to distribute URLs.
-
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 inrequest.meta['proxy']and that Scrapy'sHttpProxyMiddlewareis disabled. Scrapy relies ontxsocksxorPySocks; installpip install txsocksxif 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 statsand 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.