Как настроить и ротировать прокси в Python Scrapy
Обновлено:
Асинхронный движок Scrapy на базе Twisted включает встроенный компонент HttpProxyMiddleware (с приоритетом 750), который автоматически парсит строки вида http://user:pass@ip:port, назначенные в request.meta['proxy']. Написав компактный пользовательский Downloader Middleware на 10 строк с приоритетом 740, вы сможете автоматически ротировать пауков по пулу безлимитных статических IP-адресов от VinaProxy.
request.meta['proxy'] = 'http://user:pass@ip:port'- 1 IP40 000 ₫
- От 5 IP35 000 ₫
- От 10 IP25 000 ₫
- От 20 IP25 000 ₫
- От 50 IP25 000 ₫
- От 100 IP25 000 ₫
- От 200 IP25 000 ₫
- От 500 IP25 000 ₫
- От 1000 IP22 000 ₫
- От 2000 IP20 000 ₫
- 1 IP40 000 ₫
- От 5 IP35 000 ₫
- От 10 IP25 000 ₫
- От 20 IP25 000 ₫
- От 50 IP25 000 ₫
- От 100 IP25 000 ₫
- От 200 IP25 000 ₫
- От 500 IP25 000 ₫
- От 1000 IP22 000 ₫
- От 2000 IP20 000 ₫
Порядок работы middleware в Scrapy и параметры параллелизма
Так как стандартный HttpProxyMiddleware работает с приоритетом 750 (удаляет user:pass из URL и формирует заголовок Proxy-Authorization), любой пользовательский middleware, устанавливающий request.meta['proxy'], должен запускаться с меньшим числовым значением (например, 740):
| Параметр Scrapy | Рекомендуемое значение | Техническое назначение |
|---|---|---|
request.meta['proxy'] | 'http://user:pass@ip:port' | Направляет запрос через указанный прокси-узел VinaProxy |
| Приоритет Middleware | 740 (до 750) | Гарантирует, что HttpProxyMiddleware успеет сформировать заголовок авторизации |
CONCURRENT_REQUESTS_PER_IP | 2 - 4 | Ограничивает число параллельных соединений на один IP для защиты от HTTP 429 |
AUTOTHROTTLE_ENABLED | True | Динамически адаптирует задержку сканирования под текущее время отклика сервера |
Рекомендации для высоконагруженного парсинга в Scrapy
- Загружайте список прокси VinaProxy в методе
from_crawler()и назначайтеrequest.meta['proxy'] = random.choice(self.proxies)внутриprocess_request() - Включайте
RANDOMIZE_DOWNLOAD_DELAY = Trueсовместно сDOWNLOAD_DELAY = 1.0, чтобы интервалы запросов с каждого IP выглядели естественно - При ошибках и повторных попытках (
429или503) выбирайте другой прокси перед повторной отправкой запроса в очередь
Пошаговая инструкция
- 1
Преобразуйте список прокси в формат http://user:pass@ip:port
Вставьте список прокси VinaProxy в наш Конвертер форматов прокси для получения стандартных URL-строк.
- 2
Создайте ProxyPoolMiddleware в файле middlewares.py
Определите метод
process_request(self, request, spider), присваивающийrequest.meta['proxy'] = random.choice(self.proxies). - 3
Зарегистрируйте middleware с приоритетом 740 в settings.py
Добавьте строку
'myproject.middlewares.ProxyPoolMiddleware': 740вDOWNLOADER_MIDDLEWARESи установитеCONCURRENT_REQUESTS_PER_IP = 2. - 4
Проверьте работу через scrapy shell или команду запуска
Отправьте проверочный запрос к
https://vinaproxy.com/api/my-ip, чтобы подтвердить корректную ротацию и авторизацию.
Часто задаваемые вопросы
Почему пользовательский middleware прокси в Scrapy не работает с приоритетом 800?
Встроенный HttpProxyMiddleware запускается с приоритетом 750. Если ваш middleware запускается с приоритетом 800 (после 750), данные user:pass не конвертируются в заголовок Proxy-Authorization. Всегда задавайте приоритет ниже 750 (например, 740).
Поддерживает ли Scrapy постоянные keep-alive соединения с каждым прокси?
Да. Пул соединений Twisted сохраняет активные TCP keep-alive соединения для каждого прокси-узла, минимизируя накладные расходы.
Тарифицируется ли трафик прокси VinaProxy при сканировании миллионов страниц?
Нет. Все тарифные планы VinaProxy на приватные IPv4 и статические ISP включают полностью безлимитный трафик.
Масштабируйте скраперы Scrapy с пулом безлимитных статических IP
Приватные IPv4 и статические ISP-прокси оптом в 7 странах с моментальной выдачей.
Купить прокси для Scrapy