네이버 데이터랩 쇼핑인사이트 인기검색어 크롤링: AI와 함께하는 ‘바이브 코딩’
오늘은 네이버 데이터랩 쇼핑인사이트 인기검색어를 가져오는 프로그램을 만들어보겠습니다. 이거 왜 하는 걸까요? 작년 이맘때 인기 있었던 상품의 키워드를 보면 올해도 뭐가 유행할 것 같다는 감을 잡을 수 있습니다. 선제적으로 해당 키워드를 이용해서 블로그, 유튜브, SNS에 제품 정보를 남기면 다양한 방법으로 수익화할 수 있기 때문이죠. 오늘도 역시 ‘바이브 코딩’으로 진행하겠습니다. 먼저 네이버 데이터랩을 한번 보고 올게요. […]
오늘은 네이버 데이터랩 쇼핑인사이트 인기검색어를 가져오는 프로그램을 만들어보겠습니다. 이거 왜 하는 걸까요?
작년 이맘때 인기 있었던 상품의 키워드를 보면 올해도 뭐가 유행할 것 같다는 감을 잡을 수 있습니다. 선제적으로 해당 키워드를 이용해서 블로그, 유튜브, SNS에 제품 정보를 남기면 다양한 방법으로 수익화할 수 있기 때문이죠.
오늘도 역시 ‘바이브 코딩’으로 진행하겠습니다. 먼저 네이버 데이터랩을 한번 보고 올게요. 포털에서 “네이버 데이터랩”을 검색한 뒤 [쇼핑인사이트]를 클릭하세요.
네이버 데이터랩 쇼핑인사이트 인기검색어 크롤링
1. 데이터 위치 파악하기
쇼핑인사이트 페이지에서 분야, 기간, 성별, 연령 등 옵션을 선택하고 [조회하기]를 클릭하면 인기 검색어가 나옵니다. 총 500개의 데이터가 나오고, 한 페이지에 20개씩 총 25개 페이지로 구성되어 있습니다.
오늘 제가 해볼 것은 분야와 기간만 선택해서 첫 번째 페이지의 인기 검색어 20개를 자동으로 가져오는 프로그램을 만드는 것입니다.
2. 개발자 도구로 사이트 구조 파악 (AI에게 줄 재료)
AI에게 정확한 코드를 부탁하려면 사이트의 ‘설계도’를 전해줘야 합니다.
- 키보드에서 F12를 눌러 개발자 도구로 들어갑니다.
- 상단의 Elements 탭을 클릭합니다.
- 코드 시작 부분의
<html lang="ko">를 클릭한 후 마우스 오른쪽 버튼 → [Copy] → [Copy element]를 클릭합니다. - 메모장에 붙여넣고
네이버데이터랩구조.txt라는 이름으로 저장하세요.
3. AI와 함께하는 ‘바이브 코딩’
이제 AI(제미나이 등)에게 다음과 같이 요청합니다.
“네이버 데이터랩 쇼핑인사이트 인기검색어를 크롤링하려고 해. 카테고리를 선택하고 기간을 입력하면 해당 기간의 인기검색어를 수집하는 코드를 짜줘. 구조는 첨부한 파일에 있어.”
저는 미리 해봤기 때문에 정말 여러 번 AI와 피드백을 주고받으며 코드를 완성했습니다. 여러분도 먼저 직접 해보시고 이 결과를 비교해 보셨으면 좋겠습니다.
4. 코드 분석: 왜 이렇게 짰을까?
수많은 에러를 거쳐 완성된 핵심 로직을 설명해 드릴게요.
- 카테고리 메뉴 자동 생성: 사용자가 번호를 눌러 선택할 수 있게 카테고리 목록을 미리 입력해 두었습니다.
- 스마트 클릭 (smart_click): 일반적인 클릭 명령이 안 먹힐 때가 있습니다. 이럴 때 자바스크립트로 브라우저에 직접 명령을 내려 강제로 클릭하게 만들었습니다.
- 날짜 영역 고정 (Scoping): 시작 날짜와 종료 날짜의 코드가 너무 비슷해서 생기는 ‘날짜 꼬임’ 문제를 해결하기 위해, 각 날짜 영역(span)을 지정해 그 안에서만 검색하도록 범위를 좁혔습니다.
5. 최종 완성 코드
최종 완성 코드는 아래와 같습니다.
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
CATEGORIES = [
"패션의류", "패션잡화", "화장품/미용", "디지털/가전", "가구/인테리어",
"출산/육아", "식품", "스포츠/레저", "생활/건강", "여가/생활편의", "면세점", "도서"
]
def smart_click(driver, element):
"""자바스크립트를 이용해 강제로 클릭합니다."""
try:
driver.execute_script("arguments[0].click();", element)
except Exception:
element.click()
def select_date_fixed(driver, parent_index, date_parts):
"""정확한 날짜 영역 내부의 드롭다운만 제어합니다."""
wait = WebDriverWait(driver, 10)
parent_span = wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, f".set_period_target span:nth-of-type({parent_index})")
))
for i, val in enumerate(date_parts):
selector = ".select.w2" if i == 0 else f".select.w3:nth-of-type({i+1})"
dropdown_div = parent_span.find_element(By.CSS_SELECTOR, selector)
btn = dropdown_div.find_element(By.CSS_SELECTOR, ".select_btn")
smart_click(driver, btn)
time.sleep(0.5)
try:
option = dropdown_div.find_element(By.XPATH, f".//a[text()='{val}']")
smart_click(driver, option)
except Exception:
option = dropdown_div.find_element(By.XPATH, f".//a[contains(text(), '{val}')]")
smart_click(driver, option)
time.sleep(0.3)
def run_crawler():
print("\n" + "="*40)
for i, cat in enumerate(CATEGORIES, 1):
print(f"{i:2}. {cat}", end=" ")
if i % 4 == 0: print()
print("\n" + "="*40)
try:
choice = int(input("\n선택 (번호): ")) - 1
target_cat = CATEGORIES[choice]
start_str = input("시작 날짜 (YYYY.MM.DD): ")
end_str = input("종료 날짜 (YYYY.MM.DD): ")
start_dt = start_str.split('.')
end_dt = end_str.split('.')
except Exception:
print("❌ 입력 형식이 잘못되었습니다.")
return
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://datalab.naver.com/shoppingInsight/sCategory.naver")
wait = WebDriverWait(driver, 15)
try:
# 팝업 제거[cite: 1]
try: driver.find_element(By.CSS_SELECTOR, ".sp_btn_pop_close").click()
except Exception: pass
# 카테고리 선택[cite: 1]
cat_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".category .select_btn")))
smart_click(driver, cat_btn)
time.sleep(0.5)
cat_opt = wait.until(EC.presence_of_element_located((By.XPATH, f"//ul[@class='select_list scroll_cst']//a[text()='{target_cat}']")))
smart_click(driver, cat_opt)
# '직접입력' 클릭[cite: 1]
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "label[for='8_set_period3']"))).click()
time.sleep(1)
# 날짜 선택[cite: 1]
select_date_fixed(driver, 1, start_dt)
select_date_fixed(driver, 3, end_dt)
# 조회하기[cite: 1]
driver.find_element(By.CSS_SELECTOR, ".btn_submit").click()
# 결과 출력[cite: 1]
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".rank_top1000_list")))
time.sleep(1)
print(f"\n✅ {target_cat} ({start_str} ~ {end_str}) 결과")
print("-" * 50)
items = driver.find_elements(By.CSS_SELECTOR, ".rank_top1000_list li")
for item in items[:20]:
rank = item.find_element(By.CLASS_NAME, "rank_top1000_num").text
keyword = item.find_element(By.CLASS_NAME, "link_text").text.replace(rank, "").strip()
print(f"{rank:2}위 | {keyword}")
print("\n🎉 모든 수집이 완료되었습니다. 3초 후 브라우저를 종료합니다.")
time.sleep(3) # 결과 확인을 위한 짧은 대기[cite: 1]
except Exception as e:
print(f"\n❌ 에러 발생: {e}")
finally:
# 자동 종료: input()을 제거하여 바로 quit()이 호출되게 합니다.[cite: 1]
driver.quit()
if __name__ == "__main__":
run_crawler()
위 코드를 실행한 결과입니다.
마무리
오늘은 네이버 데이터랩 쇼핑인사이트의 인기 검색어를 수집하는 프로그램을 만들어 보았습니다. 수많은 에러와 씨름한 끝에 결국 코드를 완성했네요. 여기서 더 나아가 결과물을 엑셀로 저장하거나, 검색어 500개를 한꺼번에 수집하는 등 다양한 기능을 추가해 보는 것도 충분히 가능합니다. 모두 AI의 도움을 받으면 어렵지 않게 구현할 수 있죠.
하지만 AI와 함께하는 ‘바이브 코딩’을 하면 할수록 느끼는 점이 있습니다. 코딩의 기초를 어느 정도 알고 있어야 AI에게 더 정교하게 질문할 수 있고, 결과물도 훨씬 좋아진다는 사실입니다. 기본기의 소중함을 다시금 체감하며, 다음 주제로 다시 돌아오겠습니다.