This article is written in Russian.
Прокси для парсинга: сколько IP нужно и как не получить бан
Парсинг без прокси быстро упирается в лимиты: сайт видит сотни запросов с одного адреса и начинает отдавать капчу, ошибку 429 или блокировку. Прокси распределяют нагрузку между многими IP, но и их нужно правильно рассчитать и настроить. Разберём, как прикинуть количество адресов, выбрать тип и написать устойчивый парсер.
Сколько IP нужно: простой расчёт
Точной формулы нет, потому что каждый сайт ограничивает частоту по-своему. Но прикинуть порядок можно так:
- Определите объём: сколько страниц нужно получить и за какое время. Например, 50 000 страниц за 10 часов — это около 5 000 страниц в час.
- Оцените безопасную частоту на один IP. Начните с консервативного темпа, например один запрос в 5–10 секунд с адреса, и посмотрите, появляются ли ошибки. Это стартовая точка для эксперимента, а не норма для всех сайтов.
- Разделите одно на другое. При одном запросе в 6 секунд один IP даёт около 600 запросов в час. Для 5 000 страниц в час нужно примерно 9 адресов, плюс запас 20–30% на сбои и замедления — итого 11–12.
Если сайт начинает ограничивать раньше, снижайте частоту на IP и добавляйте адреса. Если ошибок нет — можно осторожно ускоряться.
Ротация или статичные IP
Статичные адреса
Пул фиксированных серверных IPv4 или ISP, по которому парсер сам распределяет запросы. Подходит, когда: - сайт не слишком агрессивно защищён; - нужно держать сессию (логин, корзина, пагинация с cookies); - объём трафика большой — оплата за IP выгоднее оплаты за гигабайты.
Для такого сценария подойдут серверные IPv4 прокси: их удобно загрузить списком и перебирать в коде.
Ротируемые резидентские
Адрес меняется на каждый запрос или закрепляется на время. В резидентских прокси Vynx можно выбрать страну прямо в строке подключения, получать новый IP на каждый запрос или закреплять IP на 10 минут, 30 минут или 1 час, а порты из диапазона 10000–10999 дают параллельные выходные IP. Это удобно, когда: - сайт жёстко режет дата-центровые адреса; - нужно очень много разных IP при небольшом объёме данных; - важна проверка выдачи из разных стран.
Учитывайте, что трафик списывается из пакета, поэтому отключайте загрузку картинок, шрифтов и скриптов, если они не нужны.
IPv6
Если целевой сайт поддерживает IPv6, пакеты IPv6-адресов дают много IP за небольшие деньги. Перед покупкой обязательно проверьте поддержку — подробнее в статье про IPv6 прокси.
Таймауты и параллельность
- Всегда задавайте таймаут. Без него один зависший запрос может остановить поток навсегда. Разумная отправная точка — 5–10 секунд на подключение и 20–30 секунд на чтение, дальше подстройте под сайт.
- Ограничьте число потоков на IP. Десять одновременных запросов с одного адреса — это для сайта то же самое, что высокая частота. Лучше много IP с одним-двумя потоками на каждый.
- Добавьте случайную паузу. Запросы ровно раз в секунду выглядят как робот. Небольшой разброс задержки делает нагрузку естественнее.
- Переиспользуйте соединения. Сессия (
requests.Session) экономит время на установке соединений.
Ответы 403, 429 и капча
| Ответ | Что обычно означает | Что делать |
|---|---|---|
| 429 Too Many Requests | превышен лимит частоты | снизить темп, учесть заголовок Retry-After, добавить IP |
| 403 Forbidden | доступ запрещён: IP, заголовки или поведение показались подозрительными | проверить заголовки, сменить тип IP, снизить частоту |
| Капча | сайт сомневается, что перед ним человек | реже запросы, другой тип IP, меньше параллельности |
| 407 | ошибка авторизации на самом прокси | проверить логин и пароль |
Важно отличать ответы сайта от ошибок прокси. Код 407 приходит от прокси-сервера, а 403 и 429 — от сайта. Таймауты и connection refused чаще связаны с подключением к прокси — разбор таких случаев есть в чек-листе «Прокси не работает».
Не пытайтесь «продавить» блокировку повторными запросами без паузы: это только ухудшит репутацию адреса.
Этика и закон
- Читайте
robots.txtи пользовательское соглашение сайта, соблюдайте указанные ограничения. - Не создавайте нагрузку, которая мешает работе сайта.
- Не собирайте персональные данные без законных оснований и учитывайте требования законодательства о защите данных в вашей стране.
- Собирайте только то, что действительно нужно для задачи.
Примеры подключения
curl
# HTTP-прокси
curl -x http://user:pass@203.0.113.10:8000 \
--connect-timeout 10 --max-time 30 \
-A "Mozilla/5.0" https://example.com/
# SOCKS5 с DNS на стороне прокси
curl -x socks5h://user:pass@203.0.113.10:8000 https://example.com/
Python requests с перебором пула и повторами
import random
import time
import requests
PROXIES = [
"http://user:pass@203.0.113.10:8000",
"http://user:pass@203.0.113.11:8000",
"http://user:pass@203.0.113.12:8000",
]
def fetch(url, attempts=3):
for attempt in range(attempts):
proxy = random.choice(PROXIES)
try:
r = requests.get(
url,
proxies={"http": proxy, "https": proxy},
headers={"User-Agent": "Mozilla/5.0"},
timeout=(10, 30),
)
except requests.RequestException:
time.sleep(2 ** attempt)
continue
if r.status_code == 429:
retry_after = r.headers.get("Retry-After", "")
time.sleep(int(retry_after) if retry_after.isdigit() else 2 ** attempt * 5)
continue
return r
return None
resp = fetch("https://example.com/")
print(resp.status_code if resp else "failed")
Список прокси удобно скачать в личном кабинете в формате protocol://login:password@ip:port — тогда строки можно вставить в код без преобразования. Если нужен SOCKS5, установите requests[socks] и используйте схему socks5h://; разница протоколов разобрана в статье HTTP или SOCKS5.
Коротко
- Количество IP = требуемая скорость / безопасная частота на один IP, плюс запас.
- Статичные IPv4 выгодны для больших объёмов и сессий, резидентские с ротацией — для защищённых сайтов.
- Всегда задавайте таймауты и ограничивайте число потоков на один адрес.
- На 429 отвечайте паузой, на 403 и капчу — снижением темпа и сменой типа IP.
- Соблюдайте
robots.txt, правила сайтов и законы о данных.
Для большинства парсинговых задач хорошая отправная точка — пул серверных IPv4 прокси: быстрый канал, фиксированная цена за адрес и список в удобном для кода формате.