마켓플레이스 파싱, 소셜 미디어 자동화 또는 데이터 수집을 위해 프록시를 사용할 때 가장 흔한 문제는 요청이 멈추거나 데이터가 손실되는 것입니다. 프록시 서버가 제때 응답하지 않거나 연결이 끊길 수 있으며, 스크립트가 몇 분 동안 멈출 수 있습니다. 그 결과 시간, 데이터 및 돈을 잃게 됩니다.
이 가이드에서는 프록시와 함께 작업하기 위해 타임아웃(타임아웃) 및 재시도 로직(재시도 로직)을 올바르게 설정하는 방법을 보여드리겠습니다. 다양한 작업에 대해 어떤 타임아웃 값을 사용해야 하는지, 오류 발생 시 자동으로 재연결하는 방법, 요청을 하나도 잃지 않는 방법을 알아보세요. 이 기사는 Python으로 코드를 작성하는 사람과 준비된 파싱 도구를 사용하는 사람 모두에게 적합합니다.
프록시 작업 시 타임아웃이 중요한 이유
상황을 상상해 보세요: Wildberries에서 10,000개의 상품 가격을 파싱하는 파서를 실행했습니다. 스크립트는 차단되지 않도록 프록시를 통해 작동합니다. 모든 것이 잘 진행되지만 523번째 요청에서 프록시 서버가 응답을 멈춥니다. 아마도 과부하가 걸리거나 일시적으로 사용할 수 없게 된 것입니다. 타임아웃이 설정되지 않으면 스크립트는 응답을 무한정 기다리게 됩니다(또는 시스템 타임아웃이 2-5분이 될 때까지). 결국 파싱이 중단되고, 시간과 데이터를 잃게 되며, 문제를 발견할 때까지 몇 시간이 걸릴 수 있습니다.
타임아웃은 서버로부터 응답을 기다리는 최대 시간입니다. 이 시간 내에 서버가 응답하지 않으면 요청이 중단되고, 다른 프록시를 통해 재시도하거나 오류를 로그에 기록할 수 있습니다. 이는 프록시와 함께 작업할 때 특히 중요합니다:
- 프록시 서버는 불안정할 수 있습니다 — 특히 공개적이거나 저렴한 경우. 심지어 품질이 좋은 주거용 프록시도 실제 사용자가 인터넷에서 연결을 끊는 경우 연결을 잃을 수 있습니다.
- 대상 사이트가 IP를 차단할 수 있습니다 — 프록시가 차단되면 전혀 응답하지 않거나 매우 느리게 응답할 수 있습니다(캡차나 리디렉션을 반환함).
- 네트워크 지연은 예측할 수 없습니다 — 특히 다른 국가의 프록시를 사용할 때. 요청은 여러 중간 노드를 통해 전송될 수 있습니다.
- 대량 작업은 안정성이 필요합니다 — 100,000페이지를 파싱하거나 50개의 Instagram 계정을 운영하는 경우, 1%의 멈춘 요청은 1,000개의 손실된 작업에 해당합니다.
올바르게 설정된 타임아웃이 없으면 스크립트는 사용할 수 없는 프록시를 기다리는 데 시간을 낭비하게 되며, 이는 작업 속도와 결과의 안정성에 직접적인 영향을 미칩니다.
타임아웃 유형: 연결, 읽기 및 총 타임아웃
이해하고 별도로 설정해야 하는 세 가지 주요 유형의 타임아웃이 있습니다. 많은 초보 개발자와 파서 사용자는 단일 공통 타임아웃만 설정하여 문제를 일으킵니다.
1. 연결 타임아웃
프록시 서버와의 연결을 설정하는 데 할당된 시간입니다. 이 시간 내에 연결이 설정되지 않으면 요청이 중단됩니다. 연결 타임아웃은 클라이언트와 프록시 간의 초기 핸드셰이크(TCP 핸드셰이크)를 담당합니다.
작동 시점: 프록시 서버가 사용할 수 없거나 과부하가 걸리거나 IP가 방화벽에 의해 차단된 경우.
권장 값:
- 빠른 데이터 센터 프록시: 3-5초
- 주거용 프록시: 5-10초
- 모바일 프록시: 10-15초 (모바일 인터넷이 느림)
2. 읽기 타임아웃
프록시와의 연결이 이미 설정된 후, 대상 서버로부터 응답을 기다리는 시간입니다. 이 시간 내에 서버가 데이터를 보내기 시작하지 않으면 요청이 중단됩니다. 읽기 타임아웃은 서버가 요청을 수락했지만 "멈추고" 응답을 보내지 않는 상황을 방지합니다.
작동 시점: 대상 사이트가 요청을 느리게 처리하거나 과부하가 걸리거나 의도적으로 의심스러운 요청을 지연시키는 경우.
권장 값:
- 단순 페이지(HTML) 파싱: 10-15초
- JavaScript 렌더링으로 파싱: 30-60초
- API 요청: 5-10초
- 대용량 파일 다운로드: 120초 이상
3. 총 타임아웃
요청의 시작부터 끝까지 수행하는 데 걸리는 최대 시간으로, 연결, 요청 전송, 응답 수신 및 읽기를 포함합니다. 총 타임아웃은 어떤 요청도 설정된 시간보다 오래 걸리지 않도록 보장하는 "비상 스위치"입니다.
사용 시점: 각 요청이 엄격한 시간 제한 내에 완료되는 것이 중요한 경우(예: 중재를 위한 실시간 파싱 시).
공식: 총 타임아웃 = 연결 타임아웃 + 읽기 타임아웃 + 여유 20-30%
중요: 모든 라이브러리와 도구가 연결 및 읽기 타임아웃을 별도로 설정하는 것을 지원하지 않습니다. 예를 들어, Python의 requests 라이브러리는 두 값을 튜플로 지정할 수 있습니다: timeout=(5, 15), 여기서 5는 연결, 15는 읽기입니다.
다양한 작업에 대한 최적의 타임아웃 값
올바른 타임아웃 값은 작업, 프록시 유형 및 대상 사이트에 따라 다릅니다. 너무 짧은 타임아웃은 많은 허위 오류를 초래할 수 있습니다(프록시는 작동하지만 이를 버리게 됩니다). 너무 긴 타임아웃은 죽은 프록시를 기다리는 데 시간을 낭비하게 됩니다.
| 작업 | 연결 타임아웃 | 읽기 타임아웃 | 비고 |
|---|---|---|---|
| Wildberries, Ozon 파싱 | 5-7초 | 15-20초 | 마켓플레이스는 많은 상품이 있는 페이지를 느리게 반환할 수 있습니다. |
| Avito, Yandex.Market 파싱 | 5-7초 | 10-15초 | 보통 빠른 사이트지만 의심스러운 IP를 차단할 수 있습니다. |
| Instagram, TikTok 자동화 | 7-10초 | 20-30초 | 모바일 프록시를 사용하세요 — 느리지만 더 안정적입니다. |
| Facebook Ads API 작업 | 5초 | 10-15초 | API는 보통 빠르지만 속도 제한이 있을 때 느려질 수 있습니다. |
| Selenium/Puppeteer를 통한 파싱 | 10초 | 60-120초 | JavaScript 렌더링은 시간이 걸리며, 특히 느린 프록시에서 그렇습니다. |
| 프록시 대량 검사 | 3-5초 | 5-7초 | 빠른 가용성 검사를 수행하며, 느린 프록시는 제외됩니다. |
조언: 보수적인(더 긴) 타임아웃으로 시작하고 오류 로그를 분석하면서 점차 줄여나가세요. 작동하는 프록시에서 많은 타임아웃 오류가 발생하면 값을 늘리세요. 스크립트가 느린 프록시로 인해 지연된다면 줄이세요.
재시도 로직: 재시도를 올바르게 설정하는 방법
타임아웃은 멈춘 요청 문제를 해결하지만 데이터 손실 문제를 해결하지는 않습니다. 프록시가 응답하지 않으면 오류가 발생하고 해당 요청을 잃게 됩니다. 그래서 재시도 로직이 매우 중요합니다.
재시도 로직은 오류 발생 시 요청을 자동으로 반복하는 것입니다. 올바른 설정을 위한 기본 원칙은 다음과 같습니다:
1. 어떤 오류가 재시도를 요구하는지 정의하세요
모든 오류를 반복할 필요는 없습니다. 예를 들어:
- 재시도해야 하는 오류: 타임아웃, 연결 거부, 프록시 오류, 502/503/504 (서버의 일시적인 오류), 속도 제한 (429)
- 재시도할 필요 없는 오류: 404 (페이지를 찾을 수 없음), 403 (접근 금지), 401 (잘못된 인증), 데이터 유효성 검사 오류
2. 시도 횟수를 설정하세요
최적의 재시도 횟수는 데이터의 중요성에 따라 다릅니다:
- 중요하지 않은 작업(분석을 위한 파싱)의 경우: 2-3회 시도
- 중요한 작업(경쟁사 가격 모니터링)의 경우: 3-5회 시도
- 중대한 작업(광고 계정 작업)의 경우: 5-10회 시도
3. 지수 백오프 사용
요청을 즉시 반복하지 마세요 — 이는 문제를 악화시킬 수 있습니다(예: 서버가 과부하 상태인 경우). 시도 간에 증가하는 지연을 사용하세요:
- 1차 시도: 즉시
- 2차 시도: 1-2초 후
- 3차 시도: 4-5초 후
- 4차 시도: 10-15초 후
공식: 지연 = 기본_지연 * (2 ^ 시도_번호). 예: 1초, 2초, 4초, 8초, 16초.
4. 재시도 시 프록시 회전
가장 중요한 규칙: 재시도 시 풀에서 다른 프록시를 사용하세요. 하나의 프록시가 요청을 수행하지 못했다면, 재시도 시 성공할 가능성은 낮습니다. 그러나 다른 프록시는 높은 확률로 성공할 수 있습니다.
이는 수백 또는 수천 개의 IP 주소가 있는 주거용 프록시 작업 시 특히 중요합니다. 각 재시도마다 풀에서 새로운 무작위 IP를 선택하세요.
Python에서 타임아웃 및 재시도 설정 예제
인기 있는 라이브러리를 사용하여 Python에서 타임아웃 및 재시도 로직을 구현하는 실제 예제를 살펴보겠습니다.
예제 1: requests로 기본 설정
requests 라이브러리는 Python에서 HTTP 요청을 위한 가장 인기 있는 라이브러리입니다. 타임아웃 및 간단한 재시도를 설정하는 방법은 다음과 같습니다:
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
# 재시도 로직 설정
retry_strategy = Retry(
total=5, # 최대 5회 시도
backoff_factor=1, # 지연: 1, 2, 4, 8, 16초
status_forcelist=[429, 500, 502, 503, 504], # 재시도를 위한 오류 코드
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'
}
# 타임아웃과 함께 요청 실행
try:
response = session.get(
'https://www.wildberries.ru/catalog/electronics',
proxies=proxies,
timeout=(5, 15) # 연결 타임아웃 5초, 읽기 타임아웃 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}")
이 예제에서는 세션 수준에서 자동 재시도를 설정했습니다. 429, 500, 502, 503, 504 오류가 발생하면 라이브러리가 자동으로 요청을 최대 5회 재시도하며, 지수 백오프를 사용합니다.
예제 2: 재시도 시 프록시 회전
각 시도에서 프록시를 회전하는 보다 발전된 예제입니다:
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):
"""
재시도 및 프록시 회전으로 요청을 수행합니다.
"""
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 라이브러리 사용
재시도 로직을 보다 유연하게 관리하기 위해 전문 라이브러리인 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):
"""
데코레이터를 통한 자동 재시도 함수
"""
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 라이브러리는 데코레이터를 통해 재시도를 매우 유연하게 설정할 수 있는 기능을 제공합니다. 설치: pip install tenacity
코드 없이 파싱을 위한 준비된 솔루션
프로그래머가 아니거나 개발 시간을 절약하고 싶다면, 타임아웃 및 재시도 로직이 내장된 준비된 파싱 도구가 있습니다. 코드를 작성할 필요 없이 그래픽 인터페이스에서 매개변수를 설정하기만 하면 됩니다.
Octoparse
Windows 및 Mac용 인기 있는 비주얼 파서입니다. 타임아웃 및 재시도 설정:
- 작업 설정 열기 → 고급 옵션
- 페이지 로드 타임아웃: 20-30초 설정
- Ajax 타임아웃: 동적 콘텐츠에 대해 10-15초
- 재시도 횟수: 오류 발생 시 3-5회 시도
- 프록시 설정에서 목록을 업로드하고 자동 회전을 활성화할 수 있습니다.
ParseHub
무료 요금제가 있는 클라우드 파서입니다. 설정:
- 설정 → 고급 → 페이지 로드 지연: 5-10초
- 요청 타임아웃: 30초
- 실패한 요청 재시도: 활성화, 3회 시도
- 프로젝트 설정을 통해 프록시를 지원합니다.
Apify
인기 사이트 파싱을 위한 준비된 액터(스크립트)가 있는 웹 작업 자동화 플랫폼입니다. 많은 마켓플레이스(Wildberries, Ozon) 파싱을 위한 액터는 이미 최적의 타임아웃 및 재시도 설정이 내장되어 있습니다. 필요한 것은:
- 필요한 사이트에 대한 준비된 액터 선택
- 프록시 지정 (프록시 제공업체와의 통합 지원)
- 작업 실행 — 나머지는 자동으로 설정됩니다.
안티탐지 브라우저를 통한 자동화
Dolphin Anty, AdsPower 또는 Multilogin을 통해 소셜 미디어 또는 광고 플랫폼에서 작업하는 경우, 브라우저 프로필에서 타임아웃을 설정합니다:
- Dolphin Anty: 프로필 설정 → 프록시 → 타임아웃: 10-15초
- AdsPower: 프록시 설정 → 연결 타임아웃: 10초, 읽기 타임아웃: 20초
- Multilogin: 브라우저 프로필 → 네트워크 → 프록시 타임아웃: 15초
이러한 브라우저를 통해 자동화할 때(예: Selenium 스크립트) 프록시의 타임아웃은 프로필 설정에서 상속되지만, 스크립트 수준에서 추가 타임아웃을 설정할 수도 있습니다.
타임아웃 설정 시 흔한 실수
경험이 많은 개발자와 파싱 전문가조차도 타임아웃 및 재시도 작업에서 일반적인 실수를 저지릅니다. 가장 흔한 실수는 다음과 같습니다:
오류 1: 타임아웃이 전혀 없음
많은 라이브러리가 기본적으로 타임아웃을 설정하지 않거나 매우 큰 값(몇 분)을 설정합니다. 타임아웃을 명시적으로 지정하지 않으면 스크립트가 오랜 시간 동안 멈출 수 있습니다.
해결책: 각 요청에서 항상 명시적으로 타임아웃을 설정하세요. 15초 후 오류를 받는 것이 5분 동안 기다리는 것보다 낫습니다.
오류 2: 모든 재시도에서 동일한 프록시 사용
프록시가 처음에 응답하지 않으면, 동일한 프록시로 재시도할 성공 확률이 매우 낮습니다. 많은 사람들이 시도 간에 프록시를 회전하는 것을 잊습니다.
해결책: 각 재시도에서 풀에서 새로운 프록시를 사용하세요. 이는 높은 성공률을 위해 매우 중요합니다.
오류 3: 느린 프록시에 대한 너무 짧은 타임아웃
모바일 및 일부 주거용 프록시는 데이터 센터보다 느릴 수 있습니다. 모바일 프록시에 대해 5초의 타임아웃을 설정하면, 실제로 작동하는 IP에서 많은 허위 오류가 발생할 수 있습니다.
해결책: 프록시 유형을 고려하세요. 모바일의 경우 최소 10-15초의 타임아웃을 사용하세요.
오류 4: 제한 없는 무한 재시도
일부는 시도 횟수 제한 없이 while True 루프에서 재시도를 구현합니다. 대상 사이트에 문제가 있는 경우(예: 사이트가 완전히 다운된 경우) 스크립트는 무한히 시도하게 됩니다.
해결책: 항상 재시도 횟수를 제한하세요(최대 3-10회 시도) 및 실패한 요청을 기록하여 후속 분석을 위해 사용하세요.
오류 5: 오류 유형 무시
모든 오류를 재시도할 필요는 없습니다. 예를 들어, 404(페이지를 찾을 수 없음)를 받은 경우 — 재시도는 의미가 없습니다. 그러나 503(서비스가 일시적으로 사용할 수 없음)은 몇 초 후에 재시도할 가치가 있습니다.
해결책: 오류 유형을 분석하고 일시적인 문제(타임아웃, 연결 오류, 429, 500, 502, 503, 504)만 재시도하세요.
오류 6: 로깅 부족
로그가 없으면 요청이 실패하는 이유를 알 수 없습니다: 프록시 문제인지, 타임아웃 문제인지, 대상 사이트 문제인지?
해결책: 사용된 프록시, 타임아웃, 시도 횟수, 발생한 오류를 명시하여 모든 오류를 기록하세요. 이는 설정 최적화에 도움이 됩니다.
프록시 선택에 대한 조언: 올바른 설정에도 불구하고 타임아웃 오류가 자주 발생한다면, 프록시 품질에 문제가 있을 수 있습니다. 저렴한 공개 또는 공유 프록시는 종종 과부하 상태이며 느리게 응답합니다. 안정적인 작업을 위해 품질 좋은 주거용 프록시를 사용하는 것을 권장합니다.
결론
타임아웃 및 재시도 로직의 올바른 설정은 단순한 기술적 세부 사항이 아니라 프록시 작업의 안정성과 효율성에 중요한 요소입니다. 타임아웃이 없으면 스크립트가 죽은 프록시에서 멈추게 되어 시간을 낭비하게 됩니다. 재시도 로직이 없으면 일시적인 오류로 인해 데이터를 잃게 됩니다. 재시도 시 프록시 회전이 없으면 품질 좋은 IP 풀을 사용하더라도 낮은 성공률을 얻게 됩니다.
이 가이드의 주요 요점은 다음과 같습니다:
- 항상 타임아웃을 명시적으로 설정하세요: 연결 타임아웃 5-10초, 읽기 타임아웃 10-30초 작업에 따라 다름
- 재시도 로직을 사용하고 3-5회 시도로 제한하며 지수 백오프를 사용하세요
- 각 재시도 시 프록시를 회전하세요 — 높은 성공률의 열쇠입니다
- 일시적인 오류(타임아웃, 429, 500, 502, 503, 504)만 재시도하고 영구적인 오류(404, 403)에는 시도를 낭비하지 마세요
- 모든 오류를 기록하여 분석 및 설정 최적화를 위해 사용하세요
- 프록시 유형을 고려하세요: 모바일은 데이터 센터보다 느리며, 타임아웃을 적절히 늘리세요
마켓플레이스(Wildberries, Ozon, Avito) 파싱, 소셜 미디어 자동화 또는 광고 플랫폼 작업을 수행하는 경우, 프록시의 안정성이 결과에 직접적인 영향을 미칩니다. 높은 가동 시간을 가진 품질 좋은 프록시를 사용하고 타임아웃 및 재시도를 올바르게 설정하세요 — 이는 수많은 요청을 잃고 수시간의 시간을 절약할 수 있습니다.
최대한의 안정성과 최소한의 타임아웃 오류가 필요한 작업에는 데이터 센터 프록시를 사용해 보세요 — 높은 응답 속도와 안정적인 연결을 제공하여 대량 파싱 및 자동화 시 특히 중요합니다.