스크래핑용 회전 프록시: 설정 방법과 함정
회전 프록시는 요청마다, 또는 정해진 간격마다 트래픽이 나가는 IP 주소를 바꿉니다. 웹 스크래핑에서 가장 흔한 도구 중 하나이면서 가장 잘못 쓰이는 도구이기도 합니다. 너무 적게 회전하면 단일 주소가 속도 제한을 받습니다. 너무 많이 회전하면 트래픽이 방문자처럼 전혀 보이지 않습니다. 이 가이드는 두 가지 회전 모델을 설명하고, 죽은 프록시에 대한 재시도를 포함한 동작하는 Python 설정을 보여 주며, 프록시 필드가 captcha 풀이에 어떻게 들어맞는지 다룹니다.
회전 방식과 고정 세션
회전 프록시 서비스가 주소를 제공하는 방식은 두 가지입니다.
- 요청별 회전. 모든 요청마다 새 출구 주소를 받습니다. 어떤 페이지도 이전 페이지를 필요로 하지 않는, 서로 무관한 많은 페이지를 대량으로 크롤링할 때 적합합니다.
- 고정 세션. 정해진 시간, 보통 몇 분 동안, 또는 해제할 때까지 하나의 주소를 유지합니다. 로그인, 장바구니, 쿠키가 중요한 페이지 목록처럼 상태가 필요한 작업에 적합합니다.
실제 방문자는 한 번의 방문 동안 하나의 주소를 유지합니다. 고정 세션은 그 동작을 흉내 내므로, 사이트가 쿠키나 세션을 쓸 때는 보통 더 나은 기본값입니다. 상태가 없는 크롤링에만 요청별 회전을 쓰세요.
Python으로 만드는 기본 회전 풀
아래 예시는 프록시 URL 풀을 유지하고, 그 사이를 돌아가며 사용하고, 하나가 실패하면 다음으로 넘어갑니다. 자격 증명은 소스 코드가 아니라 환경 변수에 보관하세요.
import itertools
import os
import requests
# 프록시 URL은 환경 변수에서 가져옵니다. 예를 들면 다음과 같습니다.
# PROXY_POOL="http://user:pass@203.0.113.10:8080,http://user:pass@203.0.113.11:8080"
PROXIES = [p.strip() for p in os.environ.get("PROXY_POOL", "").split(",") if p.strip()]
rotation = itertools.cycle(PROXIES)
def fetch(url: str, max_tries: int = 3) -> requests.Response:
last_error = None
for _ in range(max_tries):
proxy = next(rotation)
try:
r = requests.get(
url,
proxies={"http": proxy, "https": proxy},
timeout=30,
)
if r.status_code == 407: # 프록시 인증 실패
raise requests.RequestException("proxy auth rejected")
return r
except requests.RequestException as exc:
last_error = exc # 죽었거나 느린 프록시: 다음 것을 시도합니다
raise RuntimeError(f"all attempts failed for {url}: {last_error}")
여기서는 두 가지 세부 사항이 중요합니다. 첫째, 죽은 프록시는 같은 주소가 아니라 다른 주소로 재시도해야 합니다. 둘째, 인증 오류로 실패한 요청은 풀 전체를 소모하지 말고 멈춘 뒤 보고해야 합니다.
프록시 상태 추적하기
단순한 라운드 로빈은 실패하기 시작한 프록시에도 계속 트래픽을 보냅니다. 주소마다 간단한 점수를 추적하세요. 최근 실패 횟수를 세고, 임계값을 넘으면 쿨다운 기간 동안 풀에서 뺍니다. 나중에 다시 넣고 다시 지켜보세요. 그러면 스크래퍼는 요청을 풀의 건강한 부분에 씁니다.
각 결과와 함께 사용한 프록시를 기록하세요. 사이트가 차단을 시작할 때, 원인이 한 주소인지, 한 지역인지, 아니면 풀 전체인지 알아야 하기 때문입니다.
풀의 속도 조절
회전은 부하를 여러 주소에 나누지만, 각 주소에도 여전히 속도 한도가 있습니다. 주소별 지연을 설정하고, 풀 전체에서 초당 요청 수에 대한 전역 상한을 두세요. 회전은 더 많은 트래픽을 보내도 된다는 허가가 아닙니다. 한 주소에서 나가는 트래픽을 합리적인 한도 안에 두는 방법입니다.
흔한 실수
회전 문제 대부분은 몇 가지 습관에서 비롯됩니다. 로그인이나 결제 흐름 도중에 주소를 회전하면 세션이 깨지고 사이트가 의심하게 됩니다. 429 응답은 깨진 프록시가 아니라 사이트의 속도 제한이므로, 새 주소로 바꾸고 바로 재시도하면 문제만 퍼뜨립니다. 쿠키는 그대로 두고 요청마다 주소를 바꾸는 것도 일관성이 없습니다. 그 쿠키는 다른 방문자에게 발급된 것이기 때문입니다. 마지막으로, 한 번도 점검하지 않은 풀은 조용히 죽은 주소로 가득 차고, 뚜렷한 원인 없이 오류율이 올라갑니다. 일정에 따라 풀을 점검하고, 실패한 것은 제거하세요.
프록시와 captcha 풀이
일부 captcha 작업은 스크래퍼가 사용하는 프록시를 쓸 수 있습니다. 선택 필드인 proxy에 http://user:pass@host:port 형식으로 넘기면, 풀이는 페이지 요청이 사용하는 것과 같은 네트워크 경로에서 실행됩니다. 프록시리스 작업은 그 필드를 완전히 생략합니다. 어느 쪽을 고를지는 사이트가 captcha를 네트워크 주소에 묶어 두었는지에 달려 있으며, 그 트레이드오프는 프록시 vs 프록시리스 captcha에서 설명합니다.
실무 포인트는 두 가지입니다.
- 사이트가 주소를 확인한다면, 페이지 요청과 captcha 풀이에 같은 프록시를 쓰세요. 주소를 섞으면 토큰이 실패할 수 있습니다.
- 토큰은 빨리 만료됩니다. 폼을 제출하기 직전에 토큰을 요청하고, 훨씬 전에 받아 두지 마세요. captcha 토큰 만료를 참고하세요.
Scarnox에서 오늘날 실시간으로 제공되는 captcha 유형은 PopularCaptcha입니다. 요청 방법과 반환된 토큰을 제출하는 방법은 PopularCaptcha Python 가이드에서 보여 줍니다.
프록시 고르기
회전하는 주소의 유형은 회전 자체만큼 중요합니다. 데이터센터 주소는 빠르고 요청당 비용이 저렴하지만, 점수가 낮게 매겨지는 경우가 많습니다. 주거용 주소는 점수가 더 좋지만 느립니다. 주거용 vs 데이터센터 프록시 가이드는 둘을 깊이 비교하며, 거기 나온 조언은 여기서 만드는 풀에도 그대로 적용됩니다.
책임 있게 스크래핑하기
- 스크래핑하는 사이트의
robots.txt와 이용 약관을 읽으세요. - 정당한 부하를 분산하는 데 프록시를 쓰고, 소유자가 설정한 제한을 우회하는 데는 쓰지 마세요.
- 주소가 동의를 받고 조달된 프록시 서비스만 쓰세요. 동의하지 않은 사람들이 소유한 기기를 통해 라우팅하는 것은 용납될 수 없습니다.
- 자격 증명은 코드와 로그에 넣지 마세요.
다음 단계
무료 체험 크레딧으로 카드 없이 시작하세요. 계정을 만들고 직접 가진 프록시로 PopularCaptcha 흐름을 테스트해 보세요. 현재 요금은 요금 페이지에서 확인할 수 있습니다.