Реферальная программа
Разработка

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

Добавьте ротационные прокси в вашего Scrapy-паука двумя строками конфига.

Scrapy - самый популярный Python-фреймворк для скрапинга. SotaProxy интегрируется как стандартный HTTP-прокси через встроенный прокси-middleware Scrapy. Задайте его в settings.py - и каждый запрос вашего паука будет автоматически идти через прокси.

Руководство по настройке

1

Включите прокси-middleware в settings.py

python
# settings.py
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}

HTTP_PROXY = "http://YOUR_USERNAME:YOUR_PASSWORD@proxy.sotaproxy.com:10000"

Добавьте эти две настройки в settings.py вашего Scrapy-проекта. Все запросы паука будут автоматически идти через SotaProxy.

2

Прокси на запрос (опционально)

python
# In your spider
def start_requests(self):
    for url in self.start_urls:
        yield scrapy.Request(
            url,
            meta={'proxy': 'http://YOUR_USERNAME:YOUR_PASSWORD@proxy.sotaproxy.com:10000'},
        )

Задайте прокси на запрос в словаре meta, если для разных URL нужны разные конфигурации прокси.

3

Гео-таргетинг в Scrapy

python
# Target US IPs for all requests
HTTP_PROXY = "http://YOUR_USERNAME_c_US:YOUR_PASSWORD@proxy.sotaproxy.com:10000"

# Or per-request targeting
meta={'proxy': 'http://YOUR_USERNAME_c_DE:YOUR_PASSWORD@proxy.sotaproxy.com:10000'}

Добавьте _c_XX к имени пользователя. Используйте таргетинг на запрос, когда разным URL нужны разные гео.

Автоматизируй через SotaProxy API

Всё описанное выше работает без открытия дашборда. С API-ключом Scrapy может получать свежие данные прокси, покупать новые и продлевать истекающие - прямо из кода.

python
import requests

API = "https://api.sotaproxy.com/api/v1"
H = {"Authorization": "Bearer sk_live_your_key"}

# Every active proxy on your account - no copy-pasting credentials
proxies = requests.get(f"{API}/proxies", headers=H).json()["proxies"]
p = proxies[0]
proxy_url = f"http://{p['login']}:{p['password']}@{p['ip']}:{p['portHttp']}"

# Buy more when you scale (price-check first with POST /quote)
requests.post(
    f"{API}/orders",
    headers={**H, "Idempotency-Key": "my-unique-order-id"},
    json={"product": "ipv4", "countryId": 565, "periodId": "1m", "quantity": 5},
)
Документация API

Учётные данные прокси в проекте Scrapy

Нужная прослойка идёт в комплекте со Scrapy. Направьте request.meta на нашу точку входа, остальное сделает HttpProxyMiddleware:

Ротация резидентки
login:password@proxy.sotaproxy.com:10000
Привязка к стране
login_c_US:password@proxy.sotaproxy.com:10000
Липкая на 15 минут
login_c_US_s_42_ttl_15m:password@proxy.sotaproxy.com:10000
Статический адрес (ISP, датацентр)
login:password@ваш-ip:50100, SOCKS5 на 50101

Логин и пароль кладите прямо в URL прокси. Scrapy сам достаёт их оттуда и превращает в заголовок Proxy-Authorization.

Один адрес на запрос или один на паука

Задайте прокси в meta, и вы управляете ротацией на уровне запроса без единой сторонней прослойки:

Python: ротация внутри start_requests

import itertools, scrapy

BASE = "proxy.sotaproxy.com:10000"

class ShopSpider(scrapy.Spider):
    name = "shop"
    custom_settings = {
        "CONCURRENT_REQUESTS": 32,
        "CONCURRENT_REQUESTS_PER_DOMAIN": 8,
        "DOWNLOAD_TIMEOUT": 30,
        "RETRY_TIMES": 2,
    }

    def start_requests(self):
        sessions = itertools.cycle(range(1, 11))
        for url in self.urls:
            login = f"login_c_US_s_{next(sessions)}_ttl_15m"
            yield scrapy.Request(
                url,
                meta={"proxy": f"http://{login}:password@{BASE}"},
                headers={"Accept-Encoding": "gzip"},
            )
  • Десять номеров сессий дают десять устойчивых адресов, которые переживают редиректы. Уберите часть _s_ целиком, и каждый запрос уйдёт с нового.
  • Поднимайте CONCURRENT_REQUESTS вместо того, чтобы долбить один адрес. Мы одновременные соединения не ограничиваем, ограничивают целевые сайты.
  • DOWNLOAD_TIMEOUT по умолчанию 180 секунд. На домашнем маршруте 30 это более удачный размен между терпением и пропускной способностью.
  • AutoThrottle с прокси уживается хорошо. На незнакомых целях оставьте его включённым, он сам нащупает темп, который не упирается в лимиты.

Детали Scrapy, которые стоят вам данных

Прослойка повторов берёт тот же прокси

Повторный запрос несёт исходный meta, включая адрес, который только что не сработал. Задавайте свежий прокси в повторе или напишите крошечную прослойку, которая это делает.

Куки, переходящие между сессиями

Scrapy по умолчанию держит одну банку с куками. Когда под ней меняются адреса, сайт видит одну сессию, скачущую между странами. Заводите cookiejar на номер сессии.

robots.txt тянется мимо прокси

ROBOTSTXT_OBEY отправляет собственный запрос. Он идёт через ту же прослойку, но ответ кешируется на домен, поэтому заблокированная выкачка молча останавливает обход.

Расчёт на то, что meta переживёт редирект

Он переживает, в этом и смысл, но значит, что цепочка редиректов остаётся на одном адресе. Для входов в аккаунт это то, что нужно, для широкого обхода нет.

Заметки и советы

  • Задайте CONCURRENT_REQUESTS для управления параллельностью. Высокая параллельность с одного эндпоинта прокси - это нормально, ротация на стороне сервера.
  • Включите RETRY_ENABLED = True и RETRY_HTTP_CODES = [403, 429, 503] для автоматических ретраев на блокировках.
  • Для случайных сессий на запрос генерируйте уникальный ID сессии на каждый запрос и добавляйте его к имени пользователя.

FAQ

Ротирует ли Scrapy IP автоматически с SotaProxy?

Да. С ротационными резидентными прокси каждый запрос через один эндпоинт получает другой IP. Middleware для ротации прокси не нужен - ротация на стороне сервера.

Как обрабатывать блокировки 403 в Scrapy?

Добавьте 403 в RETRY_HTTP_CODES. Для сайтов, блокирующих по user-agent, ротируйте user-agent через middleware scrapy-fake-useragent.

Получи учётные данные прокси

Зарегистрируйся, пополни баланс и скопируй эндпоинт в Scrapy. Займёт менее 5 минут.

Начать