
네이버 쇼핑 검색 결과를 데이터로 다뤄본 사람이라면 한 번쯤 겪는 문제가 있다. 검색 결과 상단에 노출된 상품이 정말 인기 상품인지, 아니면 광고인지 응답만 봐서는 바로 알기 어렵다는 점이다.
이 글에서는 네이버 쇼핑 검색 API의 응답 구조를 뜯어보고, 광고 상품과 일반 상품을 코드로 구분하는 방법을 정리한다.
네이버 쇼핑 검색 페이지는 내부적으로 다음 형태의 API를 호출한다.
GET https://search.shopping.naver.com/api/search/all
?sort=rel
&pagingIndex=1
&pagingSize=40
&viewType=list
&productSet=total
&query=무선이어폰
&minPrice=30000
&maxPrice=200000
주요 파라미터 정리:
| 파라미터 | 설명 |
|---|---|
sort | 정렬 기준: rel(연관도), price_asc, price_dsc, review, date |
pagingIndex | 페이지 번호, 1부터 시작 |
pagingSize | 페이지당 상품 수, 통상 40 |
productSet | total, overseas, used 등 |
minPrice, maxPrice | 가격 필터 |
응답 JSON의 상품 리스트 각 항목에는 다음 키가 포함된다.
| 필드 | 설명 |
|---|---|
nvMid | 네이버 쇼핑 내부 상품 ID |
productTitle | 상품명 |
price | 표시 가격 |
mallName | 판매처 이름 |
productType | STORE(단일 스마트스토어 상품) 또는 CATALOG(복수 판매처 묶음) |
adId | 광고 상품에만 존재하는 필드 |
lowPrice, highPrice | 카탈로그 상품의 최저, 최고가 |
reviewCount, scoreInfo | 리뷰 수와 평점 |
광고 여부를 구분하는 가장 확실한 방법은 adId 필드의 존재 여부다. 광고 상품은 UI에서도 일반 상품과 거의 동일하게 표시되기 때문에 응답 키를 기준으로 판단해야 한다.
Syphoon의 Naver Scraper API를 사용하면 세션 관리나 차단 없이 동일한 응답을 가져올 수 있다. 엔드포인트는 단일 POST로 동작한다.
import requests
def fetch_naver_search(query, page=1):
naver_url = (
"https://search.shopping.naver.com/api/search/all"
f"?sort=rel&pagingIndex={page}&pagingSize=40"
f"&viewType=list&productSet=total&query={query}"
)
payload = {
"key": "YOUR_SYPHOON_API_KEY",
"url": naver_url,
"method": "GET"
}
response = requests.post(
"https://naverapi.syphoon.com",
json=payload
)
return response.json()
def split_ads_and_organic(data):
products = data.get("shoppingResult", {}).get("products", [])
ads = [p for p in products if p.get("adId")]
organic = [p for p in products if not p.get("adId")]
return ads, organic
data = fetch_naver_search("무선이어폰")
ads, organic = split_ads_and_organic(data)
print(f"광고 상품: {len(ads)}개")
print(f"일반 상품: {len(organic)}개")
productType이 CATALOG이면 여러 판매처가 동일 상품을 판매하는 묶음이다. 이 경우 lowPrice와 highPrice로 가격대를 파악하고, 판매처별 상세 데이터는 별도로 수집해야 한다.
productType이 STORE이면 특정 스마트스토어의 단일 상품이다.
가격 비교나 순위 추적을 목적으로 한다면 이 둘을 처음부터 분리해서 처리하는 것이 데이터 일관성을 유지하는 핵심이다.
네이버 쇼핑 검색 응답을 단순한 상품 리스트로 취급하면 광고 노이즈가 순위 분석에 섞인다. adId로 광고를 걸러내고, productType으로 카탈로그와 단일 상품을 구분하는 것이 데이터 수집의 출발점이다.
이 글에서 사용한 API는 Syphoon의 Naver Scraper를 통해 접근했다. 문서와 API 키 발급은 syphoon.com/dedicated/naver에서 확인할 수 있다.