파이썬 활용: HTTP 통신과 requests 라이브러리
안녕하세요! 여러분의 코딩 길잡이, 재준봇입니다!
자, 오늘은 드디어 파이썬 공부의 꽃이라고 할 수 있는 ‘HTTP 통신’과 그 전설적인 라이브러리 ‘requests’에 대해 배워볼 겁니다. 지금까지는 내 컴퓨터 안에서만 놀았다면, 이제는 드디어 인터넷이라는 거대한 세상으로 나가는 날이에요. 이거 모르면 그냥 파이썬 껍데기만 배운 거나 다름없으니 집중하세요. 진짜 신기하고 재밌는 내용들이 기다리고 있습니다!
21강: 파이썬 활용: HTTP 통신과 requests 라이브러리
여러분, 우리가 매일 하는 행동이 사실 다 HTTP 통신이라는 거 알고 계셨나요? 브라우저 주소창에 naver.com을 치고 엔터를 누르는 순간, 여러분의 컴퓨터는 네이버 서버에 “야, 메인 페이지 좀 줘!”라고 요청을 보냅니다. 그리고 서버는 “어, 여기 있어!”라며 데이터를 보내주죠.
이 과정을 코드로 구현하는 것이 바로 오늘 배울 내용입니다.
1. HTTP 통신, 쉽게 비유해볼까요?
HTTP(HyperText Transfer Protocol)라는 말이 너무 어렵게 느껴지시죠? 그냥 ‘식당에서 주문하는 과정’이라고 생각하세요.
- 클라이언트(나/브라우저): 배고픈 손님입니다. 메뉴판을 보고 음식을 주문하죠.
- 서버(웹사이트): 음식을 만드는 주방입니다. 손님의 주문을 받고 요리를 해서 내어줍니다.
- HTTP 요청(Request): “여기 제육볶음 하나 주세요!”라고 말하는 주문서입니다.
- HTTP 응답(Response): 주방에서 완성되어 나온 제육볶음 접시입니다.
그런데 여기서 문제는, 파이썬 기본 기능만으로 이 주문서를 쓰려고 하면 너무 복잡하고 어렵습니다. 마치 주문서 한 장 쓰는데 논문을 써야 하는 수준이죠. 그래서 우리는 ‘requests’라는 아주 편리한 도구를 사용할 겁니다. 이건 마치 스마트폰의 키오스크 같은 거예요. 버튼 몇 번만 누르면 주문이 끝납니다!
2. requests 라이브러리 설치 및 준비
먼저 이 마법의 도구를 가져와야 합니다. 터미널이나 CMD 창에 다음과 같이 입력하세요.
pip install requests
설치가 끝났다면 이제 우리는 전 세계 어디든 데이터를 요청할 수 있는 무기를 갖게 된 겁니다.
3. 실전! HTTP 요청의 3가지 핵심 방법
HTTP 통신에는 여러 가지 ‘메서드(Method)’가 있습니다. 쉽게 말해 “어떤 종류의 주문을 할 것인가”를 정하는 거예요. 가장 대표적인 3가지를 완벽하게 뜯어보겠습니다.
방법 1: GET 요청 (데이터 가져오기)
GET은 말 그대로 “가져오라”는 뜻입니다. 웹페이지의 내용을 읽어오거나, 검색 결과를 가져올 때 사용합니다.
import requests
# 1. 요청할 주소를 변수에 저장합니다.
url = "https://jsonplaceholder.typicode.com/posts/1"
# 2. requests.get() 함수를 사용해 서버에 데이터를 요청합니다.
response = requests.get(url)
# 3. 응답 결과가 성공(200)인지 확인하고 내용을 출력합니다.
if response.status_code == 200:
print("데이터 가져오기 성공!")
print("내용:", response.text)
else:
print("에러 발생! 상태 코드:", response.status_code)
[코드 뜯어보기]
import requests: requests 라이브러리를 불러옵니다.requests.get(url): 서버에 “이 주소에 있는 데이터 좀 줘!”라고 요청을 보냅니다.response.status_code: 서버가 보낸 응답의 상태 번호입니다. 200번이 나오면 “성공적으로 처리됨”이라는 뜻입니다.response.text: 서버가 보내준 실제 내용(HTML이나 JSON 등)이 들어있습니다.
방법 2: POST 요청 (데이터 보내기)
POST는 “게시하다”라는 뜻입니다. 로그인할 때 아이디/비밀번호를 보내거나, 게시판에 글을 쓸 때 사용합니다. GET과 달리 데이터가 URL에 노출되지 않고 ‘몸통(Body)’에 숨겨져서 갑니다.
import requests
# 1. 데이터를 보낼 주소입니다.
url = "https://jsonplaceholder.typicode.com/posts"
# 2. 서버에 보낼 데이터를 딕셔너리 형태로 만듭니다.
my_data = {
"title": "재준봇의 파이썬 강의",
"body": "HTTP 통신 진짜 쉽네요!",
"userId": 1
}
# 3. requests.post()를 사용하며, json 파라미터로 데이터를 전달합니다.
response = requests.post(url, json=my_data)
# 4. 결과 확인
if response.status_code == 201:
print("글 작성 성공!")
print("서버 응답:", response.json())
else:
print("작성 실패... 상태 코드:", response.status_code)
[코드 뜯어보기]
my_data: 서버로 보낼 정보들을 묶어놓은 딕셔너리입니다.requests.post(url, json=my_data): “이 주소로 이 데이터를 보내서 저장해줘!”라고 요청하는 것입니다.status_code == 201: POST 요청에서 201은 “성공적으로 생성됨(Created)”을 의미합니다. 200보다 더 구체적인 성공 신호죠.response.json(): 서버가 돌려준 응답이 JSON 형식일 때, 이를 파이썬 딕셔너리로 예쁘게 변환해줍니다.
방법 3: PUT 요청 (데이터 수정하기)
PUT은 “놓다”라는 뜻으로, 이미 존재하는 데이터를 수정할 때 사용합니다. 예를 들어 내 프로필 사진이나 닉네임을 바꿀 때 사용하죠.
import requests
# 1. 수정할 데이터가 있는 특정 주소입니다. (1번 게시글 수정)
url = "https://jsonplaceholder.typicode.com/posts/1"
# 2. 수정하고 싶은 새로운 내용입니다.
update_data = {
"id": 1,
"title": "수정된 제목입니다",
"body": "내용을 싹 바꿨어요!",
"userId": 1
}
# 3. requests.put()을 사용하여 데이터를 덮어씁니다.
response = requests.put(url, json=update_data)
# 4. 결과 확인
if response.status_code == 200:
print("수정 완료!")
print("수정된 결과:", response.json())
else:
print("수정 실패!", response.status_code)
[코드 뜯어보기]
url: PUT은 보통 ‘어떤 것을’ 수정할지 정확한 주소(예: /posts/1)가 필요합니다.requests.put(): 기존 데이터를 새로운 데이터로 완전히 교체하라는 명령입니다.response.json(): 서버가 “알겠어, 이렇게 수정됐어”라고 확인시켜주는 데이터를 출력합니다.
4. 응답 상태 코드(Status Code) 완벽 정리
서버는 말을 길게 하지 않습니다. 그냥 숫자 세 자리로 대답하죠. 이거 모르면 코딩하다가 “왜 안 돼?”라고 소리 지르게 됩니다. 딱 이것만 외우세요!
2xx (성공): “오케이! 다 됐어!”
200 OK: 요청 성공.201 Created: 요청 성공했고, 새로운 리소스가 만들어짐 (POST 성공 시).4xx (클라이언트 잘못): “야, 네가 요청을 잘못 보냈잖아!”
400 Bad Request: 요청 구문이 잘못됨.401 Unauthorized: 권한이 없음 (로그인 안 함).403 Forbidden: 금지됨 (접근 권한 없음).404 Not Found: 그런 페이지는 세상에 없어! (주소 오타 확인).5xx (서버 잘못): “미안, 내 서버가 지금 터졌어…”
500 Internal Server Error: 서버 내부 오류.503 Service Unavailable: 서버 과부하로 응답 불가.
💡 초보자 폭풍 질문!
Q: 선생님, GET이랑 POST 둘 다 데이터를 보낼 수 있는데 왜 굳이 나눠서 쓰나요? 그냥 편한 거 쓰면 안 돼요?
A: 재준봇의 답변:
아주 날카로운 질문입니다! 하지만 안 됩니다!
첫째, 보안 때문이에요. GET은 데이터가 URL 주소창에 그대로 다 보입니다. 만약 GET으로 로그인을 한다면 주소창에 .../login?id=admin&pw=1234 이렇게 비밀번호가 다 노출되겠죠? 이건 거의 전 세계에 내 비밀번호를 광고하는 꼴입니다. 반면 POST는 데이터가 숨겨진 몸통(Body)에 실려 가기 때문에 훨씬 안전합니다.
둘째, 용량 때문입니다. URL 주소 길이는 한계가 있어요. 아주 긴 글을 쓰거나 사진을 업로드해야 하는데 GET을 쓴다면? 주소창이 끝도 없이 길어지다가 결국 끊어지겠죠. 그래서 대량의 데이터는 POST를 사용합니다!
⚠️ 실무주의보
“무한 루프로 requests.get()을 돌리지 마세요!”
실무에서 가장 많이 하는 실수 중 하나가 while True 문 안에 요청 코드를 넣고 미친 듯이 서버에 요청을 보내는 겁니다.
어떤 일이 벌어지나요? 서버 입장에서 보면, 갑자기 어떤 미친 사람이 1초에 1,000번씩 “데이터 줘!”라고 외치는 상황입니다. 서버는 이를 ‘디도스(DDoS) 공격’으로 간주하고, 여러분의 IP 주소를 차단(Ban)해버립니다. 그렇게 되면 해당 사이트 접속이 아예 안 되는 불상사가 발생합니다.
해결책:
반드시 time.sleep()을 사용하여 요청 사이에 간격을 두세요. 서버에 대한 예의이자, 내 IP를 지키는 유일한 방법입니다.
마무리하며
자, 오늘 우리는 requests 라이브러리를 통해 인터넷 세상과 소통하는 방법을 배웠습니다. GET(가져오기), POST(보내기), PUT(수정하기) 이 세 가지만 기억한다면, 여러분은 이제 단순한 코더가 아니라 ‘웹 API’를 다루는 개발자로 거듭난 겁니다.
이제 직접 좋아하는 사이트의 API를 찾아보거나, 가짜 API 서버(jsonplaceholder)를 통해 이것저것 테스트해보세요. 직접 부딪혀봐야 진짜 내 것이 됩니다.
오늘 강의가 도움이 되셨다면, 다음 강의에서도 재준봇과 함께 신나게 달려봅시다! 여러분은 생각보다 훨씬 더 똑똑합니다. 화이팅!
<hr>