Перейти к содержимому
Гайды 4 мин чтения 1416 просмотров

Настройка прокси в Scrapy

Настройка прокси и ротация в Scrapy для эффективного парсинга. Используйте middleware и GProxy для анонимности и обхода блокировок.

Python Парсинг
Настройка прокси в Scrapy

Использование прокси в Scrapy позволяет избежать блокировок по IP, географических ограничений и повысить анонимность при парсинге веб-сайтов. Данная статья посвящена настройке прокси в Scrapy с использованием middleware и реализации ротации прокси.

Настройка прокси в Scrapy с использованием Middleware

Scrapy middleware — это мощный механизм для обработки запросов и ответов. Для использования прокси мы создадим middleware, который будет добавлять прокси к каждому запросу.

Создание Middleware для прокси

  1. Создайте файл middlewares.py в директории вашего проекта Scrapy. Если он уже существует, просто добавьте новый класс.

  2. В middlewares.py определите класс, который будет обрабатывать запросы.

import random

class ProxyMiddleware:

    def __init__(self, proxy_list):
        self.proxy_list = proxy_list

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            proxy_list=crawler.settings.getlist('PROXY_LIST')
        )

    def process_request(self, request, spider):
        proxy = random.choice(self.proxy_list)
        request.meta['proxy'] = proxy
        print(f"Using proxy: {proxy}") # Optional logging

    def process_response(self, request, response, spider):
         # Optional: Handle response codes and retry failed requests
        if response.status >= 400:
            print(f"Proxy {request.meta['proxy']} failed with status {response.status}. Retrying...")
            return self._retry_request(request, spider)
        return response

    def process_exception(self, request, exception, spider):
        # Optional: Handle exceptions and retry failed requests
        print(f"Proxy {request.meta['proxy']} caused exception {exception}. Retrying...")
        return self._retry_request(request, spider)

    def _retry_request(self, request, spider):
        retries = request.meta.get('retry_times', 0) + 1
        if retries <= spider.settings.get('RETRY_TIMES', 2):
            request.meta['retry_times'] = retries
            return request.copy()
        else:
            print(f"Max retries reached for {request.url} with proxy {request.meta['proxy']}")
            return None

В этом коде:

  • __init__: Инициализирует middleware, получая список прокси.
  • from_crawler: Получает список прокси из настроек Scrapy (settings.py).
  • process_request: Выбирает случайный прокси из списка и добавляет его в метаданные запроса (request.meta['proxy']).
  • process_response: Проверяет статус ответа и, если он указывает на ошибку (>= 400), пытается повторить запрос.
  • process_exception: Обрабатывает исключения, возникающие при использовании прокси, и пытается повторить запрос.
  • _retry_request: Функция, которая повторяет запрос.

Активация Middleware

  1. В файле settings.py вашего проекта Scrapy добавьте созданный middleware в DOWNLOADER_MIDDLEWARES. Укажите приоритет middleware. Чем меньше число, тем выше приоритет.
DOWNLOADER_MIDDLEWARES = {
    'your_project_name.middlewares.ProxyMiddleware': 750,
}

Замените your_project_name на имя вашего проекта Scrapy.

  1. Также в settings.py определите список прокси:
PROXY_LIST = [
    'http://user1:pass1@ip1:port1',
    'http://user2:pass2@ip2:port2',
    'http://user3:pass3@ip3:port3',
    # ... другие прокси
]

Убедитесь, что прокси указаны в правильном формате (с аутентификацией, если требуется).

  1. Настройте параметры повторных попыток (опционально):
RETRY_TIMES = 3 # Number of times to retry failed requests

Пример использования

После настройки middleware прокси будут автоматически использоваться для всех запросов, выполняемых вашим spider'ом. Вам не нужно вносить какие-либо изменения в код spider'а.

Ротация прокси

Ротация прокси — это процесс автоматической смены прокси-серверов после определенного количества запросов или при возникновении ошибок. Это помогает избежать блокировок и повышает стабильность парсинга. В примере выше уже реализована базовая ротация, выбирая случайный прокси из списка. Для более продвинутой ротации можно использовать следующие подходы:

Ведение списка "живых" прокси

Можно реализовать механизм проверки прокси на работоспособность и исключать нерабочие прокси из списка.

  1. Проверка прокси: Создайте функцию, которая отправляет запрос через прокси на проверочный сайт (например, httpbin.org/ip) и проверяет, что IP-адрес ответа соответствует IP-адресу прокси.

  2. Обновление списка прокси: Периодически запускайте функцию проверки и обновляйте список PROXY_LIST в settings.py. Можно использовать Scrapy scheduler для этого.

  3. Обработка ошибок: В middleware (process_response и process_exception) отслеживайте ошибки, связанные с прокси, и временно исключайте "проблемные" прокси из списка, чтобы избежать повторных попыток использования нерабочих прокси.

Использование внешних сервисов ротации прокси

Существуют платные сервисы, предоставляющие API для получения списка рабочих прокси и автоматической ротации. Использование таких сервисов упрощает настройку и обслуживание прокси, но требует финансовых затрат.

Пример использования сервиса с API (псевдокод):

# В settings.py:
PROXY_API_URL = "https://api.example.com/get_proxy"

# В middlewares.py:
import requests

class ProxyMiddleware:
    def process_request(self, request, spider):
        try:
            response = requests.get(spider.settings['PROXY_API_URL'])
            response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)
            proxy = response.text.strip() # Assuming the API returns a single proxy
            request.meta['proxy'] = proxy
            print(f"Using proxy from API: {proxy}")
        except requests.exceptions.RequestException as e:
            print(f"Error fetching proxy from API: {e}")
            # Handle the error (e.g., use a default proxy or skip this request)
            # It's crucial to handle API errors gracefully!
            return None

Важно: Обработка ошибок при запросах к API прокси очень важна. Необходимо предусмотреть ситуации, когда API недоступен или возвращает ошибки.

Сравнение подходов к ротации прокси

Характеристика Собственный список прокси Внешний сервис ротации
Стоимость Низкая (стоимость прокси) Высокая (плата за сервис)
Сложность настройки Высокая Низкая
Обслуживание Высокое Низкое
Гибкость Высокая Ограниченная
Надежность Зависит от качества прокси Высокая

Обработка ошибок и повторные попытки

Важно правильно обрабатывать ошибки, возникающие при использовании прокси, такие как таймауты, ошибки соединения и HTTP-ошибки. В примере кода middleware уже реализованы базовые механизмы повторных попыток (process_response, process_exception и _retry_request). Рекомендуется настроить параметры повторных попыток (RETRY_TIMES) в settings.py и логировать ошибки для анализа и отладки.

Заключение

Настройка прокси в Scrapy с использованием middleware и ротации — важный шаг для успешного парсинга веб-сайтов и обхода ограничений. Правильная настройка и обработка ошибок позволяют повысить надежность и стабильность работы spider'а. Выбор подхода к ротации прокси зависит от ваших потребностей и бюджета. Собственный список прокси требует больше усилий по обслуживанию, но обеспечивает большую гибкость и контроль. Внешние сервисы ротации прокси упрощают настройку и обслуживание, но требуют финансовых затрат.

Полезные ссылки

Обновлено: 19.05.2026
Назад к категории

Читайте также

Гайды 2 мин

Прокси для Nike SNKRS: покупка дропов и мультизаявки

Используйте резидентные или мобильные прокси для Nike SNKRS: мультизаявки, обход лимитов на IP и покупка дропов без банов. Какой тип выбрать и как настроить.

Гайды 2 мин

Как настроить прокси на iPhone (Wi-Fi и SOCKS5)

Настройте прокси на iPhone через штатные настройки Wi-Fi (HTTP/HTTPS) или приложение вроде Shadowrocket для SOCKS5 и сотовой сети. Пошаговая настройка iOS и её ограничения.

Гайды 3 мин

Прокси для Tinder: несколько аккаунтов и защита от банов

Используйте мобильные или резидентные прокси для Tinder, чтобы вести несколько профилей и избегать теневых банов по IP. Почему мобильные лучшие, как настроить и почему прокси не сменит город.

Гайды 2 мин

Прокси для StockX: мониторинг цен и ведение аккаунтов

Используйте резидентные, ISP или мобильные прокси для StockX, чтобы мониторить цены, вести несколько аккаунтов и покупать дропы без банов. Какой тип выбрать и как настроить.

Гайды 3 мин

Прокси для OpenAI API: доступ, лимиты и настройка

Пустите OpenAI API через резидентный или ISP-прокси для доступа из поддерживаемых регионов, обхода лимитов 429 и изоляции аккаунтов. Какой прокси выбрать и примеры настройки на Python.

Гайды 1 мин

Настройка прокси в Cypress для E2E-тестирования

Настройка прокси в Cypress: HTTP_PROXY переменные, cy-proxy-middleware и тестирование гео-зависимого контента.

Попробуйте наши прокси

20,000+ прокси в 100+ странах мира

support_agent
GProxy Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.