Настройка прокси в Scrapy
Добавьте ротационные прокси в вашего Scrapy-паука двумя строками конфига.
Scrapy - самый популярный Python-фреймворк для скрапинга. SotaProxy интегрируется как стандартный HTTP-прокси через встроенный прокси-middleware Scrapy. Задайте его в settings.py - и каждый запрос вашего паука будет автоматически идти через прокси.
Руководство по настройке
Включите прокси-middleware в settings.py
# settings.py
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}
HTTP_PROXY = "http://YOUR_USERNAME:YOUR_PASSWORD@proxy.sotaproxy.com:10000"Добавьте эти две настройки в settings.py вашего Scrapy-проекта. Все запросы паука будут автоматически идти через SotaProxy.
Прокси на запрос (опционально)
# 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 нужны разные конфигурации прокси.
Гео-таргетинг в Scrapy
# 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 может получать свежие данные прокси, покупать новые и продлевать истекающие - прямо из кода.
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},
)Учётные данные прокси в проекте Scrapy
Нужная прослойка идёт в комплекте со Scrapy. Направьте request.meta на нашу точку входа, остальное сделает HttpProxyMiddleware:
Логин и пароль кладите прямо в 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 минут.
Начать