데이터분석 6기/본캠프

2025-05-22 API

seyeon1130 2025. 5. 22. 21:06

HTTP

GET함수: 데이터 가져올 때 사용

 

헤더 필드

 

HTTP 응답

200번대: 정상

400번대: 클라이언트 측 문제

500번대: 서버 문제

 

 

REST API :자원을 URL로 표현, HTTP로 자원의 행위를 정의(그냥 규칙이라고 보면 됨)

 

URL 구성 요소

  • 프로토콜(Scheme): 통신 규칙
  • 호스트(Host): 도메인 이름 또는 IP 주소
  • 포트(Port): 서비스 접속 번호 (생략 가능, HTTP는 80, HTTPS는 443)
  • 경로(Path): 자원의 위치를 나타내는 문자열
  • 쿼리 스트링(Query String): 자원에 대한 추가 정보 (필터링, 검색어 등)

 

API 사용

 

import urllib.request
import urllib.parse

client_id = "너의_네이버_Client_ID_여기에"  # 네이버 개발자센터에서 발급받은 Client ID
client_secret = "너의_네이버_Client_Secret_여기에"  # 네이버 개발자센터에서 발급받은 Client Secret

encText = urllib.parse.quote("인공지능")  # 검색어 '인공지능'을 URL 인코딩 (UTF-8)해서 안전하게 만들어줘
url = "https://openapi.naver.com/v1/search/blog?query=" + encText  # 블로그 검색 API의 기본 주소에 쿼리 붙이기

# XML 결과로 받고 싶다면 아래 주석 해제하고 위 줄은 주석 처리해도 됨
# url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText

request = urllib.request.Request(url)  # URL로 요청(Request) 객체 생성
request.add_header("X-Naver-Client-Id", client_id)  # 인증을 위해 Client ID 헤더에 추가
request.add_header("X-Naver-Client-Secret", client_secret)  # 인증을 위해 Client Secret도 헤더에 추가

response = urllib.request.urlopen(request)  # 요청 보내고 응답 받아오기
rescode = response.getcode()  # 응답 상태 코드(예: 200, 401 등) 확인

if rescode == 200:  # 응답이 성공(200)일 때
    response_body = response.read()  # 응답 본문을 바이트로 읽고
    print(response_body.decode('utf-8'))  # UTF-8로 디코딩해서 출력!
else:  # 응답이 실패했을 때
    print("Error Code:" + str(rescode))  # 오류 코드 출력

이런식으로 코드 짜면 응답 받아서 JSON 형식으로 출력되는데 이걸 예쁘게 다듬으려면

# requests 라이브러리 임포트
import requests
from urllib.parse import quote

# 검색어 설정
search_query = "인공지능"

# API 기본 URL
base_url = "https://openapi.naver.com/v1/search/blog"

# API 요청 헤더 설정
headers = {
    "X-Naver-Client-Id": client_id,
    "X-Naver-Client-Secret": client_secret
}

# API 요청 파라미터 설정
params = {
    "query": search_query,     # 검색어
    "display": 10,             # 검색 결과 출력 건수 (기본값: 10, 최대: 100)
    "start": 1,                # 검색 시작 위치 (기본값: 1, 최대: 1000)
    "sort": "sim"              # 정렬 방식 - sim: 정확도순, date: 날짜순
}


# GET 요청 보내기 (params 딕셔너리 사용)
response = requests.get( # 한글 자동으로 UTF-8인코딩 함
    base_url,
    headers=headers,
    params=params
)

# 응답 상태 코드 확인 및 결과 출력
if response.status_code == 200:
    # JSON 형식으로 응답 데이터 파싱
    result = response.json()
    print(result)
        
    # 전체 검색 결과 수 출력
    print(f"총 검색 결과: {result['total']} 건")
    print(f"현재 페이지: {params['start']} / {result['total']}")
    print("-" * 50)
    
    # 검색 결과 출력
    for item in result.get('items', []):
        print(f"제목: {item['title']}")
        print(f"블로거: {item['bloggername']}")
        print(f"작성일: {item['postdate']}")
        print(f"링크: {item['link']}")
        print(f"설명: {item['description']}")
        print("-" * 50)
else:
    # 에러 발생시 상태 코드와 에러 메시지 출력
    print(f"Error Code: {response.status_code}")
    print(f"Error Message: {response.text}")

이렇게 이쁘게 출력 가능함

 

크롤링

 

개발자 모드에서 원하는 요소 클릭해서 보면 됨.

그 중 네트워크를 사용하면 사용자 로그까지 볼 수 있다.

 

'데이터분석 6기 > 본캠프' 카테고리의 다른 글

2025-05-24 정적 크롤링 과제  (0) 2025.05.24
2025-05-23 크롤링  (1) 2025.05.23
2025-05-21 태블로 메뉴 만들기  (0) 2025.05.21
2025-05-21 API KEY 등록  (1) 2025.05.21
2025-05-20 실전 프로젝트 PPT제작  (0) 2025.05.20