파이썬/크롤링

requests vs aiohttp - HTTP 요청의 모든 것

코샵 2025. 1. 11. 10:35
반응형

소개

Python에서 HTTP 요청을 처리할 때 가장 많이 사용되는 두 라이브러리인 requestsaiohttp의 매개변수와 사용법을 자세히 비교해보겠습니다.

설치 방법

# 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]

마치며

requestsaiohttp는 각각의 장단점이 있습니다. 단순한 HTTP 요청에는 requests가 더 직관적이고, 다중 요청이나 고성능이 필요한 경우에는 aiohttp가 더 적합합니다.