본문 바로가기
[업무 지식]/Crawling

[NAVER API] 쇼핑인사이트

by 에디터 윤슬 2025. 1. 3.

라이브러리 호출

import requests
import json
import pprint
from dotenv import load_dotenv
import os
import pandas as pd
import matplotlib.pyplot as plt

load_dotenv()

•`requests`:
	•HTTP 요청을 보내기 위한 Python 라이브러리입니다.
	•여기서는 `POST` 요청을 통해 네이버 쇼핑인사이트 API에 데이터를 요청합니다.
•`json`:
	•JSON 형식의 데이터를 다루기 위한 라이브러리입니다.
	•요청 본문(payload)을 JSON으로 변환하거나 응답 데이터를 JSON으로 처리합니다.
•`pprint`:
	•데이터를 사람이 읽기 쉽게 출력하기 위한 라이브러리입니다.
	•JSON 응답 데이터를 보기 좋게 출력할 때 사용됩니다.

 

쇼핑인사이트 분야별 트렌드 조회

NAVER_API_ID = os.getenv('NAVER_API_ID')
NAVER_API_SECRET = os.getenv('NAVER_API_SECRET')

# 쇼핑인사이트 분야별 트렌드 조회
url = "https://openapi.naver.com/v1/datalab/shopping/categories"
header = {
    "X-Naver-Client-Id": NAVER_API_ID,
    "X-Naver-Client-Secret": NAVER_API_SECRET,
    "Content-Type": "application/json"
}
payload = {
    "startDate": "2024-01-01",
    "endDate": "2024-12-31",
    "timeUnit": "week",
    "category": [
        {"name": "가구/인테리어", "param": [ "50000004"]}
    ],
    "device": "",
    "gender": "",
    "ages": []
}
response = requests.post(url = url, headers = header, data = json.dumps(payload))
recode = response.status_code
# 호출에 성공하면 결과 출력, 실패하면 에러 코드 출력
if recode == 200:
    response_data = response.json()
    pprint.pprint(response.json(), indent = 4, sort_dicts=False)
else:
    print("Error Code: " + recode)
    
# JSON 데이터를 데이터프레임으로 변환

rows = []
for result in response_data['results']:
    category = result['title'] # 카테고리 이름
    for data_point in result['data']:
        rows.append({
            'Category': category,
            'Period': data_point['period'],
            'Ratio': data_point['ratio']
        })

df = pd.DataFrame(rows)
print(df)

 

  • 환경 변수에서 API 키 가져오기
NAVER_API_ID = os.getenv('NAVER_API_ID')
NAVER_API_SECRET = os.getenv('NAVER_API_SECRET')

•`os.getenv()`:
	•환경 변수에서 값을 가져오는 함수입니다.
	•`NAVER_API_ID`와 `NAVER_API_SECRET`은 네이버 개발자 센터에서 발급받은 클라이언트 ID와 Secret입니다.
	•이를 코드에 직접 하드코딩하지 않고 환경 변수로 관리하면 보안성이 높아집니다.

 

  • 네이버 쇼핑인사이트 API URL 설정
url = "https://openapi.naver.com/v1/datalab/shopping/categories"

•`url`:
	•네이버 쇼핑인사이트 API의 엔드포인트입니다.
	•이 엔드포인트는 특정 카테고리의 트렌드 데이터를 조회하는 데 사용됩니다.

 

  • 요청 헤더 설정
header = {
    "X-Naver-Client-Id": NAVER_API_ID,
    "X-Naver-Client-Secret": NAVER_API_SECRET,
    "Content-Type": "application/json"
}

•헤더 구성 요소:
	•`"X-Naver-Client-Id"`: 네이버 API 클라이언트 ID.
	•`"X-Naver-Client-Secret"`: 네이버 API 클라이언트 Secret.
	•`"Content-Type": "application/json"`: 요청 데이터가 JSON 형식임을 명시합니다.

 

  • 요청 본문(payload) 설정
payload = {
    "startDate": "2024-01-01",
    "endDate": "2024-12-31",
    "timeUnit": "week",
    "category": [
        {"name": "가구/인테리어", "param": [ "50000004"]}
    ],
    "device": "",
    "gender": "",
    "ages": []
}

필드 설명:
	1.`startDate`:
		•조회 시작 날짜입니다.
		•형식: `"yyyy-mm-dd"`.
		•예: `"2024-01-01"`은 2024년 1월 1일부터 데이터를 조회합니다.
	2.`endDate`:
		•조회 종료 날짜입니다.
		•형식: `"yyyy-mm-dd"`.
		•예: `"2024-12-31"`은 2024년 12월 31일까지 데이터를 조회합니다.
	3.`timeUnit`:
		•데이터의 시간 단위를 지정합니다.
		•가능한 값:
		•`"date"`: 일별 데이터.
		•`"week"`: 주간 데이터.
		•`"month"`: 월간 데이터.
		•여기서는 `"week"`로 설정하여 주간 데이터를 요청합니다.
	4.`category`:
		•조회할 카테고리 목록입니다.
		•각 카테고리는 `name`(카테고리 이름)과 `param`(카테고리 코드)로 구성됩니다.
		•예: `{"name": "가구/인테리어", "param": "50000004"}`는 가구/인테리어 카테고리를 의미합니다.
	5.기타 필드:
		•`device`: 검색 기기(`"pc"`, `"mo"`, 또는 빈 값).
		•`gender`: 성별(`"m"`, `"f"`, 또는 빈 값).
		•`ages`: 연령대(예: ``, 또는 빈 리스트).

 

  • 주요 카테고리와 코드

 

  • POST 요청 보내기
response = requests.post(url=url, headers=header, data=json.dumps(payload))

•`requests.post()`:
	•HTTP POST 요청을 보냅니다.
	•`url`: 요청을 보낼 API 엔드포인트.
	•`headers`: 요청 헤더 정보.
	•`data`: 요청 본문(payload). JSON 형식으로 변환(`json.dumps()`)하여 전송합니다.

 

  • 응답 상태 코드 확인
recode = response.status_code

•`response.status_code`:
	•HTTP 응답 상태 코드를 반환합니다.
	•주요 상태 코드:
	•`200`: 성공(Success).
	•`400`: 잘못된 요청(Bad Request).
	•`401`: 인증 실패(Unauthorized).
	•`405`: 허용되지 않은 메서드(Method Not Allowed).
	•기타 오류 코드는 문제를 나타냅니다.

 

  • 응답 처리 및 출력
if recode == 200:
    response_data = response.json()
    pprint.pprint(response.json(), indent=4, sort_dicts=False)
else:
    print("Error Code: " + recode)


•상태 코드가 `200`이면 JSON 응답 데이터를 출력합니다.
•`response.json()`:
	•응답 데이터를 JSON 형식으로 변환합니다.
•`pprint.pprint()`:
	•JSON 데이터를 사람이 읽기 쉽게 출력합니다.
	•옵션:
		•`indent=4`: 들여쓰기 수준 설정.
		•`sort_dicts=False`: 딕셔너리를 정렬하지 않음.
•상태 코드가 `200`이 아닌 경우, 에러 메시지를 출력합니다.

 

  • JSON 데이터를 데이터프레임으로 변환
rows = []
for result in response_data['results']:
    category = result['title'] # 카테고리 이름
    for data_point in result['data']:
        rows.append({
            'Category': category,
            'Period': data_point['period'],
            'Ratio': data_point['ratio']
        })

df = pd.DataFrame(rows)
print(df)

변환 과정 설명:
	1. 응답 데이터(`response_data`)의 `results` 필드를 순회합니다.
	2. 각 카테고리에 대해 다음 작업을 수행합니다:
	 •`title`: 카테고리 이름 (예: `"가구/인테리어"`).
	 •`data`: 기간별 트렌드 데이터를 포함하는 배열.
	 •각 데이터 포인트에서 `period`(기간)와 `ratio`(비율)를 추출하여 리스트에 추가합니다.
	3. 최종적으로 Pandas DataFrame으로 변환하여 출력합니다.

 

시각화

import matplotlib.pyplot as plt

# 데이터 시각화
plt.figure(figsize=(12, 6))  # 그래프 크기 설정

# 카테고리별로 데이터를 필터링하여 그래프 생성
for category in df['Category'].unique():
    category_data = df[df['Category'] == category]
    plt.plot(category_data['Period'], category_data['Ratio'], marker='o', label=category)

# 그래프 제목 및 축 레이블 설정
plt.title('Shopping Trends Over Time', fontsize=16)
plt.xlabel('Period', fontsize=12)
plt.ylabel('Ratio', fontsize=12)

# 범례 추가 및 기타 설정
plt.legend(title='Category')
plt.grid(True)
plt.xticks(rotation=45)  # X축 레이블 회전
plt.tight_layout()       # 레이아웃 조정

# 그래프 표시
plt.show()