< 네이버 API >
- 네이버 서비스 API : 각종 네이버 검색, 로그인, 데이터랩 등
- 네이버 검색광고 API : 키워드 도구, 광고 캠페인 관리 등 검색광고 특화
- 네이버 클라우드 API : 지도, 번역, 문자 인식, 음성 인식, 음성 합성 등 최신 서비스
< 외부 패키지 설치 >
pip install -U datakart pandas streamlit tqdm
- datakart(데이터 수집), pandas(데이터 분석), streamlit(웹 앱), tqdm(진행 표시줄)
- 검색, 데이터랩(검색어트렌드, 쇼핑인사이트) API
선택해서 키를 생성한다.
< 네이버 쇼핑 상품 검색 함수 >
import json
from pathlib import Path
from datakart import Naver
from step_1_1 import OUT_DIR
def query_naver_shop( query : str, display : int = 1 ) -> dict :
NAVER_KEY = " " # Cient ID
NAVER_SEC = " " # Client Secret
naver = Naver( NAVER_KEY, NAVER_SEC )
return naver.shop( query = query, display = display )
if __name__ == "__main__" :
query = "월드컵" # 검색 키워드
resp = query_naver_shop(query) # 네이버 쇼핑 상품 검색
with open( OUT_DIR / f"{Path(__file__).stem}.json", "w", encoding = "utf-8") as fp :
json.dump( resp, fp, ensure_ascii = False, indent = 2 ) # JSON 으로 저장
- “월드컵” 키워드로 등록된 상품 정보들을 아래 json 파일로 얻을 수 있다.
{
"lastBuildDate": "Fri, 10 Jul 2026 17:14:10 +0900",
"total": 296906,
"start": 1,
"display": 1,
"items": [
{
"title": "월드컵 기어2 남성 여성 다이얼 신발 운동화 러닝화 워킹화 조깅화 헬스화 트레킹화 등산화",
"link": "<https://smartstore.naver.com/main/products/7382530568>",
"image": "<https://shopping-phinf.pstatic.net/main_8492703/84927030890.5.jpg>",
"lprice": "46000",
"hprice": "",
"mallName": "월드컵공식몰",
"productId": "84927030890",
"productType": "2",
"brand": "월드컵",
"maker": "엘유티",
"category1": "패션잡화",
"category2": "남성신발",
"category3": "스니커즈/운동화",
"category4": "러닝화"
}
]
}
- total : 296906 개의 상품이 등록되어 있고,
- items : 리스트로 상품 상세 정보가 저장되어 있다.
< 연관 키워드 검색하기 >
- 네이버 검색광고 API 를 사용하여 주어진 키워드에 대한 연관 키워드 검색을 할 수 있다.
네이버 검색광고 API 는 여기에서 받을 수 있음.
import json
from pathlib import Path
from datakart import NaverAd
from step_1_1 import OUT_DIR
def query_keywords_tool( keywords : str, event : int = None ) -> list :
AD_KEY = "" # 엑세스 라이선스
AD_SEC = " " # 비밀키
AD_CUST_ID = " " # customer id
naver_ad = NaverAd( AD_KEY, AD_SEC, AD_CUST_ID )
resp = naver_ad.keywords_tool( keywords = keywords, event = event, show_detail = True )
return resp.get("keywordList", [])
if __name__ == "__main__" :
keywords = "월드컵" # 검색 키워드
resp = query_keywords_tool( keywords )
with open ( OUT_DIR / f"{Path(__file__).stem}.json", "w", encoding = "utf-8") as fp :
json.dump( resp, fp, ensure_ascii = False, indent = 2 )
- 월드컵 키워드로 연관 키워드, Pc/모바일 환경에서 각각 월간 검색 수, 평균 클릭수, 클릭률, 노출 광고 수 등 여러가지 데이터를 뽑아낼 수 있다!
[
{
"relKeyword": "월드컵",
"monthlyPcQcCnt": 4943600,
"monthlyMobileQcCnt": 18546200,
"plAvgDepth": 4,
"compIdx": "중간",
"monthlyAvePcClkCnt": 52.3,
"monthlyAveMobileClkCnt": 783.6,
"monthlyAvePcCtr": 0.01,
"monthlyAveMobileCtr": 0.01
},
{
"relKeyword": "월드컵운동화",
"monthlyPcQcCnt": 570,
"monthlyMobileQcCnt": 2360,
"plAvgDepth": 8,
"compIdx": "중간",
"monthlyAvePcClkCnt": 20.1,
"monthlyAveMobileClkCnt": 87.8,
"monthlyAvePcCtr": 3.65,
"monthlyAveMobileCtr": 3.83
},
{
"relKeyword": "축구",
"monthlyPcQcCnt": 1374700,
"monthlyMobileQcCnt": 5559900,
"plAvgDepth": 3,
"compIdx": "높음",
"monthlyAvePcClkCnt": 6.7,
"monthlyAveMobileClkCnt": 120.3,
"monthlyAvePcCtr": 0.01,
"monthlyAveMobileCtr": 0.01
},
# ...
# 더 있었는데, 너무 길어지는 관계로 블로그에서는 생략하겠읍니다
]
- monthlyPc(Mobile)QcCnt 로 월간 검색수를 볼 수 있다.
- montlyAveClkCtr로 월 평균 클릭률을 볼 수 있다.
확실히 월드컵 시즌이라 월드컵, 축구 검색수가 엄청나다. ‘월드컵’ 키워드로 PC와 모바일 검색수만 단순하게 합치면 2천만이 훨씬 넘어간다.
좀 특이한 점이 있다. ‘월드컵’ 자체의 검색량은 매우 큰데, 클릭률은 PC 와 모바일 모두 0.01로 매우 낮았다. 이건 상품검색에서 얻은 데이터이기 때문에 그럴 가능성이 있다. 단순히 상품이 아니라 ‘월드컵’으로 검색했다는 건 상품 구매보다는 정보 탐색에 목적을 뒀을 가능성이 더 클 것이기 때문에. 구매로 연결되기에는 검색 의도가 너무 넓다는 것이다.
반면에, ‘월드컵 운동화’ 자체 검색량은 적지만 클릭률은 PC 와 모바일 모두 높은 편이다. ‘운동화’로 타겟해서 검색한 것이 더 구매 의도가 있는 사용자의 검색 방식일 것이다.
생각보다 결과도 정직하게(?) 나오고.. 실제로 이런 데이터를 볼 수 있는게 신기하다.
< 연관 키워드 경쟁 강도 분석하기 >
키워드 경쟁 강도
- 어떤 상품의 수요와 공급을 비율로 표시한 것.
- 네이버쇼핑에서 검색횟수를 수요로 보고 상품 개수를 공급으로 본다.
- 경쟁강도 = 상품개수(공급) / 검색횟수(수요)
< 먼저, 연관키워드 데이터를 CSV로 저장 >
from pathlib import Path
import pandas as pd
from step_1_1 import OUT_DIR
from step_1_3 import query_keywords_tool
OUT_2_1 = OUT_DIR / f"{Path(__file__).stem}.csv"
def rel_kwd_to_csv( keywords : str = None, event : int = None ) :
resp = query_keywords_tool( keywords=keywords, event=event )
df_raw = pd.DataFrame(resp)
df_raw.columns = [
"키워드",
"검색수PC",
"검색수M",
"광고수",
"경쟁정도",
"클릭수PC",
"클릭수M",
"클릭률PC",
"클릭률M",
]
df_raw.to_csv(OUT_2_1, index = False)
if __name__ == "__main__" :
rel_kwd_to_csv("나이키")
- “나이키” 키워드에 대한 연관 키워드 데이터를 저장한 CSV 파일을 생성한다.
- 결과는 아래.
키워드,검색수PC,검색수M,광고수,경쟁정도,클릭수PC,클릭수M,클릭률PC,클릭률M
나이키,202400,652800,10,높음,160.7,2397.6,0.09,0.4
나이키런닝화,7840,51100,10,높음,37.1,930.4,0.51,1.96
슈마커나이키,< 10,40,7,중간,0.0,0.3,0.0,0.63
나이키온라인,680,600,10,높음,40.4,87.8,6.3,15.3
나이키스토어,450,1200,10,높음,24.4,153.0,5.69,13.71
나이키몰,390,1240,10,높음,23.5,171.6,6.24,14.99
나이키마노아레더,20,230,7,중간,0.9,6.3,4.26,2.78
TC7900,70,330,10,높음,2.0,14.3,2.94,4.75
자라세일,34500,260000,5,중간,148.6,2223.7,0.44,0.88
나이키플렉스러너,110,1220,8,높음,1.4,35.3,1.23,3.04
나이키공식홈페이지,440,3400,10,높음,23.5,503.6,5.53,15.9
나이키정품,20,170,10,높음,1.2,13.0,4.14,8.08
...
# 너무 길어서 생략
< 연관 키워드 데이터 정제하기 >
- 위 결과는 생략한 결과이지만, 실제로는 1200줄의 연관 키워드 데이터가 저장되었다.
- 검색수가 10건 미만이면 문자열 “ < 10 “ 으로 표현된다.
- 검색수가 숫자로만 구성된 것이 아니고 이처럼 문자가 섞여있어 데이터 분석이 어려우므로
- 검색수가 10 미만인 = 즉, 검색수에 문자열이 포함된 행을 삭제한다.
- 또, 모바일 검색수가 최소 1만건 + 클릭률 최소 1% 이상인 데이터만 필터링한다.
from pathlib import Path
import pandas as pd
from step_1_1 import OUT_DIR
from step_2_1 import OUT_2_1
OUT_2_2 = OUT_DIR / f"{Path(__file__).stem}.csv"
def data_cleaning() :
df_raw = pd.read_csv(OUT_2_1, dtype = "string")
f_pc_cnt = df_raw["검색수PC"].str.contains("<") # PC 검색수에 문자열 < 포함여부
f_mo_cnt = df_raw["검색수M"].str.contains("<") # 모바일 검색수에 문자열 < 포함여부
df_sliced = df_raw.loc[(~f_pc_cnt) & (~f_mo_cnt)]
df_sliced = df_sliced.astype({"검색수M" : int, "클릭률M" : float})
f_mo_cnt_cond = df_sliced["검색수M"] >= 10_000 # 검색수 조건
f_mo_rate_cond = df_sliced["클릭률M"] >= 1.0 # 클릭률 조건
df_cond = df_sliced.loc[(f_mo_cnt_cond) & (f_mo_rate_cond)]
df_sorted = df_cond.sort_values(["검색수M"], ascending=[False])
df_sorted.to_csv(OUT_2_2, index = False)
if __name__ == "__main__" :
data_cleaning()
이렇게 하면 ..

- 기준에 따라 정제되어 약 30건의 유의미한 데이터만 남는다
'짧은 호흡 > Python' 카테고리의 다른 글
| [파이썬] Ch.13 (1) gemma2로 챗봇 웹 앱 만들기 (0) | 2026.07.13 |
|---|---|
| [파이썬] Ch.8 (2) 키워드별 경쟁강도 분석 웹 앱 (0) | 2026.07.10 |
| [파이썬] Ch.5 (2) 광학 문자 인식 + DeepL API 번역 (0) | 2026.07.07 |
| [파이썬] Ch.5 (1) 광학 문자 인식 + 웹 앱 만들기 (0) | 2026.07.04 |
| [파이썬] Ch.2 데이터 프레임 + matplotlib 시각화 (0) | 2026.07.02 |
