Skip to content
advanced

Продвинутый веб-скрапинг с ротационными резидентными прокси Dataimpulse и Scrapy на Linux

Создайте готовый к продакшену Scrapy-паук, который ротирует резидентные прокси Dataimpulse, обрабатывает повторные попытки и масштабируется на Linux.

Linux SOCKS5 HTTP(S) Веб-скрейпинг

Обзор

Scrapy — это мощный Python-фреймворк для крупномасштабного веб-скрапинга. В этом руководстве показано, как интегрировать ротационные резидентные прокси Dataimpulse в проект Scrapy на Linux с помощью пользовательского middleware для ротации, логики повторных попыток и поддержки SOCKS5. Мы также рассмотрим масштабирование с несколькими пауками.

Предварительные требования

  • Linux-сервер (рекомендуется Ubuntu 20.04+)
  • Python 3.8+
  • Установленный Scrapy (pip install scrapy)
  • Учётные данные резидентных прокси Dataimpulse (HTTP или SOCKS5)
  • Базовые знания middleware и настроек Scrapy

Архитектура

Мы будем использовать пользовательский downloader middleware для ротации прокси на каждый запрос. Dataimpulse предоставляет ротационную конечную точку (один host:port, который автоматически ротирует IP-адреса) или список конечных точек sticky-сессий. Проверьте точный формат конечной точки в вашей панели управления Dataimpulse.

Шаги

  1. Создайте проект Scrapy.

    pip install scrapy
    scrapy startproject advanced_scraper
    cd advanced_scraper
    
  2. Безопасно сохраните учётные данные прокси. Создайте файл .env (и добавьте его в .gitignore) или экспортируйте переменные окружения:

    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. Создайте пользовательский middleware для прокси. В 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. Включите middleware и настройте параметры 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. Создайте паука, использующего middleware. В 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. Реализуйте ротацию прокси для sticky-сессий (опционально). Если у вас есть несколько конечных точек sticky-сессий, измените middleware, чтобы выбирать случайный прокси из списка:

    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
    

    Разверните ваш проект и запланируйте несколько пауков с разными конечными точками прокси. Используйте очередь заданий для распределения URL-адресов.

  8. Отслеживайте и обрабатывайте ошибки. Логируйте сбои прокси в 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
    

Устранение неполадок

  • SOCKS5 не работает: Убедитесь, что вы используете схему socks5:// в request.meta['proxy'] и что HttpProxyMiddleware в Scrapy отключён. Scrapy полагается на txsocksx или PySocks; при необходимости установите pip install txsocksx.
  • Ошибки аутентификации: Выполните URL-кодирование специальных символов в имени пользователя/пароле.
  • Высокий уровень блокировок: Увеличьте задержку, уменьшите параллелизм и убедитесь, что используете ротационные конечные точки. Рассмотрите использование sticky-сессий Dataimpulse для сайтов, требующих входа.
  • Утечки памяти: Отслеживайте использование памяти Scrapy с помощью scrapy stats и периодически перезапускайте пауков.

Итог

Интеграция ротационных резидентных прокси Dataimpulse со Scrapy на Linux включает в себя пользовательский downloader middleware, правильные настройки повторных попыток и, опционально, SOCKS5 для гибкости протоколов. Масштабируя с помощью scrapyd и отслеживая производительность прокси, вы можете построить надёжный конвейер скрапинга. Всегда уважайте условия обслуживания целевых сайтов и robots.txt.