프로젝트에서 Requests를 사용할 수 있다면 호출에 프록시 매핑을 전달하세요.

import requests

proxies = {
    "http": "http://127.0.0.1:8080",
    "https": "http://127.0.0.1:8080",
}

response = requests.get(
    "https://example.com/",
    proxies=proxies,
    timeout=(5, 15),
)
response.raise_for_status()
print(response.status_code)

루프백 엔드포인트를 실행 중인 프록시나 이번 요청으로 시험할 HTTP 프록시 목록의 후보로 바꾸세요. 키는 목적지 스킴을 나타냅니다. http 는 HTTP URL에, https 는 HTTPS URL에 해당합니다. 값은 프록시 리스너를 나타냅니다. 네트워크에 별도 경로가 필요하다면 서로 다른 엔드포인트여도 됩니다.

http:// 프록시 값을 https 키 아래 두는 것은 의도적입니다. Requests는 HTTP 리스너에 CONNECT 터널을 요청한 뒤 그 안으로 목적지 TLS를 설정하며, 프록시의 목적지와 포트 정책을 따릅니다. 값을 https:// 로 바꾸면 프록시 자체에 대한 TLS를 요청하므로 리스너가 평문 HTTP를 기대한다면 실패할 수 있습니다.

두 타임아웃 숫자의 의미

timeout=(5, 15) 은 연결 및 읽기 타임아웃을 설정합니다. 전체를 십오 초로 제한하는 마감 시간이 아닙니다. 주기적인 데이터 수신, 여러 주소와 연결 시도 때문에 경과 시간이 늘어날 수 있습니다. 이 설정을 생략하면 Requests는 일반 타임아웃을 제공하지 않으므로 응답에 맞는 한도를 정하고 엄격한 총시간 예산이 필요하면 애플리케이션 수준의 마감 시간을 추가하세요.

실패가 발생한 단계에서 처리하기

try:
    response = requests.get(
        "https://example.com/",
        proxies=proxies,
        timeout=(5, 15),
    )
    response.raise_for_status()
except requests.exceptions.ProxyError as error:
    print("Proxy setup failed:", type(error).__name__)
except requests.exceptions.Timeout:
    print("A configured timeout expired")
except requests.exceptions.HTTPError as error:
    print("HTTP status:", error.response.status_code)

CONNECT 거부는 목적지 응답이 존재하기 전에 ProxyError 를 일으킬 수 있습니다. HTTPError 분기는 오류 상태 응답을 받은 뒤에 해당하며, Timeout 은 설정한 한도가 만료되었다는 뜻입니다. 연결 설정 예외의 연결 관계는 로컬에서 확인하고, 공유하기 전에 인증 정보가 든 엔드포인트와 비공개 URL을 제거하세요.

인증서 검증은 켜 두세요. 승인된 네트워크가 사설 CA나 관리되는 가로채기를 사용한다면 검증을 끄지 말고 예상된 신뢰 자료를 제공하세요.

명시한 요청별 항목은 여기에서 제공한 경로를 제어하지만, 생략한 스킴은 환경의 프록시 검색에 여전히 영향을 받을 수 있습니다. 재사용 가능한 Session으로 호출을 옮길 때는 환경 변수, Session 기본값과 요청별 재정의가 어떻게 상호작용할지 정하세요. 연결 재사용과 라우팅 정책은 별개의 선택입니다.

관련 글