2026년 Best Buy 가격 및 재고 스크래핑 방법: API vs HTML 트레이드오프
Best Buy는 공식 Products API를 통해 카탈로그 데이터를 제공하지만, API 키 발급에는 승인 절차가 필요하고 요청 한도가 엄격합니다. 실시간 가격 변동과 매장별 재고 가용성은 API 티어만으로 충분히 커버하기 어렵습니다. 그래서 대부분의 가격 모니터링 엔지니어는 Best Buy 웹사이트의 HTML 페이지와 내부 JSON 엔드포인트를 직접 수집하는 방식을 택합니다. 이 가이드에서는 Best Buy 가격 및 재고 스크래핑을 위한 전체 파이프라인을 단계별로 구현하는 방법을 설명합니다.
Best Buy를 scrape하려는 이유는 간단합니다. 경쟁사 가격 모니터링, 재고 알림 서비스, 수익 분석 데이터 수집 등 다양한 비즈니스 요구가 있습니다. 하지만 Best Buy는 강력한 안티봇 시스템을 운영하고 있어, 단순한 requests 호출로는 몇 번의 요청 만에 차단됩니다. 적절한 프록시 전략과 브라우저 지문 관리가 필수적입니다.
Best Buy의 안티봇 스택: Akamai Bot Manager
Best Buy는 Akamai Bot Manager를 사용하여 자동화된 트래픽을 감지하고 차단합니다. Akamai의 핵심 메커니즘은 다음과 같습니다.
- _abck 쿠키: 브라우저 환경 센서 데이터를 기반으로 생성되는 쿠키로, JavaScript 챌린지 결과를 인코딩합니다. 정상적인 브라우저가 아니면 이 쿠키가 갱신되지 않거나 차단 플래그가 설정됩니다.
- bm_sz 쿠키: 센서 데이터와 함께 발급되는 보조 쿠키로, 요청 패턴과 디바이스 지문을 추적합니다.
- IP 평판: 데이터센터 IP 대역은 Akamai의 위협 인리전스 데이터베이스에서 즉시 플래그됩니다. 일반적으로 데이터센터 IP로 3~5회 요청 후 403 응답이 반환됩니다.
- 행동 분석: 요청 속도, 헤더 일관성, 마우스/키보드 이벤트 패턴을 분석하여 봇 행동을 감지합니다.
이러한 이유로 데이터센터 프록시만으로는 Best Buy 스크래핑이 사실상 불가능합니다. 미국 ISP가 부여한 주거용 IP가 필요하며, 특히 매장별 재고 데이터는 지역별로 다르기 때문에 도시 단위 지역 타겟팅이 중요합니다.
프록시 유형별 Best Buy 스크래핑 적합성 비교
| 프록시 유형 | Akamai 우회 가능성 | 매장별 재고 정확도 | 권장 사용 시나리오 |
|---|---|---|---|
| 데이터센터 | 낮음 (3~5회 후 차단) | 불가능 | API 호출만 (승인된 키) |
| 주거용 (US) | 높음 | 우수 (도시 타겟팅 시) | 가격·재고 스크래핑 메인 |
| 모바일 (US) | 매우 높음 | 우수 | 고난도 차단 환경, 대량 수집 |
URL 패턴과 CSS / XPath 선택자
Best Buy의 제품 페이지는 일관된 URL 패턴을 따릅니다. SKU 기반으로 직접 접근할 수 있습니다.
SKU 페이지 URL 패턴
https://www.bestbuy.com/site/-/{SKU}.p?skuId={SKU}예를 들어 SKU가 6523456인 제품의 URL은 다음과 같습니다.
https://www.bestbuy.com/site/-/6523456.p?skuId=6523456핵심 CSS 선택자
HTML 페이지에서 가격과 제품명을 추출할 때 사용하는 주요 선택자는 다음과 같습니다.
- 가격:
.priceView-customer-price— 현재 고객용 가격 텍스트를 포함합니다. - 제품명:
.sku-title h1— SKU 페이지의 제품 타이틀을 포함합니다. - 재고 상태:
.fulfillment-availability-shipping— 배송 가능 여부 텍스트를 포함합니다. - 매장 픽업:
.fulfillment-availability-store-pickup— 매장 픽업 가용성 텍스트를 포함합니다.
내부 JSON 엔드포인트
Best Buy는 클라이언트 사이드에서 재고와 가격을 동적으로 로드하기 위해 내부 API 엔드포인트를 사용합니다. 이 엔드포인트는 SKU와 우편번호를 키로 사용합니다.
https://www.bestbuy.com/productfulfillment?skuId={SKU}&zip={ZIP_CODE}
https://api.bestbuy.com/click/-/sku/{SKU}/price/productfulfillment 엔드포인트는 매장별 재고 가용성, 배송 예상 시간, 픽업 가능 매장 목록을 JSON으로 반환합니다. 이 엔드포인트에 직접 요청하면 HTML 파싱 없이 정형 데이터를 얻을 수 있어 효율적입니다.
다음은 /productfulfillment 응답의 예시입니다 (실제 응답에서 발췌).
{
"sku": "6523456",
"price": {
"currentPrice": 999.99,
"regularPrice": 1099.99
},
"inStoreAvailability": true,
"stores": [
{
"storeNumber": "0281",
"storeName": "Chicago - Lincoln Park",
"availability": "In Stock",
"distance": 2.1
}
]
}매장별 재고와 미국 주거용 프록시
Best Buy의 매장별 재고 데이터는 요청을 보내는 IP의 지역에 따라 다릅니다. 시카고 매장의 재고를 확인하려면 시카고 지역 IP에서 요청을 보내야 합니다. 이것이 Best Buy stock checker 구축 시 가장 중요한 기술적 결정입니다.
ProxyHat 주거용 프록시에서 도시 단위 지역 타겟팅을 사용하면, 요청이 해당 도시의 ISP IP에서 나가므로 Best Buy 서버가 해당 지역 매장의 재고를 반환합니다.
# 시카고 IP로 SKU 페이지 요청
curl -x http://user-country-US-city-chicago:pass@gate.proxyhat.com:8080 \
"https://www.bestbuy.com/productfulfillment?skuId=6523456&zip=60614"여러 도시를 모니터링하려면 각 도시에 대해 별도의 프록시 세션을 설정하면 됩니다. 예를 들어 뉴욕, 로스앤젤레스, 시카고 세 도시의 재고를 동시에 확인하려면 세 개의 프록시 엔드포인트를 사용합니다.
# 뉴욕 IP
curl -x http://user-country-US-city-newyork:pass@gate.proxyhat.com:8080 \
"https://www.bestbuy.com/productfulfillment?skuId=6523456&zip=10001"
# 로스앤젤레스 IP
curl -x http://user-country-US-city-losangeles:pass@gate.proxyhat.com:8080 \
"https://www.bestbuy.com/productfulfillment?skuId=6523456&zip=90001"이 방식으로 전국 주요 도시의 재고를 병렬로 수집할 수 있습니다. ProxyHat 위치 목록에서 사용 가능한 미국 도시를 확인하세요.
Python 실전 예제: curl_cffi + ProxyHat
Akamai의 JavaScript 챌린지를 통과하려면 일반 requests 라이브러리로는 부족합니다. curl_cffi는 실제 Chrome의 TLS 지문을 에뮬레이션하여 Akamai 센서 검증을 통과할 확률을 높여줍니다.
from curl_cffi import requests as cffi_requests
import json
import time
import random
# ProxyHat 주거용 프록시 설정 (시카고)
PROXY_URL = "http://user-country-US-city-chicago:pass@gate.proxyhat.com:8080"
SKU = "6523456"
ZIP_CODE = "60614"
# 1. SKU 페이지 로드 — _abck 쿠키 획득
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
}
session = cffi_requests.Session(impersonate="chrome120")
session.proxies = {"http": PROXY_URL, "https": PROXY_URL}
sku_url = f"https://www.bestbuy.com/site/-/{SKU}.p?skuId={SKU}"
resp = session.get(sku_url, headers=headers, timeout=30)
if resp.status_code == 403:
print("Akamai 차단 감지 — 세션 교체 필요")
exit(1)
# 2. 가격 추출 (CSS 선택자)
from parsel import Selector
sel = Selector(text=resp.text)
price_text = sel.css(".priceView-customer-price span::text").get()
title = sel.css(".sku-title h1::text").get()
print(f"제품: {title}")
print(f"가격: {price_text}")
# 3. 재고 JSON 엔드포인트 호출
fulfillment_url = f"https://www.bestbuy.com/productfulfillment?skuId={SKU}&zip={ZIP_CODE}"
resp2 = session.get(fulfillment_url, headers=headers, timeout=30)
data = resp2.json()
print(f"SKU: {data.get('sku')}")
print(f"가격: ${data.get('price', {}).get('currentPrice')}")
print(f"매장 재고: {data.get('inStoreAvailability')}")
# 응답 예시 (발췌):
# SKU: 6523456
# 가격: $999.99
# 매장 재고: True이 코드는 단일 SKU에 대해 가격과 매장 재고를 수집합니다. 대량 모니터링을 위해서는 이 코드를 비동기로 확장하고, SKU 목록을 순회하며, 각 요청 사이에 적절한 지연을 추가해야 합니다.
세션 로테이션, 백오프, 페이지네이션
스티키 세션으로 우편번호별 일관성 유지
각 우편번호(또는 도시)에 대해 고정 세션을 사용하면, 동일한 IP가 연속된 요청에 사용되어 Akamai의 행동 분석을 통과할 확률이 높아집니다. ProxyHat에서는 -session- 플래그로 스티키 세션을 설정합니다.
# 시카고 세션
curl -x http://user-country-US-city-chicago-session-chi01:pass@gate.proxyhat.com:8080 \
"https://www.bestbuy.com/productfulfillment?skuId=6523456&zip=60614"
# 뉴욕 세션
curl -x http://user-country-US-city-newyork-session-ny01:pass@gate.proxyhat.com:8080 \
"https://www.bestbuy.com/productfulfillment?skuId=6523456&zip=10001"403 / Akamai 챌린지 시 백오프 전략
403 응답을 받으면 즉시 해당 세션을 폐기하고 새 세션으로 전환해야 합니다. 지수 백오프를 적용하면 Akamai의 rate-limit 트리거를 피할 수 있습니다.
import random
import time
def fetch_with_backoff(session, url, max_retries=5):
for attempt in range(max_retries):
resp = session.get(url, timeout=30)
if resp.status_code == 200:
return resp
elif resp.status_code == 403:
# 세션 교체 후 지수 백오프
wait = (2 ** attempt) + random.uniform(0.5, 2.0)
print(f"403 차단 — {wait:.1f}초 대기 후 재시도")
time.sleep(wait)
# 새 프록시 세션으로 교체
session.proxies = {
"http": f"http://user-country-US-city-chicago-session-new{attempt}:pass@gate.proxyhat.com:8080",
"https": f"http://user-country-US-city-chicago-session-new{attempt}:pass@gate.proxyhat.com:8080",
}
else:
time.sleep(1)
return None카테고리 페이지 페이지네이션
카테고리 페이지에서 SKU 목록을 수집하려면 URL의 cp 파라미터를 사용합니다. Best Buy는 페이지당 약 24개의 제품을 표시합니다.
BASE = "https://www.bestbuy.com/site/laptops/pcmcat247400050000.c"
for page in range(1, 20):
url = f"{BASE}?cp={page}"
resp = fetch_with_backoff(session, url)
if resp is None:
break
sel = Selector(text=resp.text)
skus = sel.css("li.sku-item::attr(data-sku-id)").getall()
print(f"페이지 {page}: {len(skus)}개 SKU 수집")
time.sleep(random.uniform(2, 5)) # 요청 간 랜덤 지연요청 간 2~5초의 랜덤 지연은 Akamai의 rate-limit 트리거(일반적으로 동일 IP에서 분당 약 100~150회 요청)를 피하는 데 도움이 됩니다. 대량 수집 시에는 여러 세션을 병렬로 운영하되, 각 세션의 요청 속도를 이 범위 이내로 유지하세요.
윤리와 이용약관
Best Buy 스크래핑을 수행할 때 다음 원칙을 지키는 것이 중요합니다.
- 공개 카탈로그/가격 데이터만 수집: 로그인이 필요한 페이지, 개인정보, 계정 관련 데이터는 수집하지 마세요.
- robots.txt 준수: Best Buy의
robots.txt를 확인하고, disallow된 경로는 스크래핑하지 마세요. - 체크아웃 자동화 금지: 자동 구매, 카트 추가, 결제 처리는 Best Buy 이용약관 위반이며 CFAA(Computer Fraud and Abuse Act) 위반 소지가 있습니다.
- GDPR / CCPA 고려: 개인 식별 정보(PII)를 수집하지 않으면 GDPR과 CCPA의 직접적인 적용 대상에서 벗어날 수 있지만, 수집 데이터의 저장과 처리 방식은 여전히 주의가 필요합니다.
- 공식 API 티어 검토: 가격 비교만 필요하고 실시간 매장 재고가 필요 없다면, Best Buy Developer API의 승인된 키를 사용하는 것이 더 안정적이고 합법적입니다. API 티어는 분당 약 200회의 요청을 허용합니다.
Best Buy price tracker 또는 Best Buy stock checker 서비스를 구축할 때는 항상 공개 데이터 수집에 머물고, 서버에 부하를 주지 않는 요청 속도를 유지하며, 상업적 이용 약관을 검토하세요.
ProxyHat 설정 및 내부 링크
ProxyHat에서 Best Buy 스크래핑을 시작하려면 다음 단계를 따르세요.
- 프록시 플랜 확인 — 주거용 프록시 트래픽 요구사항에 맞는 플랜을 선택하세요. Best Buy 스크래핑은 일반적으로 SKU당 2~3회 요청(HTML + fulfillment JSON)이 필요합니다.
- 웹 스크래핑 사용 사례 — ProxyHat 프록시를 활용한 스크래핑 전략을 참조하세요.
- SERP 추적 사용 사례 — SERP 수집과 유사한 회전 세션 전략을 확인하세요.
- 프록시 위치 — 미국 도시별 IP 가용성을 확인하세요.
- ProxyHat 문서 — 인증, 세션 관리, 지역 타겟팅 설정 가이드를 참조하세요.
핵심 요약
Best Buy 가격 및 재고 스크래핑 핵심 포인트:
- 공식 API는 승인 필요 + 엄격한 rate-limit → 실시간 데이터는 HTML/내부 JSON 엔드포인트에서 수집
- Akamai Bot Manager(_abck, bm_sz)가 데이터센터 IP를 3~5회 요청 후 차단
- 미국 주거용 프록시 + 도시 타겟팅(
-country-US-city-chicago)이 매장별 재고 수집에 필수curl_cffi로 Chrome TLS 지문 에뮬레이션 → Akamai 챌린지 통과율 향상- 스티키 세션(
-session-)으로 우편번호별 일관성 유지, 403 시 지수 백오프 + 세션 교체- 공개 데이터만 수집, 체크아웃 자동화 금지, CFAA/GDPR 고려
FAQ
Best Buy 가격 및 재고 스크래핑이란 무엇인가요?
Best Buy 가격 및 재고 스크래핑은 Best Buy 웹사이트의 공개 제품 페이지와 내부 JSON 엔드포인트에서 가격, 할인 정보, 매장별 재고 가용성 데이터를 자동으로 수집하는 작업입니다. 공식 Products API는 승인 절차와 요청 한도가 있어, 실시간 데이터가 필요한 가격 모니터링 및 재고 추적 시스템은 주로 웹 스크래핑 방식을 사용합니다.
Best Buy 스크래핑에 프록시가 필요한 이유는?
Best Buy는 Akamai Bot Manager를 사용하여 자동화된 트래픽을 차단합니다. 데이터센터 IP는 Akamai의 위협 인리전스에서 즉시 플래그되어 3~5회 요청 후 403 응답이 반환됩니다. 또한 매장별 재고 데이터는 요청 IP의 지역에 따라 다르게 반환되므로, 미국 주거용 프록시의 도시 단위 지역 타겟팅이 정확한 재고 정보 수집에 필수적입니다.
Best Buy 스크래핑에 어떤 프록시 유형이 가장 적합한가요?
미국 주거용 프록시가 가장 적합합니다. 데이터센터 프록시는 Akamai에 의해 빠르게 차단되고, 모바일 프록시는 차단 우회율이 가장 높지만 비용이 더 높습니다. 가격과 재고를 동시에 수집하려면 주거용 프록시로 충분하며, 도시 단위 지역 타겟팅 기능(-country-US-city-)을 지원하는 프록시 서비스를 사용해야 매장별 재고를 정확히 확인할 수 있습니다.
Best Buy 스크래핑 시 차단을 피하려면 어떻게 해야 하나요?
세 가지 전략을 조합해야 합니다. 첫째, curl_cffi 같은 TLS 지문 에뮬레이션 라이브러리를 사용하여 Chrome 브라우저와 동일한 TLS 핸드셰이크를 구성합니다. 둘째, 우편번호별로 스티키 세션을 유지하여 동일 IP에서 연속 요청이 자연스러운 패턴을 보이게 합니다. 셋째, 403 응답 시 지수 백오프(2^n + 랜덤 지터)를 적용하고 세션을 교체합니다. 요청 간 2~5초의 랜덤 지연도 Akamai rate-limit 트리거 회피에 도움이 됩니다.






