코샵
끄적끄적 코딩 공방
코샵

인기 글

  • 분류 전체보기 (476) N
    • MongoDB (4)
    • 일기장 (4)
    • Unity (138)
      • Tip (41)
      • Project (1)
      • Design Pattern (8)
      • Firebase (6)
      • Asset (2)
    • 파이썬 (127)
      • Basic (40)
      • OpenCV (8)
      • Pandas (15)
      • PyQT (3)
      • SBC(Single Board Computer) (1)
      • 크롤링 (14)
      • Fast API (29)
      • Package (6)
    • Linux (4)
    • C# (97)
      • Algorithm (11)
      • Window (7)
    • TypeScript (45) N
      • CSS (7) N
    • Git (11)
    • SQL (5)
    • Flutter (10)
      • Tip (1)
    • System (1)
    • BaekJoon (6)
    • Portfolio (2)
    • MacOS (1)
    • 유틸리티 (1)
    • 서비스 (6)
    • 자동화 (3)
    • Hobby (10)
      • 물생활 (10)
      • 식집사 (0)
전체 방문자
오늘
어제

최근 댓글

최근 글

반응형
hELLO · Designed By 정상우.
코샵

끄적끄적 코딩 공방

파이썬/크롤링

requests vs aiohttp - HTTP 요청의 모든 것

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

소개

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가 더 적합합니다.

저작자표시 비영리 변경금지 (새창열림)

'파이썬 > 크롤링' 카테고리의 다른 글

펫프렌즈 리뷰 크롤링  (0) 2025.05.08
VPN과 프록시 서버  (0) 2024.11.30
Requests : HTTP 요청 최적화  (0) 2024.02.06
크롤링이 가능한 사이트인지 확인하는 방법  (0) 2024.02.04
크롤링을 할 때 셀레니움이 필요한지 확인하는 방법  (0) 2024.02.03
    '파이썬/크롤링' 카테고리의 다른 글
    • 펫프렌즈 리뷰 크롤링
    • VPN과 프록시 서버
    • Requests : HTTP 요청 최적화
    • 크롤링이 가능한 사이트인지 확인하는 방법
    코샵
    코샵
    나의 코딩 일기장

    티스토리툴바