반응형
소개
Python에서 HTTP 요청을 처리할 때 가장 많이 사용되는 두 라이브러리인 requests
와 aiohttp
의 매개변수와 사용법을 자세히 비교해보겠습니다.
설치 방법
# requests 설치
pip install requests
# aiohttp 설치
pip install aiohttp
requests 라이브러리의 주요 매개변수
GET 요청
import requests
response = requests.get(
url="https://api.example.com/data",
params={'key': 'value'}, # URL 쿼리 파라미터
headers={'Authorization': 'Bearer token'}, # 요청 헤더
cookies={'session': 'abc123'}, # 쿠키
timeout=5, # 요청 타임아웃 (초)
verify=True, # SSL 인증서 검증
proxies={ # 프록시 설정
'http': 'http://proxy.example.com:8080',
'https': 'http://proxy.example.com:8080'
},
allow_redirects=True, # 리다이렉트 허용
)
POST 요청
response = requests.post(
url="https://api.example.com/data",
json={'key': 'value'}, # JSON 형식 데이터
data={'key': 'value'}, # Form 데이터
files={ # 파일 업로드
'file': open('example.txt', 'rb')
},
auth=('username', 'password'), # 기본 인증
cert=('cert.pem', 'key.pem'), # 클라이언트 인증서
)
requests 매개변수 상세 설명
매개변수 | 설명 | 예시 |
---|---|---|
params | URL 쿼리 파라미터 | params={'q': 'search', 'page': 1} |
json | JSON 형식 요청 본문 | json={'name': 'John', 'age': 30} |
data | Form 데이터 | data={'username': 'john'} |
headers | HTTP 헤더 | headers={'User-Agent': 'Mozilla/5.0'} |
verify | SSL 인증서 검증 | verify=False # 보안주의 |
proxies | 프록시 서버 설정 | proxies={'http': 'http://proxy:8080'} |
aiohttp 라이브러리 사용법
기본 사용법
import aiohttp
import asyncio
async def fetch_data():
async with aiohttp.ClientSession() as session:
async with session.get('https://api.example.com/data') as response:
return await response.json()
# 실행
asyncio.run(fetch_data())
상세 매개변수 사용
async def advanced_fetch():
async with aiohttp.ClientSession() as session:
async with session.post(
url='https://api.example.com/data',
json={'key': 'value'}, # JSON 데이터
params={'query': 'search'}, # 쿼리 파라미터
headers={'Authorization': 'Bearer token'},
proxy='http://proxy.example.com:8080', # 프록시 (단일)
ssl=False, # SSL 검증 비활성화
timeout=aiohttp.ClientTimeout(total=30), # 타임아웃
) as response:
return await response.json()
requests와 aiohttp의 주요 차이점
1. 세션 관리
# requests - 자동 세션 관리
requests.get('https://api.example.com')
# aiohttp - 명시적 세션 관리
async with aiohttp.ClientSession() as session:
async with session.get('https://api.example.com') as response:
data = await response.json()
2. 프록시 설정
# requests - 딕셔너리로 프로토콜별 설정
requests.get('https://api.example.com', proxies={
'http': 'http://proxy:8080',
'https': 'http://proxy:8080'
})
# aiohttp - 단일 프록시 문자열
await session.get('https://api.example.com', proxy='http://proxy:8080')
3. 타임아웃 설정
# requests - 숫자 값으로 간단 설정
requests.get('https://api.example.com', timeout=5)
# aiohttp - 상세 타임아웃 설정
timeout = aiohttp.ClientTimeout(
total=300, # 전체 작업 시간
connect=60, # 연결 수립 시간
sock_read=60, # 소켓 읽기 시간
sock_connect=60 # 소켓 연결 시간
)
await session.get('https://api.example.com', timeout=timeout)
비동기 요청 처리 예제
다중 요청 처리
async def fetch_all():
async with aiohttp.ClientSession() as session:
tasks = []
urls = [
'https://api.example.com/1',
'https://api.example.com/2',
'https://api.example.com/3'
]
for url in urls:
tasks.append(session.get(url))
responses = await asyncio.gather(*tasks)
return [await r.json() for r in responses]
에러 처리
async def safe_fetch(url):
try:
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
if response.status == 200:
return await response.json()
return None
except aiohttp.ClientError as e:
print(f"Error fetching {url}: {e}")
return None
성능 비교
# requests - 동기 처리
def sync_requests():
urls = ['https://api.example.com/1', 'https://api.example.com/2']
return [requests.get(url).json() for url in urls]
# aiohttp - 비동기 처리
async def async_requests():
urls = ['https://api.example.com/1', 'https://api.example.com/2']
async with aiohttp.ClientSession() as session:
tasks = [session.get(url) for url in urls]
responses = await asyncio.gather(*tasks)
return [await r.json() for r in responses]
마치며
requests
와 aiohttp
는 각각의 장단점이 있습니다. 단순한 HTTP 요청에는 requests
가 더 직관적이고, 다중 요청이나 고성능이 필요한 경우에는 aiohttp
가 더 적합합니다.
'파이썬 > 크롤링' 카테고리의 다른 글
VPN과 프록시 서버 (0) | 2024.11.30 |
---|---|
Requests : HTTP 요청 최적화 (0) | 2024.02.06 |
크롤링이 가능한 사이트인지 확인하는 방법 (0) | 2024.02.04 |
크롤링을 할 때 셀레니움이 필요한지 확인하는 방법 (0) | 2024.02.03 |
Selenium 4.1.0에서 headless 설정 변경 (0) | 2024.02.01 |