Python — главный язык веб-скрапинга: requests, Scrapy и Selenium закрывают почти все задачи сбора данных. Но без прокси любой парсер быстро упирается в бан по IP, капчу и rate-limit. Разберём, как подключить прокси в каждой библиотеке, как организовать ротацию и не получить блокировку — с примерами кода.
Зачем парсеру прокси
- Обойти лимиты по IP. Сайты считают запросы с одного адреса и при превышении выдают 429/капчу.
- Гео-доступ. Цены, выдача и контент часто зависят от страны — нужен IP нужного региона.
- Параллелизм. Пул IP позволяет лить запросы в несколько потоков без бана.
- Стабильность. Если один IP «лёг», ротация переключит на живой.
Какой прокси выбрать под парсинг
Тип IP подбирается под жёсткость антибота на сайте:
| Сайт / задача | Тип прокси | Ротация |
|---|---|---|
| Простые сайты, API, каталоги | Серверные | По таймеру / на ошибку |
| Маркетплейсы, агрегаторы | Резидентские | На запрос или сессию |
| Соцсети, антибот-защита | Мобильные | По запросу |
Подробнее о различиях — в статье «Мобильные, резидентские и серверные прокси». Готовые тарифы под сбор данных — на странице прокси для парсинга.
requests: подключаем прокси
Базовый способ — словарь proxies с протоколами. Формат строки прокси: schema://login:password@ip:port.
import requests
proxies = {
"http": "http://login:password@45.86.1.10:8000",
"https": "http://login:password@45.86.1.10:8000",
}
r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=15)
print(r.json()) # увидите IP прокси, а не свой
Для SOCKS5 поставьте requests[socks] и используйте схему socks5://. О различиях протоколов — в статье «SOCKS5 или HTTP».
Ротация IP из пула
Если у вас список адресов, выбирайте случайный на каждый запрос — так нагрузка размазывается по пулу:
import random, requests
pool = [
"http://user:pass@45.86.1.10:8000",
"http://user:pass@45.86.1.11:8000",
"http://user:pass@45.86.1.12:8000",
]
def get(url):
p = random.choice(pool)
return requests.get(url, proxies={"http": p, "https": p}, timeout=15)
Scrapy: middleware для прокси
В Scrapy прокси задаётся через meta или middleware. Простой вариант — прокинуть адрес в каждый запрос:
import scrapy
class PriceSpider(scrapy.Spider):
name = "prices"
start_urls = ["https://example.com/catalog"]
def start_requests(self):
proxy = "http://user:pass@45.86.1.10:8000"
for url in self.start_urls:
yield scrapy.Request(url, meta={"proxy": proxy})
Для автоматической ротации используют пакеты вроде scrapy-rotating-proxies или собственный middleware, который берёт IP из пула и банит «мёртвые» адреса.
Selenium: прокси в браузере
Для динамических сайтов на JS нужен реальный браузер. Прокси без авторизации задаётся аргументом запуска:
from selenium import webdriver
opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://45.86.1.10:8000")
driver = webdriver.Chrome(options=opts)
driver.get("https://httpbin.org/ip")
Если прокси с логином и паролем, Chrome не принимает их в строке — нужен мини-расширение с авторизацией или антидетект-браузер, который умеет прокси «из коробки».
Как не получить бан: правила
- Ставьте задержки и случайный
User-Agent— не лейте сотни запросов в секунду с одного IP. - Обрабатывайте 429 и капчу — при их появлении меняйте IP и снижайте темп.
- Проверяйте прокси перед работой на скорость и утечки: «Как проверить прокси».
- Уважайте robots.txt и не собирайте персональные данные.
Кейс: парсинг цен в 20 потоков
Команда собирала 500 тыс. товаров в сутки и с одного серверного IP ловила бан через 10–15 минут. Перешли на пул резидентских IP с ротацией на каждый запрос и распределением нагрузки: парсер пошёл в 20 потоков без капчи, сбор всего каталога ускорился с 9 часов до 40 минут. Под кабинеты и авторизованные зоны выделили отдельные статичные мобильные IP.
Частые вопросы
Какие прокси лучше для requests и Scrapy?
Для простых сайтов — серверные, для маркетплейсов и агрегаторов — резидентские с ротацией, для соцсетей — мобильные. Выбрать можно на странице прокси для парсинга.
Как сделать ротацию IP в Python?
Либо случайный выбор из пула на каждый запрос, либо мобильный прокси с автосменой IP по таймеру/ссылке — тогда ротацию не нужно писать в коде.
Почему прокси с паролем не работает в Selenium?
Chrome не принимает логин:пароль в --proxy-server. Нужно расширение с авторизацией или антидетект-браузер.
Где взять прокси для парсинга?
В каталоге PROXYLEET или на странице прокси для парсинга — выбирайте тип под жёсткость антибота.