[파이썬] Ch.8 (1) 쇼핑 키워드 데이터 수집 + 정제

2026. 7. 9. 12:23·짧은 호흡/Python

< 네이버 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
'짧은 호흡/Python' 카테고리의 다른 글
  • [파이썬] Ch.13 (1) gemma2로 챗봇 웹 앱 만들기
  • [파이썬] Ch.8 (2) 키워드별 경쟁강도 분석 웹 앱
  • [파이썬] Ch.5 (2) 광학 문자 인식 + DeepL API 번역
  • [파이썬] Ch.5 (1) 광학 문자 인식 + 웹 앱 만들기
jiwoo.lee
jiwoo.lee
jiwoo 님의 블로그 입니다.
  • jiwoo.lee
    jiwoo.lee
    jiwoo.lee
  • 전체
    오늘
    어제
    • 분류 전체보기 (9)
      • 이야기 (0)
      • 긴 호흡 (0)
      • 짧은 호흡 (9)
        • Python (8)
        • Git (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
jiwoo.lee
[파이썬] Ch.8 (1) 쇼핑 키워드 데이터 수집 + 정제
상단으로

티스토리툴바