Когда вы работаете с прокси для парсинга маркетплейсов, автоматизации соцсетей или сбора данных, самая частая проблема — это зависшие запросы и потерянные данные. Прокси-сервер может не ответить вовремя, соединение может оборваться, а ваш скрипт — зависнуть на несколько минут. В результате вы теряете время, данные и деньги.
В этом руководстве я покажу, как правильно настроить timeout (таймауты) и retry logic (логику повторных попыток) для работы с прокси. Вы узнаете, какие значения таймаутов использовать для разных задач, как автоматически переподключаться при ошибках и как не потерять ни одного запроса. Статья подойдет как для тех, кто пишет код на Python, так и для тех, кто использует готовые инструменты парсинга.
Почему timeout критически важен при работе с прокси
Представьте ситуацию: вы запустили парсер цен с Wildberries на 10 000 товаров. Скрипт работает через прокси, чтобы не получить бан. Всё идёт хорошо, но на 523-м запросе прокси-сервер перестаёт отвечать — возможно, перегружен или временно недоступен. Без настроенного таймаута ваш скрипт будет ждать ответа бесконечно долго (или пока не истечет системный таймаут в 2-5 минут). В итоге парсинг останавливается, вы теряете время, а к моменту, когда заметите проблему, может пройти несколько часов.
Timeout (таймаут) — это максимальное время ожидания ответа от сервера. Если сервер не ответил за это время, запрос прерывается, и вы можете либо повторить попытку через другой прокси, либо записать ошибку в лог. Это особенно важно при работе с прокси, потому что:
- Прокси-серверы могут быть нестабильными — особенно публичные или дешёвые. Даже качественные резидентные прокси иногда теряют соединение из-за того, что реальный пользователь отключился от интернета.
- Целевой сайт может блокировать IP — если прокси попал в бан, он не ответит вообще или будет отвечать очень долго (отдавая капчу или редирект).
- Сетевые задержки непредсказуемы — особенно при использовании прокси из других стран. Запрос может идти через несколько промежуточных узлов.
- Массовые операции требуют стабильности — если вы парсите 100 000 страниц или ведёте 50 аккаунтов Instagram, даже 1% зависших запросов = 1000 потерянных операций.
Без правильно настроенных таймаутов ваш скрипт будет тратить время на ожидание недоступных прокси вместо того, чтобы переключаться на рабочие. Это напрямую влияет на скорость работы и стабильность результата.
Типы таймаутов: connect, read и total timeout
Существует три основных типа таймаутов, которые нужно понимать и настраивать отдельно. Многие начинающие разработчики и пользователи парсеров настраивают только один общий таймаут, что приводит к проблемам.
1. Connect timeout (таймаут подключения)
Это время, которое выделяется на установление соединения с прокси-сервером. Если за это время соединение не установлено — запрос прерывается. Connect timeout отвечает за начальное рукопожатие (TCP handshake) между вашим клиентом и прокси.
Когда срабатывает: Прокси-сервер недоступен, перегружен или IP заблокирован фаерволом.
Рекомендуемые значения:
- Для быстрых прокси дата-центров: 3-5 секунд
- Для резидентных прокси: 5-10 секунд
- Для мобильных прокси: 10-15 секунд (мобильный интернет медленнее)
2. Read timeout (таймаут чтения)
Это время ожидания ответа от целевого сервера после того, как соединение с прокси уже установлено. Если сервер не начал отдавать данные за это время — запрос прерывается. Read timeout защищает от ситуаций, когда сервер принял запрос, но «завис» и не отдаёт ответ.
Когда срабатывает: Целевой сайт медленно обрабатывает запрос, перегружен или намеренно тормозит подозрительные запросы.
Рекомендуемые значения:
- Для парсинга простых страниц (HTML): 10-15 секунд
- Для парсинга с JavaScript-рендерингом: 30-60 секунд
- Для API-запросов: 5-10 секунд
- Для скачивания больших файлов: 120+ секунд
3. Total timeout (общий таймаут)
Это максимальное время на выполнение всего запроса от начала до конца, включая подключение, отправку запроса, получение и чтение ответа. Total timeout — это «аварийный выключатель», который гарантирует, что ни один запрос не будет выполняться дольше заданного времени.
Когда использовать: Когда вам важно, чтобы каждый запрос укладывался в строгие временные рамки (например, при парсинге в реальном времени для арбитража).
Формула: Total timeout = Connect timeout + Read timeout + запас 20-30%
Важно: Не все библиотеки и инструменты поддерживают раздельную настройку connect и read таймаутов. Например, библиотека requests в Python позволяет указать оба значения кортежем: timeout=(5, 15), где 5 — connect, 15 — read.
Оптимальные значения таймаутов для разных задач
Правильные значения таймаутов зависят от вашей задачи, типа прокси и целевого сайта. Слишком короткие таймауты приведут к большому количеству ложных ошибок (прокси работает, но вы его отбрасываете). Слишком длинные — к потере времени на ожидание мёртвых прокси.
| Задача | Connect timeout | Read timeout | Комментарий |
|---|---|---|---|
| Парсинг Wildberries, Ozon | 5-7 сек | 15-20 сек | Маркетплейсы могут медленно отдавать страницы с большим количеством товаров |
| Парсинг Авито, Яндекс.Маркет | 5-7 сек | 10-15 сек | Обычно быстрые сайты, но могут блокировать подозрительные IP |
| Автоматизация Instagram, TikTok | 7-10 сек | 20-30 сек | Используйте мобильные прокси — они медленнее, но стабильнее |
| Работа с Facebook Ads API | 5 сек | 10-15 сек | API обычно быстрые, но могут тормозить при rate limiting |
| Парсинг через Selenium/Puppeteer | 10 сек | 60-120 сек | JavaScript-рендеринг требует времени, особенно на медленных прокси |
| Массовая проверка прокси | 3-5 сек | 5-7 сек | Быстрая проверка доступности, медленные прокси отбрасываются |
Совет: Начните с консервативных (более длинных) таймаутов и постепенно уменьшайте их, анализируя логи ошибок. Если видите много timeout-ошибок на работающих прокси — увеличьте значения. Если скрипт тормозит из-за медленных прокси — уменьшите.
Retry logic: как правильно настроить повторные попытки
Timeout решает проблему зависших запросов, но не решает проблему потери данных. Если прокси не ответил — вы просто получите ошибку и потеряете этот запрос. Именно поэтому критически важна retry logic (логика повторных попыток).
Retry logic — это автоматическое повторение запроса при ошибке. Основные принципы правильной настройки:
1. Определите, какие ошибки требуют повтора
Не все ошибки нужно повторять. Например:
- Повторять нужно: Timeout, Connection refused, Proxy error, 502/503/504 (временные ошибки сервера), Rate limiting (429)
- Повторять НЕ нужно: 404 (страница не найдена), 403 (доступ запрещён навсегда), 401 (неверная авторизация), ошибки валидации данных
2. Настройте количество попыток
Оптимальное количество retry зависит от критичности данных:
- Для некритичных задач (парсинг для аналитики): 2-3 попытки
- Для важных задач (мониторинг цен конкурентов): 3-5 попыток
- Для критичных задач (работа с рекламными кабинетами): 5-10 попыток
3. Используйте exponential backoff (экспоненциальную задержку)
Не повторяйте запрос мгновенно — это может усугубить проблему (например, если сервер перегружен). Используйте увеличивающуюся задержку между попытками:
- 1-я попытка: сразу
- 2-я попытка: через 1-2 секунды
- 3-я попытка: через 4-5 секунд
- 4-я попытка: через 10-15 секунд
Формула: задержка = базовая_задержка * (2 ^ номер_попытки). Например: 1 сек, 2 сек, 4 сек, 8 сек, 16 сек.
4. Ротация прокси при повторных попытках
Самое важное правило: при повторной попытке используйте ДРУГОЙ прокси из вашего пула. Если один прокси не смог выполнить запрос, вероятность того, что он сработает при повторе — низкая. А вот другой прокси с большой вероятностью справится.
Это особенно важно при работе с резидентными прокси, где у вас есть пул из сотен или тысяч IP-адресов. При каждом retry берите новый случайный IP из пула.
Примеры настройки timeout и retry на Python
Рассмотрим практические примеры реализации timeout и retry logic на Python с использованием популярных библиотек.
Пример 1: Базовая настройка с requests
Библиотека requests — самая популярная для HTTP-запросов в Python. Вот как настроить timeout и простой retry:
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
# Настройка retry logic
retry_strategy = Retry(
total=5, # Максимум 5 попыток
backoff_factor=1, # Задержка: 1, 2, 4, 8, 16 секунд
status_forcelist=[429, 500, 502, 503, 504], # Коды ошибок для retry
allowed_methods=["HEAD", "GET", "POST", "PUT", "DELETE"]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session = requests.Session()
session.mount("http://", adapter)
session.mount("https://", adapter)
# Настройка прокси
proxies = {
'http': 'http://username:password@proxy.example.com:8080',
'https': 'http://username:password@proxy.example.com:8080'
}
# Выполнение запроса с timeout
try:
response = session.get(
'https://www.wildberries.ru/catalog/electronics',
proxies=proxies,
timeout=(5, 15) # connect timeout 5 сек, read timeout 15 сек
)
print(f"Успех! Статус: {response.status_code}")
print(f"Размер ответа: {len(response.content)} байт")
except requests.exceptions.Timeout:
print("Ошибка: превышен таймаут")
except requests.exceptions.ProxyError:
print("Ошибка: проблема с прокси")
except requests.exceptions.RequestException as e:
print(f"Ошибка запроса: {e}")
В этом примере мы настроили автоматический retry на уровне сессии. При ошибках 429, 500, 502, 503, 504 библиотека автоматически повторит запрос до 5 раз с экспоненциальной задержкой.
Пример 2: Ротация прокси при retry
Более продвинутый пример с ротацией прокси из пула при каждой попытке:
import requests
import random
import time
# Пул прокси (замените на ваши реальные прокси)
PROXY_POOL = [
'http://user:pass@proxy1.example.com:8080',
'http://user:pass@proxy2.example.com:8080',
'http://user:pass@proxy3.example.com:8080',
'http://user:pass@proxy4.example.com:8080',
]
def make_request_with_retry(url, max_retries=5, base_delay=1):
"""
Выполняет запрос с retry и ротацией прокси
"""
for attempt in range(max_retries):
# Выбираем случайный прокси из пула
proxy = random.choice(PROXY_POOL)
proxies = {'http': proxy, 'https': proxy}
try:
response = requests.get(
url,
proxies=proxies,
timeout=(5, 15),
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
)
# Проверяем статус код
if response.status_code == 200:
return response
elif response.status_code in [429, 500, 502, 503, 504]:
# Временная ошибка - повторяем
print(f"Попытка {attempt + 1}: код {response.status_code}, повтор...")
else:
# Постоянная ошибка - прекращаем
print(f"Ошибка {response.status_code}, прекращаем попытки")
return None
except (requests.exceptions.Timeout,
requests.exceptions.ProxyError,
requests.exceptions.ConnectionError) as e:
print(f"Попытка {attempt + 1}: ошибка {type(e).__name__}, повтор...")
# Если это не последняя попытка - ждём с экспоненциальной задержкой
if attempt < max_retries - 1:
delay = base_delay * (2 ** attempt)
print(f"Ожидание {delay} секунд перед следующей попыткой...")
time.sleep(delay)
print("Исчерпаны все попытки")
return None
# Использование
result = make_request_with_retry('https://www.ozon.ru/category/smartfony-15502/')
if result:
print(f"Успех! Получено {len(result.content)} байт данных")
else:
print("Не удалось выполнить запрос")
Этот код при каждой попытке выбирает новый случайный прокси из пула, что значительно повышает вероятность успешного выполнения запроса.
Пример 3: Использование библиотеки tenacity
Для более гибкого управления retry logic можно использовать специализированную библиотеку tenacity:
from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
import requests
@retry(
stop=stop_after_attempt(5), # Максимум 5 попыток
wait=wait_exponential(multiplier=1, min=1, max=30), # Экспоненциальная задержка 1-30 сек
retry=retry_if_exception_type((requests.exceptions.Timeout,
requests.exceptions.ProxyError,
requests.exceptions.ConnectionError))
)
def fetch_with_proxy(url, proxy):
"""
Функция с автоматическим retry через декоратор
"""
proxies = {'http': proxy, 'https': proxy}
response = requests.get(url, proxies=proxies, timeout=(5, 15))
response.raise_for_status() # Вызовет исключение при ошибке HTTP
return response
# Использование
try:
result = fetch_with_proxy(
'https://www.avito.ru/rossiya/telefony',
'http://user:pass@proxy.example.com:8080'
)
print(f"Успех! Статус: {result.status_code}")
except Exception as e:
print(f"Не удалось выполнить запрос после всех попыток: {e}")
Библиотека tenacity предоставляет очень гибкие возможности настройки retry через декораторы. Установка: pip install tenacity
Готовые решения для парсинга без кода
Если вы не программист или хотите сэкономить время на разработке, существуют готовые инструменты парсинга с встроенной поддержкой timeout и retry logic. Вам не нужно писать код — достаточно настроить параметры в графическом интерфейсе.
Octoparse
Популярный визуальный парсер для Windows и Mac. Настройка timeout и retry:
- Откройте настройки задачи → Advanced Options
- Page Load Timeout: установите 20-30 секунд
- Ajax Timeout: 10-15 секунд для динамического контента
- Retry Times: 3-5 попыток при ошибке
- В настройках прокси можно загрузить список и включить автоматическую ротацию
ParseHub
Облачный парсер с бесплатным тарифом. Настройка:
- Settings → Advanced → Page Load Delay: 5-10 секунд
- Request Timeout: 30 секунд
- Retry Failed Requests: включить, 3 попытки
- Поддерживает прокси через настройки проекта
Apify
Платформа для автоматизации веб-задач с готовыми акторами (скриптами) для парсинга популярных сайтов. Многие акторы для парсинга маркетплейсов (Wildberries, Ozon) уже имеют встроенную оптимальную настройку timeout и retry. Вам нужно только:
- Выбрать готовый актор для нужного сайта
- Указать прокси (поддерживает интеграцию с провайдерами прокси)
- Запустить задачу — всё остальное настроено автоматически
Антидетект-браузеры для автоматизации
Если вы работаете с соцсетями или рекламными платформами через Dolphin Anty, AdsPower или Multilogin, timeout настраивается в профиле браузера:
- Dolphin Anty: Настройки профиля → Прокси → Timeout: 10-15 секунд
- AdsPower: Proxy Settings → Connection Timeout: 10 секунд, Read Timeout: 20 секунд
- Multilogin: Browser Profile → Network → Proxy Timeout: 15 секунд
При автоматизации через эти браузеры (например, скриптами Selenium) timeout прокси наследуется из настроек профиля, но вы также можете установить дополнительные таймауты на уровне скрипта.
Частые ошибки при настройке таймаутов
Даже опытные разработчики и специалисты по парсингу допускают типичные ошибки при работе с timeout и retry. Вот самые распространённые:
Ошибка 1: Отсутствие таймаута вообще
Многие библиотеки по умолчанию не устанавливают timeout или ставят очень большое значение (несколько минут). Если вы не указали timeout явно — ваш скрипт может зависнуть на долгое время.
Решение: Всегда явно указывайте timeout в каждом запросе. Лучше получить ошибку через 15 секунд, чем ждать 5 минут.
Ошибка 2: Одинаковый прокси при всех retry
Если прокси не ответил с первого раза, вероятность успеха при повторе через тот же прокси очень низкая. Многие забывают ротировать прокси между попытками.
Решение: При каждом retry используйте новый прокси из пула. Это критически важно для высокого success rate.
Ошибка 3: Слишком короткие таймауты для медленных прокси
Мобильные и некоторые резидентные прокси могут быть медленнее дата-центров. Если вы установите timeout 5 секунд для мобильного прокси — получите много ложных ошибок на вполне рабочих IP.
Решение: Учитывайте тип прокси. Для мобильных используйте timeout минимум 10-15 секунд.
Ошибка 4: Бесконечные retry без ограничения
Некоторые реализуют retry в цикле while True без ограничения количества попыток. Если проблема на стороне целевого сайта (например, он полностью упал) — скрипт будет пытаться бесконечно.
Решение: Всегда ограничивайте количество retry (3-10 попыток максимум) и логируйте неудачные запросы для последующего анализа.
Ошибка 5: Игнорирование типа ошибки
Повторять нужно не все ошибки. Например, если вы получили 404 (страница не найдена) — повтор бессмысленен, страницы просто нет. А вот 503 (сервис временно недоступен) — имеет смысл повторить через несколько секунд.
Решение: Анализируйте тип ошибки и повторяйте только временные проблемы (timeout, connection error, 429, 500, 502, 503, 504).
Ошибка 6: Отсутствие логирования
Без логов вы не поймёте, почему запросы падают: проблема в прокси, в таймаутах или в целевом сайте?
Решение: Логируйте каждую ошибку с указанием: какой прокси использовался, какой был timeout, сколько попыток сделано, какая именно ошибка произошла. Это поможет оптимизировать настройки.
Совет по выбору прокси: Если вы часто сталкиваетесь с timeout-ошибками даже при правильных настройках, возможно, проблема в качестве прокси. Дешёвые публичные или shared прокси часто перегружены и медленно отвечают. Для стабильной работы рекомендуем использовать качественные резидентные прокси с гарантированным uptime.
Заключение
Правильная настройка timeout и retry logic — это не просто техническая деталь, а критически важный фактор стабильности и эффективности работы с прокси. Без таймаутов ваши скрипты будут зависать на мёртвых прокси, теряя время. Без retry logic вы будете терять данные при временных ошибках. А без ротации прокси при повторных попытках — получите низкий success rate даже с качественным пулом IP.
Основные выводы из этого руководства:
- Всегда устанавливайте timeout явно: connect timeout 5-10 секунд, read timeout 10-30 секунд в зависимости от задачи
- Используйте retry logic с ограничением 3-5 попыток и экспоненциальной задержкой
- Ротируйте прокси при каждой повторной попытке — это ключ к высокому success rate
- Повторяйте только временные ошибки (timeout, 429, 500, 502, 503, 504), не тратьте попытки на постоянные (404, 403)
- Логируйте все ошибки для анализа и оптимизации настроек
- Учитывайте тип прокси: мобильные медленнее дата-центров, увеличивайте таймауты соответственно
Если вы работаете с парсингом маркетплейсов (Wildberries, Ozon, Авито), автоматизацией соцсетей или рекламными платформами, стабильность прокси напрямую влияет на ваш результат. Используйте качественные прокси с высоким uptime и правильно настраивайте timeout и retry — это сэкономит вам часы времени и тысячи потерянных запросов.
Для задач, требующих максимальной стабильности и минимального количества timeout-ошибок, рекомендуем попробовать прокси дата-центров — они обеспечивают высокую скорость отклика и стабильное соединение, что особенно важно при массовом парсинге и автоматизации.