학습 기록
Python 공부 기록 #6 - 방구석을 탈출하다! (HTTP 통신과 Requests)
- 목차
인트로: 내 컴퓨터는 너무 외로워
HTTP: 웹이랑 대화하는 언어
Requests 라이브러리: 파이썬 최고의 택배 기사
JSON: 데이터를 주고받는 표준 포맷
아웃트로: 이제 데이터를 수집하러 가자
- 인트로: 내 컴퓨터는 너무 외로워
지금까지 배운 파이썬 코드는 제 노트북 안에서만 작동했습니다.
계산기 만들고, 파일 정리하는 것도 좋지만, 제가 코딩을 배우는 진짜 목적은 ’세상의 데이터를 가져와서 분석하는 것’이거든요.
그러려면 제가 짠 파이썬 코드가 인터넷 세상과 소통해야 하겠죠?
오늘은 그 첫 번째 관문인 HTTP 통신과 파이썬 필수 라이브러리인 requests에 대해 공부한 내용을 정리합니다.
- HTTP: 웹이랑 대화하는 언어
우리가 크롬 브라우저로 네이버에 접속하는 것도 사실 서버랑 대화를 나누는 과정이라고 합니다. 이때 사용하는 규칙이 HTTP입니다.
요청(Request): “야, 네이버 메인 화면 좀 보여줘.” (Client → Server)
응답(Response): “옛다, 여기 HTML 코드다.” (Server → Client)
식당에 비유하면 이렇게 됩니다:
요청: “김치찌개 하나요!” (주문)
응답: 주방에서 김치찌개가 나옴 (결과물)
주로 4가지 방법(Method)으로 대화합니다
GET: “자료 좀 줘” (조회 - 뉴스 기사 보기)
POST: “이거 처리해 줘” (생성 - 로그인, 글쓰기)
PUT/DELETE: 수정/삭제
솔직히 말하면 GET과 POST만 알아도 90%는 해결되더라고요. PUT/DELETE는 나중에 필요할 때 배워도 될 것 같습니다.
상태 코드: 서버의 대답
서버가 응답할 때 “성공했어”, “실패했어”를 숫자로 알려줍니다.
200번대: 성공 (200 OK가 가장 자주 보임)
300번대: 리다이렉션 (다른 곳으로 이동)
400번대: 클라이언트 오류 (404 Not Found - URL 오타 확인하세요!)
500번대: 서버 오류 (내 잘못 아님!)
처음에 404 에러 뜨면 “내가 뭘 잘못했나?” 했는데, 그냥 주소 오타인 경우가 대부분이었습니다.
- Requests 라이브러리: 파이썬 최고의 택배 기사
파이썬에서 HTTP 요청을 아주 쉽게 보내주는 도구가 바로 requests 라이브러리입니다.
얼마나 유명하면 “파이썬을 쓴다면 무조건 쓴다”라고 할까요?
① 실습: 가짜 데이터 가져오기 (GET)
import requests
테스트용 주소로 요청 보내기
url = “https://jsonplaceholder.typicode.com/posts/1”
response = requests.get(url)
상태 코드 확인 (200이면 성공!)
if response.status_code == 200:
print(“성공했습니다!”)
print(response.text) # 가져온 내용 출력
else:
print(“실패…”)
코드 단 3~4줄로 웹사이트의 데이터를 가져왔습니다! 처음 성공했을 때 진짜 신기했어요.
② 실전: GitHub 사용자 정보 가져오기
테스트용 API 말고 진짜 API를 써봤습니다.
import requests
github_url = “https://api.github.com/users/octocat”
response = requests.get(github_url)
if response.status_code == 200:
user_data = response.json()
print(f“사용자명: {user_data[‘login’]}”)
print(f“공개 저장소: {user_data[‘public_repos’]}개”)
print(f“팔로워: {user_data[‘followers’]}명”)
실행하니까 진짜 GitHub 데이터를 가져오더라고요. 이걸로 뭔가 할 수 있을 것 같은 기분이 들었습니다!
③ POST 요청도 해봤습니다
import requests
새로운 게시물 생성 (시뮬레이션)
new_post = {
‘title’: ‘파이썬으로 만든 게시물’,
‘body’: ‘requests 라이브러리 테스트 중입니다.’,
‘userId’: 1
}
post_url = “https://jsonplaceholder.typicode.com/posts”
response = requests.post(post_url, json=new_post)
if response.status_code == 201: # 201 Created
print(“게시물 생성 성공!”)
print(response.json())
POST는 GET보다 살짝 복잡했는데, 몇 번 해보니 익숙해졌습니다.
- JSON: 데이터를 주고받는 표준 포맷
웹에서 데이터를 주고받을 때 가장 많이 쓰는 형식이 JSON입니다. 생긴 게 파이썬의 **딕셔너리(Dictionary)**랑 거의 똑같이 생겨서 다루기가 정말 편합니다.
① JSON과 딕셔너리의 차이
처음에 이게 좀 헷갈렸는데, 이렇게 이해하니 명확해졌습니다:
[Before] 서버에서 받은 JSON (문자열)
print(response.text)
출력: ‘{“title”: “제목”, “userId”: 1}’ ← 따옴표로 감싸진 텍스트
[After] response.json() 후 (딕셔너리)
data = response.json()
print(data[‘title’])
출력: 제목 ← 딕셔너리 키로 바로 접근 가능!
print(type(response.text)) # <class ‘str’>
print(type(data)) # <class ‘dict’>
핵심: response.json() 한 방이면 복잡한 텍스트가 깔끔한 딕셔너리로 변해서, 우리가 배운 키(Key)값으로 바로 데이터를 꺼내 쓸 수 있습니다.
② 실제로 써보기
import requests
url = “https://jsonplaceholder.typicode.com/posts/1”
response = requests.get(url)
JSON을 파이썬 딕셔너리로 변환
data = response.json()
print(f“글 제목: {data[‘title’]}”)
print(f“작성자 ID: {data[‘userId’]}”)
딕셔너리 배울 때 “이거 어디다 쓰지?” 했는데, 여기서 진짜 유용하더라고요!
③ 여러 데이터 가져올 때
posts_url = “https://jsonplaceholder.typicode.com/posts”
posts_response = requests.get(posts_url)
posts = posts_response.json() # 리스트로 받음
print(f“총 게시물 수: {len(posts)}개”)
print(“최신 3개 게시물:”)
for i, post in enumerate(posts[:3]):
print(f“{i+1}. {post[‘title’]}“)
여러 개를 가져올 때는 리스트로 받아서 for문으로 돌리면 됩니다. 지난 시간에 배운 거 여기서 다 쓰이네요!
☑️ 실무 팁: 에러 처리
찾아보니까 실무에서는 이렇게 에러 처리를 한다고 합니다.
import requests
try:
response = requests.get(url, timeout=5) # 5초 제한
if response.status_code == 200:
data = response.json()
print(“성공!”)
elif response.status_code == 404:
print(“페이지를 찾을 수 없습니다.”)
else:
print(f“에러: {response.status_code}”)
except requests.exceptions.Timeout:
print(“시간 초과!”)
except requests.exceptions.RequestException as e:
print(f“요청 실패: {e}”)
timeout 안 쓰면 서버가 느릴 때 무한정 기다리더라고요. 꼭 써야 할 것 같습니다.
- 정리하며
오늘은 파이썬을 인터넷 세계로 연결해 주는 HTTP와 Requests에 대해 정리했습니다.
requests.get()으로 데이터를 요청하고,
response.json()으로 데이터를 해석한다.
이 두 가지만 알면 API를 사용하거나 웹 크롤링을 할 준비가 된 셈입니다.
다음 포스팅에서는 이걸 활용해서 실제 뉴스 기사 제목을 긁어오는 크롤러를 한번 만들어 보겠습니다! (드디어 뭔가 있어 보이는 걸 만드네요)
혹시 설명 중에 틀린 부분이 있거나 더 좋은 팁이 있다면 댓글로 알려주세요! 같이 공부해요. 😊