파이썬 requests 사용법
외부 패키지 첫 정식. 한 줄로 API 호출, 두 줄로 JSON 파싱.
표준 라이브러리에도 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 가 진화한 모습.
← 19편 "collections·itertools" · 다음: 21편 "pandas 기초"