라이브러리 호출
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()
'[업무 지식] > Crawling' 카테고리의 다른 글
[ETL] ETL(Extract, Transform, Load) 프로세스 스케줄링 (1) | 2025.01.03 |
---|---|
[서울시 열린데이터] 서울시 상권분석서비스(소득소비-상권) (0) | 2025.01.03 |
[Selenium] CGV review Crawling (0) | 2025.01.03 |
[ETL] Weather, MySQL 클래스를 객체화 (0) | 2025.01.02 |
[geocode] GeoJSON의 내용을 출력하는 HTML (0) | 2025.01.02 |