이 가이드에서는 Python에서 프록시를 순환하는 방법을 배우게 됩니다:
- 프록시란 무엇이며 왜 사용해야 하는지
- 프록시 로테이션이란 무엇이며 필요한 이유
- 파이썬에서 프록시 로테이션 수행 방법
- 파이썬에서 프록시 로테이션 시 흔히 발생하는 제한 사항
자, 시작해 보겠습니다!
프록시란 무엇인가?
프록시는 인터넷을 통해 사용자와 네트워크 리소스 사이의 중개자 역할을 하는 서버입니다. 따라서 프록시는 당사자들 사이에서 요청과 응답을 전달하는 중개인이라고 생각할 수 있습니다.
파이썬에서 프록시를 사용하는 이유는?
프록시를 사용하여 웹사이트에 요청을 보낼 때, 해당 요청은 먼저 프록시 서버를 통과합니다. 그런 다음 프록시는 요청을 웹사이트로 전달하고 응답을 수신하여 사용자에게 다시 보냅니다. 이 과정은 대상에 사용자의 IP 주소를 숨겨, 요청이 사용자의 기기가 아닌 프록시 서버에서 오는 것처럼 보이게 합니다.
프록시를 사용하는 대표적인 이유는 웹 요청 자동화나 웹 스크래핑을 할 때입니다. 이 경우 파이썬은 방대한 라이브러리와 활발한 커뮤니티 덕분에 웹 스크래핑에 가장 적합한 언어 중 하나입니다.
프록시 로테이션이란 무엇이며 왜 필요한가?
단일 IP 주소에서 너무 많은 요청을 하면 웹사이트가 속도 제한이나 IP 차단으로 접근을 차단할 수 있습니다. 이때 프록시를 통한 프록시 로테이션이 도움이 됩니다.
웹 요청을 수행하는 동안 체계적으로 서로 다른 프록시 서버를 전환하는 것은 IP 주소 로테이션을 구현하는 가장 효과적인 방법 중 하나입니다. 이 절차는 일반적인 스크래핑 방지 기술을 우회하는 데 도움이 되며 다음과 같은 이점을 제공합니다:
- IP 차단 회피: 요청을 여러 IP에 분산시켜 웹사이트가 스크래핑 활동을 탐지하고 차단하기 어렵게 만듭니다.
- 속도 제한 우회: 웹사이트는 특정 시간대 내 IP 주소당 요청 제한을 설정하는 경우가 많습니다. 프록시 로테이션을 통해 하나의 IP에서 제한에 도달한 후에도 스크래핑을 계속할 수 있습니다.
- 지역 제한 콘텐츠 접근: 일부 웹사이트는 지리적 위치에 따라 다른 콘텐츠를 표시합니다. 여러 국가의 프록시를 활용한 프록시 로테이션을 통해 지역별 콘텐츠에 접근할 수 있습니다.
파이썬에서 프록시 회전하는 방법: 3가지 접근법
프록시의 개념과 회전 필요성을 이해하셨다면, 이제 Python을 활용한 단계별 튜토리얼을 시작해 보겠습니다. 다음 단락에서는 다양한 접근법과 라이브러리를 사용해 Python에서 프록시를 회전하는 방법을 보여드리겠습니다.
모든 스크립트의 대상 사이트는 HTTPBin 프로젝트의 /ip 엔드포인트입니다. 이 특수 엔드포인트는 호출자의 IP 주소를 반환하므로, 서버가 인식하는 IP가 회전 중인지 테스트하기에 완벽합니다.
이제 Python으로 프록시를 회전시켜 볼 시간입니다!
필수 사항
파이썬으로 프록시 회전 튜토리얼을 재현하려면 컴퓨터에 Python 3.7 이상이 설치되어 있어야 합니다.
필수 조건
프로젝트의 메인 폴더를 proxy_rotation/이라고 가정합니다 . 이 단계가 완료되면 폴더 구조는 다음과 같을 것입니다:
proxy_rotation/
├── requests_file.py
├── async.py
├── scrapy_rotation/
└── venv/
여기서:
requests.py와async.py는각각 Requests 및 AIOHTTP 프록시 회전 로직을 저장하는 Python 파일입니다.scrapy_rotation/은Scrapy 프로젝트를 포함하는 폴더입니다. 나중에 생성하고 인스턴스화할 것입니다.venv/에는가상 환경이 포함됩니다.
다음과 같이 venv/ 가상 환경 디렉터리를 생성할 수 있습니다:
python -m venv venv
활성화하려면 Windows에서 다음을 실행하세요:
venvScriptsactivate
macOS 및 Linux에서는 다음과 같이 실행합니다:
source venv/bin/activate
마지막으로 필요한 것은 프록시 목록을 가져오는 것입니다. 본 문서에서는 저희의 무료 프록시 목록을 사용할 수 있습니다.
Python에서 Requests를 사용해 프록시 회전하는 방법
이 튜토리얼 섹션에서는 Requests를 사용하여 Python에서 프록시를 회전하는 방법을 배웁니다.
1단계: 종속성 설치
활성화된 가상 환경에서 Requests를 설치합니다:
pip install requests
단계 #2: 로테이션 로직 정의
Python에서 Requests를 사용해 프록시를 로테이션하려면 requests_file.py 파일에 다음 코드를 작성하세요:
import random
import requests
# 프록시 목록을 정의하고 무작위로 하나를 반환
def get_random_proxy():
proxies = [
"http://PROXY_1:PORT_X",
"http://PROXY_2:PORT_Y",
"http://PROXY_3:PORT_X",
# 여기에 프록시를 더 추가하세요...
]
# 프록시 무작위 선택
return random.choice(proxies)
for i in range(3):
proxy_url = get_random_proxy()
proxies = {
"http": proxy_url,
"https": proxy_url,
}
response = requests.get("https://httpbin.io/ip", proxies=proxies)
print(response.text)
여기서:
get_random_proxy()함수는 검색한 프록시 목록을 저장하고random.choice()메서드로 무작위 프록시를 반환합니다.for루프는 무작위로 선택된 프록시 목록을 순회하며requests.get()메서드로 실제 요청을 수행합니다. 자세한 내용은 Python Requests에서 프록시 사용 가이드를 참조하세요.
3단계: 스크립트 실행
스크립트를 실행하려면 다음을 실행하세요:
python requests_file.py
예상되는 응답은 다음과 같습니다:
{
"origin": "PROXY_3:PORT_K"
}
{
"origin": "PROXY_1:PORT_N"
}
{
"origin": "PROXY_2:PORT_P"
}
훌륭합니다! 스크립트의 출구 IP가 원하는 대로 로테이션되었습니다.
AIOHTTP를 사용한 Python에서 프록시 로테이션 방법
Requests 라이브러리를 사용한 무작위 방식의 주요 한계는 한 번에 하나의 프록시만 사용한다는 점입니다. 즉, 다음 프록시를 사용하기 전에 각 요청이 완료될 때까지 기다려야 합니다.
이러한 제한을 피하려면 AIOHTTP를 사용할 수 있습니다. 이 라이브러리는 비동기 요청을 가능하게 하여 비차단 방식으로 여러 프록시를 동시에 사용할 수 있게 합니다. 즉, 대상 서버에 대한 비동기 병렬 요청을 통해 목록의 프록시를 순환할 수 있습니다. 비동기 웹 스크래핑 가이드에서 AIOHTTP의 실제 사용법을 확인하세요.
다음 섹션에서는 AIOHTTP를 사용해 Python에서 프록시를 순환하는 방법을 보여줍니다.
1단계: 종속성 설치
가동된 가상 환경에서 다음 명령어로 AIOHTTP를 설치하세요:
pip install aiohttp
단계 #2: 로테이션 로직 정의
AIOHTTP를 사용해 Python에서 프록시를 로테이션하려면 async.py 파일에 다음 코드를 작성하세요:
import asyncio
import aiohttp
# 프록시 목록 정의
proxies_list = [
"http://PROXY_1:PORT_X",
"http://PROXY_2:PORT_Y",
"http://PROXY_3:PORT_X",
# 여기에 프록시 추가...
]
async def fetch_ip(session, proxy_address, attempt):
print(f"Attempt {attempt} using proxy: {proxy_address}")
async with session.get("https://httpbin.io/ip", proxy=proxy_address) as response:
json_response = await response.json()
print(f"httpbin.io/ip 응답 (시도 {attempt}):")
print(f"IP 주소: {json_response.get('origin', 'Unknown')}")
print("-" * 40)
return json_response
async def main():
async with aiohttp.ClientSession() as session:
tasks = []
num_attempts = 3
for i in range(num_attempts):
# 모듈러스 연산자를 사용하여 프록시 순환.
proxy_address = proxies_list[i % len(proxies_list)]
tasks.append(fetch_ip(session, proxy_address, i + 1))
# 모든 요청을 동시 실행
await asyncio.gather(*tasks)
# 스크립트 실행
asyncio.run(main())
이 코드는 다음과 같은 작업을 수행합니다:
fetch_ip()함수는 세션, 프록시, 시도 횟수를 받아 요청을 관리합니다. 특히 대상 웹사이트에GET요청을 보내고 응답을 출력합니다.main()함수:- HTTP 연결 관리를 위해
aiohttp.ClientSession()메서드로 세션을 생성합니다. - 동시에 여러 요청을 보내기 위한 작업 목록과 시도 횟수를 설정합니다.
- 요청 수가 프록시 수를 초과할 경우 프록시가 라운드 로빈 방식으로 재사용되도록 모듈러스 연산자(
i % len(proxies_list))를 사용하여 프록시를 순환합니다. AIOHTTP에서 프록시를 설정하는 방법에 대한 자세한 내용은 저희 튜토리얼에서 확인하세요. asyncio.gather()메서드를 사용하여 모든 작업을 동시에 실행합니다.
- HTTP 연결 관리를 위해
3단계: 스크립트 실행
스크립트를 실행하려면 다음을 실행하세요:
python async.py
예상되는 응답은 다음과 같습니다:
프록시 사용 시도 1: http://PROXY_1:PORT_X
프록시 사용 시도 2: http://PROXY_2:PORT_Y
프록시 사용 시도 3: http://PROXY_3:PORT_Z
httpbin.io/ip 응답 (시도 3):
IP 주소: xxx.xxx.xxx.xxx
----------------------------------------
httpbin.io/ip 응답 (시도 1):
IP 주소: yyy.yyy.yyy.yyy
----------------------------------------
httpbin.io/ip 응답 (시도 2):
IP 주소: zzz.zzz.zzz.zzz
----------------------------------------
대단하네요! IP가 예상대로 회전되고 있습니다.
Python Scrapy로 프록시 회전하는 방법
이전 글에서는 scrapy-rotating-proxies를 사용해 Python의 Scrapy로 프록시를 회전시키는 방법을 다뤘습니다.
이 가이드 섹션에서는 그 방법을 배울 수 있습니다!
1단계: 종속성 설치
가동된 가상 환경에서 필요한 라이브러리를 설치하세요:
pip install scrapy scrapy-rotating-proxies
2단계: 새 Scrapy 프로젝트 생성
저장소 메인 폴더(proxy_rotation/) 내에서 다음 명령어로 새 Scrapy 프로젝트를 생성하세요:
scrapy startproject scrapy_rotation
이렇게 하면 다음과 같은 구조를 가진 scrapy_rotation/ 이라는 새 하위 폴더가 생성됩니다:
scrapy_rotation/
├── scrapy_rotation/
│ ├── __init__.py
│ ├── items.py # 스크랩된 항목의 데이터 구조 정의
│ ├── middlewares.py # 사용자 정의 미들웨어
│ ├── pipelines.py # 스크랩된 데이터의 후처리 처리
│ ├── settings.py # 프로젝트 설정
│ └── spiders/ # 모든 스파이더를 위한 폴더
└── scrapy.cfg # Scrapy 구성 파일
메인 폴더(proxy_rotation/)에서 scrapy_rotation/ 폴더로 이동:
cd scrapy_rotation
이제 다음 명령을 실행하여 대상 웹사이트를 가리키는 새 스파이더를 생성할 수 있습니다:
scrapy genspider rotation http://httpbin.io/ip
이 스크립트는 spiders/ 폴더 내에 rotation.py 파일도 생성합니다.
단계 #3: 로테이션 로직 정의
다음 설정으로 settings.py 파일을 수정하여 프록시 로테이션 로직을 관리할 수 있습니다:
# 회전 프록시 미들웨어 활성화
DOWNLOADER_MIDDLEWARES = {
"rotating_proxies.middlewares.RotatingProxyMiddleware": 610,
"rotating_proxies.middlewares.BanDetectionMiddleware": 620,
}
# 로테이션 대상 프록시 목록
ROTATING_PROXY_LIST = [
"http://PROXY_1:PORT_X",
"http://PROXY_2:PORT_Y",
"http://PROXY_3:PORT_Z",
# 필요 시 프록시 추가
]
# 재시도 설정 구성
RETRY_TIMES = 5 # 실패한 요청에 대한 재시도 횟수
RETRY_HTTP_CODES = [500, 502, 503, 504, 408] # 재시도 대상 HTTP 코드
여기서 프록시 로테이션을 관리하는 것은 DOWNLOADER_MIDDLEWARES의 rotating_proxies.middlewares.RotatingProxyMiddleware: 610 옵션입니다. 특히 이 옵션은 ROTATING_PROXY_LIST에서 프록시를 선택하여 각 요청에 할당합니다.
또한 rotating_proxies.middlewares.BanDetectionMiddleware: 620 옵션은 스크레이퍼가 대상 웹사이트에 의해 IP가 차단되었는지 감지할 수 있게 합니다. 해당 사유로 요청이 실패할 경우, 미들웨어는 새 프록시로 요청을 재시도합니다. 따라서 이 옵션은 RotatingProxyMiddleware와 긴밀히 연동되어 차단된 프록시가 자동으로 회피되도록 보장합니다.
이제 spiders/ 폴더 내 rotation.py 파일에 다음과 같이 작성할 수 있습니다:
import scrapy
class IpSpider(scrapy.Spider):
name = "ip_spider"
start_urls = ["http://httpbin.io/ip"]
def parse(self, response):
# 응답에서 IP 주소를 추출하여 출력
ip = response.json().get("origin")
self.log(f"IP Address: {ip}")
이 클래스는 전체 스파이더를 인스턴스화하고 각 요청 시 응답을 출력합니다.
4단계: 스크립트 실행
스크립트를 실행하려면 IpSpider() 클래스의 이름인 ip_spider를 사용해야 합니다:
scrapy crawl ip_spider
CLI에서 Scrapy가 반환하는 데이터는 특히 완전합니다. 따라서 모든 것이 정상적으로 진행되었다면, 다른 정보들 사이에 다음과 같은 내용을 확인할 수 있습니다:
2026-02-18 14:55:17 [rotating_proxies.expire] DEBUG: 프록시 <http://PROXY_1:PORT_X> 상태: GOOD
2026-02-18 14:55:17 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://httpbin.io/robots.txt> (referer: None)
2026-02-18 14:55:24 [rotating_proxies.middlewares] INFO: 프록시(양호: 1, 중단: 0, 미확인: 2, 재개: 0, 평균 백오프 시간: 0초)
Python에서 프록시 로테이션에 대한 위 접근법의 한계점
위에서 언급한 프록시 회전 방법은 유용하지만 몇 가지 한계가 있습니다:
- 프록시 목록을 수동으로 가져와 관리해야 합니다.
- 반복적인 코드 작업이 필요합니다.
- 고품질 프록시 서버를 사용하지 않으면 여전히 IP 차단이 발생할 수 있습니다.
파이썬에서 프록시 로테이션을 보다 효율적이고 효과적으로 처리할 방법을 찾고 있다면, Bright Data가 시장에서 가장 우수한 로테이팅 프록시를 제공합니다. 단일 프록시 URL만으로 HTTP 클라이언트나 스크래핑 라이브러리에 통합할 수 있습니다. 이는 반복적인 코드 작성과 수동 로테이션 관리의 필요성을 없애줍니다.
이 접근 방식의 다른 주요 이점은 다음과 같습니다:
- 구성 가능한 고정 IP를 통한 자동 IP 로테이션
- 400M+ monthly백만 개의 주거용 IP 접근
- 프록시 서버 위치에 대한 지리적 위치 제어
- HTTP, HTTPS, SOCKS 프로토콜 지원
프록시 관리를 간소화하세요—자동 회전 프록시를 확인해 보세요!
결론
이 글에서는 Requests, AIOHTTP, Scrapy라는 세 가지 라이브러리를 사용하여 Python에서 프록시를 회전하는 방법을 배웠습니다. 위의 안내 섹션에서 보여준 바와 같이, 이 과정은 복잡하지 않으며 몇 줄의 코드만 있으면 됩니다.
그러나 이 접근 방식에는 몇 가지 단점이 있습니다:
- 코드가 상용구 위주로 구성되어 스크립트의 유지 관리가 어렵습니다.
- 방대한 프록시 서버 목록을 관리하고 접근 권한을 제공해야 합니다.
다행히도 Bright Data의 자동 회전 프록시를 사용하면 이러한 번거로움을 모두 피할 수 있습니다. Python에서 프록시를 회전시키는 보다 효율적인 솔루션입니다.
Bright Data는 포춘 500대 기업 및 20,000명 이상의 고객에게 서비스를 제공하는 세계 최고의 프록시 서버를 관리합니다. 다양한 프록시 유형을 제공합니다:
- 데이터센터 프록시 – 770,000개 이상의 데이터센터 IP.
- 주거용 프록시 – 195개 이상의 국가에서 400M+ monthly개 이상의 주거용 IP.
- ISP 프록시 – 70만 개 이상의 ISP IP 주소.
Bright Data 무료 계정을 지금 생성하여 당사의 프록시 및 스크래핑 솔루션을 테스트해 보세요!