파이썬 교재 · 20편 / 27편

파이썬 requests 사용법

외부 패키지 첫 정식. 한 줄로 API 호출, 두 줄로 JSON 파싱.

중급읽는 시간 7분2026-05-13
requests.get GitHub API 호출과 응답 파싱 코드 화면

표준 라이브러리에도 urllib 으로 HTTP 호출이 가능하지만 모든 입문서·튜토리얼·실무 코드가 requests 를 씁니다. 사용성 차이가 너무 커서요. urllib 으로 8줄 짜야 할 호출이 requests 로는 1-2줄. 1991년 이래 가장 다운로드된 파이썬 패키지이고, 첫 외부 패키지 학습은 거의 항상 이거.

20편을 마치면 ① GET·POST 기본 ② 쿼리 파라미터·헤더 ③ JSON 송수신 ④ 타임아웃·에러 처리 ⑤ Session·인증·재시도 — 5가지가 손에 익습니다.

설치와 첫 호출

# venv 활성화 상태에서
(.venv) $ pip install requests

import requests

r = requests.get("https://api.github.com")
r.status_code      # 200
r.headers["content-type"]   # 'application/json; charset=utf-8'
r.text             # '{"current_user_url":"https://api.github.com/user", ...}'
r.json()           # 파싱된 dict

requests.get(URL) 한 줄이 끝. 결과인 Response 객체에서 상태 코드(.status_code), 본문 텍스트(.text), JSON 파싱(.json()), 헤더(.headers)를 꺼냅니다.

쿼리 파라미터·헤더 — params·headers

# ❌ 직접 문자열 합치기 — 인코딩 함정·읽기 어려움
url = "https://api.example.com/search?q=python&page=2"

# ✅ params 딕셔너리로
r = requests.get("https://api.example.com/search",
                 params={"q": "python", "page": 2, "limit": 50})
r.url            # 자동 인코딩된 최종 URL

# 헤더 추가 — User-Agent·Authorization 등
r = requests.get("https://api.github.com/user",
                 headers={
                     "Authorization": "Bearer ghp_xxxxx",
                     "Accept": "application/vnd.github+json",
                 })

params 의 값은 자동으로 URL 인코딩됩니다. 한글·공백·특수문자 걱정 없이 그냥 적으면 돼요.

POST·JSON 송수신

# JSON 본문으로 POST
r = requests.post(
    "https://httpbin.org/post",
    json={"name": "준성", "age": 30},   # json= 쓰면 자동 직렬화 + Content-Type 헤더
    timeout=10,
)
data = r.json()
print(data["json"])    # {'name': '준성', 'age': 30}

# 폼 데이터 (application/x-www-form-urlencoded)
requests.post(url, data={"username": "u", "password": "p"})

# 파일 업로드 (multipart)
with open("photo.jpg", "rb") as f:
    requests.post(url, files={"image": f})

json=data= 의 차이가 입문자 1번 실수. JSON API 라면 거의 항상 json= — 자동 직렬화 + Content-Type 헤더까지.

타임아웃·에러 처리 — 안전한 호출

⚠️ timeout 없는 requests 호출은 절대 금지. 기본값이 무한 대기라서 외부 서버가 멈추면 본인 스크립트도 무한 대기. 자동화 스크립트가 24시간 매달려있는 사고가 매우 흔합니다. timeout=10 한 줄로 방어.
try:
    r = requests.get("https://api.example.com/users",
                     timeout=10,
                     params={"q": "python"})
    r.raise_for_status()   # 4xx·5xx 면 HTTPError 발생
    data = r.json()
except requests.Timeout:
    print("응답 지연 — 10초 초과")
except requests.HTTPError as e:
    print(f"HTTP 에러: {e.response.status_code}")
except requests.RequestException as e:
    print(f"네트워크 문제: {e}")    # 부모 예외 — 모든 requests 예외

raise_for_status() 한 줄이 200 외 응답을 즉시 예외로 바꿉니다. 12편의 try/except 가 여기서 빛납니다.

Session·인증·재시도 + 마무리

Session — 같은 호스트 여러 호출

with requests.Session() as s:
    s.headers.update({"Authorization": "Bearer xxx"})
    s.timeout = 10

    r1 = s.get("https://api.github.com/user")
    r2 = s.get("https://api.github.com/user/repos")
    # 같은 TCP 연결을 재사용 — 5-10배 빠름

API 를 여러 번 호출할 거면 Session 으로 묶으세요. 헤더·인증·쿠키가 자동 공유되고 연결도 재사용. 짧은 스크립트는 그냥 requests.get 으로 충분.

인증의 4가지 방식

# 1) Bearer 토큰 (가장 흔함)
headers={"Authorization": "Bearer ghp_xxxxx"}

# 2) Basic Auth
requests.get(url, auth=("user", "pass"))

# 3) 쿼리 파라미터 (옛 API)
params={"api_key": "xxxxx"}

# 4) 커스텀 헤더
headers={"X-API-Key": "xxxxx"}

📌 API 키는 절대 코드에 직접 박지 마세요

환경 변수 또는 .env 파일에. import os; key = os.environ["API_KEY"] 또는 python-dotenv 패키지. 깃에 키가 올라가는 사고는 한 시간 안에 GitHub 봇이 발견해 악용합니다.

다음 미션: ① https://api.github.com/users/<본인> 호출해 팔로워 수 출력 ② 환율 API(예: exchangerate.host) 로 USD→KRW 변환 함수 ③ 에러 처리 다 포함한 함수 만들어 timeout·HTTPError 케이스 시뮬레이트.

다음 편 미리보기

21편 — "파이썬 pandas 기초": 데이터 분석의 시작. DataFrame·CSV 읽기·필터·그룹화. 5편 list 가 진화한 모습.

📚 27편 파이썬 교재 시리즈 — 20/27편
← 19편 "collections·itertools" · 다음: 21편 "pandas 기초"

© 2026 주나이테크(주) @JUNAITECH