Продвинутый веб-скрапинг с ротационными резидентными прокси Dataimpulse и Scrapy на Linux
Создайте готовый к продакшену Scrapy-паук, который ротирует резидентные прокси Dataimpulse, обрабатывает повторные попытки и масштабируется на Linux.
Обзор
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.
Шаги
-
Создайте проект Scrapy.
pip install scrapy scrapy startproject advanced_scraper cd advanced_scraper -
Безопасно сохраните учётные данные прокси. Создайте файл
.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" -
Создайте пользовательский 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 -
Включите 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 -
Создайте паука, использующего 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.
-
Реализуйте ротацию прокси для 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) -
Масштабируйте с помощью нескольких пауков, используя scrapyd. Установите scrapyd:
pip install scrapyd scrapyd-clientРазверните ваш проект и запланируйте несколько пауков с разными конечными точками прокси. Используйте очередь заданий для распределения URL-адресов.
-
Отслеживайте и обрабатывайте ошибки. Логируйте сбои прокси в 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.