Python에서 프록시가 필요한 이유
Python은 웹 스크래핑에 가장 인기 있는 언어입니다. requests, BeautifulSoup, Scrapy와 같은 라이브러리로 쉽게 시작할 수 있습니다. 하지만 프록시 없이 대규모 스크래핑을 시도하면 대상 사이트가 IP를 빠르게 차단합니다.
이 가이드에서는 Python에서 프록시를 설정하고 사용하는 모든 방법을 다룹니다 — 기본 requests 설정부터 ProxyHat SDK를 활용한 자동 로테이션까지.
기본 프록시 설정: requests 라이브러리
Python의 requests 라이브러리는 프록시를 기본적으로 지원합니다. proxies 매개변수에 딕셔너리를 전달하면 됩니다:
import requests
proxies = {
"http": "http://user:pass@gate.proxyhat.com:8080",
"https": "http://user:pass@gate.proxyhat.com:8080",
}
response = requests.get("https://example.com", proxies=proxies, timeout=30)
print(response.status_code)
print(response.text[:500])
SOCKS5 프록시 사용
SOCKS5 프록시를 사용하려면 requests[socks] 패키지를 설치해야 합니다:
pip install requests[socks]
import requests
proxies = {
"http": "socks5://user:pass@gate.proxyhat.com:1080",
"https": "socks5://user:pass@gate.proxyhat.com:1080",
}
response = requests.get("https://example.com", proxies=proxies)
print(response.status_code)
ProxyHat Python SDK
ProxyHat Python SDK는 프록시 관리를 추상화하여 코드를 단순화합니다:
from proxyhat import ProxyHat
client = ProxyHat(api_key="your_api_key")
# 로테이팅 레지덴셜 프록시 - 요청마다 새 IP
response = client.get("https://example.com/products", proxy_type="residential")
print(response.status_code)
print(response.text[:500])
# 스티키 세션 - 여러 요청에 동일한 IP 유지
session = client.session(proxy_type="residential", sticky_ttl=300)
page1 = session.get("https://example.com/login")
page2 = session.post("https://example.com/login", data={"user": "test"})
page3 = session.get("https://example.com/dashboard")
프록시 로테이션 구현
프록시 로테이션은 여러 IP를 순환하여 차단을 방지합니다. 다음은 직접 구현하는 방법입니다:
import requests
import random
proxy_list = [
"http://user:pass@gate.proxyhat.com:8080",
"http://user:pass@gate.proxyhat.com:8081",
"http://user:pass@gate.proxyhat.com:8082",
]
def get_random_proxy():
proxy = random.choice(proxy_list)
return {"http": proxy, "https": proxy}
def scrape_with_rotation(url, max_retries=3):
for attempt in range(max_retries):
try:
proxy = get_random_proxy()
response = requests.get(url, proxies=proxy, timeout=30)
if response.status_code == 200:
return response
except requests.exceptions.RequestException:
continue
return None
# 사용 예
result = scrape_with_rotation("https://example.com/products")
if result:
print(result.text[:500])
오류 처리 및 재시도 로직
프록시를 사용한 스크래핑에서는 연결 실패, 타임아웃, 차단이 일반적입니다. 견고한 오류 처리가 필수적입니다:
import requests
from requests.exceptions import ProxyError, ConnectTimeout, ConnectionError
import time
def robust_scrape(url, proxies, max_retries=3, backoff_factor=2):
for attempt in range(max_retries):
try:
response = requests.get(url, proxies=proxies, timeout=30)
if response.status_code == 200:
return response
elif response.status_code == 403:
print(f"차단됨 (시도 {attempt + 1}), 재시도 중...")
time.sleep(backoff_factor ** attempt)
elif response.status_code == 429:
print(f"속도 제한 (시도 {attempt + 1}), 대기 중...")
time.sleep(backoff_factor ** (attempt + 1))
except (ProxyError, ConnectTimeout, ConnectionError) as e:
print(f"연결 오류 (시도 {attempt + 1}): {e}")
time.sleep(backoff_factor ** attempt)
return None
비동기 스크래핑
대량 스크래핑의 경우 비동기 요청이 동기 요청보다 훨씬 빠릅니다. aiohttp를 사용한 비동기 프록시 스크래핑:
import aiohttp
import asyncio
async def fetch(session, url, proxy):
try:
async with session.get(url, proxy=proxy, timeout=aiohttp.ClientTimeout(total=30)) as response:
return await response.text()
except Exception as e:
print(f"오류: {e}")
return None
async def scrape_urls(urls, proxy_url):
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url, proxy_url) for url in urls]
return await asyncio.gather(*tasks)
# 사용 예
urls = [f"https://example.com/product/{i}" for i in range(1, 101)]
proxy = "http://user:pass@gate.proxyhat.com:8080"
results = asyncio.run(scrape_urls(urls, proxy))
Scrapy와 프록시
Scrapy 프레임워크에서 프록시를 사용하는 방법:
# settings.py에 추가
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}
# 미들웨어에서 프록시 설정
class ProxyMiddleware:
def process_request(self, request, spider):
request.meta['proxy'] = "http://user:pass@gate.proxyhat.com:8080"
모범 사례
Python에서 프록시를 사용한 스크래핑의 모범 사례입니다:
- 타임아웃 설정 — 모든 요청에 타임아웃을 설정하여 무한 대기를 방지하십시오. 30초가 좋은 기본값입니다.
- 재시도 로직 — 지수 백오프로 재시도하여 서버에 과부하를 주지 마십시오.
- User-Agent 로테이션 — 프록시 로테이션과 함께 User-Agent 문자열도 로테이션하십시오.
- 세션 관리 — 쿠키가 필요한 사이트에는 requests.Session을 사용하십시오.
- 속도 제한 준수 — 요청 사이에 적절한 지연을 두어 대상 사이트에 부담을 주지 마십시오.
핵심 요약
- Python의 requests 라이브러리는
proxies매개변수로 HTTP/SOCKS5 프록시를 기본 지원합니다.- ProxyHat Python SDK로 자동 로테이션, 세션 관리를 간소화할 수 있습니다.
- 대규모 스크래핑에는 aiohttp를 사용한 비동기 요청이 처리량을 크게 향상시킵니다.
- 견고한 오류 처리와 재시도 로직은 프로덕션 스크래핑에 필수적입니다.
- ProxyHat 게이트웨이:
gate.proxyhat.com, HTTP: 8080, SOCKS5: 1080.
Python 스크래핑을 시작하시겠습니까? ProxyHat 요금제를 확인하고 API 문서로 5분 이내에 첫 프록시 요청을 보내보십시오.






