Jak scrapować ceny i dostępność Best Buy w 2026 — od API do HTML
Best Buy to jeden z największych amerykańskich retailerów elektroniki, a jego dane o cenach i dostępności produktów są kluczowe dla inżynierów monitorujących rynek detaliczny. Oficjalne Best Buy Products API wymaga jednak zatwierdzenia aplikacji, klucza API oraz przestrzegania limitów żądań — zwykle 25 żądań na sekundę na klucz w warstwie produkcyjnej. Live pricing i dostępność na poziomie sklepu (store-level availability) często nie są w ogóle dostępne przez API, co zmusza zespoły do pobierania danych bezpośrednio ze strony.
Jeśli chcesz scrape Best Buy w 2026 roku, musisz zmierzyć się z zaawansowanym systemem anti-bot opartym na Akamai Bot Manager. W tym przewodniku pokazujemy, jak zbudować Best Buy price tracker i Best Buy stock checker przy użyciu residential proxy z geo-targetingiem, biblioteki curl_cffi oraz ProxyHat jako warstwy rotacji IP.
1. API vs HTML — dlaczego scraping strony jest często jedyną opcją
Best Buy oferuje publiczne API (developer.bestbuy.com), ale ma ono istotne ograniczenia:
- Wymaga rejestracji i zatwierdzenia — klucz API nie jest dostępny natychmiast.
- Limity rate-limit — produkcyjne klucze są ograniczone do ~25 req/s, co przy monitorowaniu tysięcy SKU jest niewystarczające.
- Brak store-level availability — API zwraca cenę katalogową, ale nie dostępność w konkretnym sklepie fizycznym dla danego kodu pocztowego.
- Opóźnienia danych — API może być cache'owane, podczas gdy strona odzwierciedla aktualny stan w czasie rzeczywistym.
Dlatego większość inżynierów budujących Best Buy price tracker sięga po scraping HTML i wewnętrznych endpointów JSON, które strona ładuje dynamicznie.
2. Anti-bot stack Best Buy — Akamai Bot Manager
Best Buy chroni swoją stronę za pomocą Akamai Bot Manager, jednego z najbardziej zaawansowanych systemów wykrywania botów na rynku. Zgodnie z dokumentacją Akamai Bot Manager, system analizuje sygnatury przeglądarki, zachowanie myszy, czas odpowiedzi oraz ciasteczka sensorowe.
Kluczowe elementy, które musisz znać:
- Ciasteczka
_abckibm_sz— generowane przez JavaScript Akamai na podstawie sensora przeglądarki. Bez poprawnych wartości żądania są blokowane (HTTP 403). - Wyzwanie JavaScript — Akamai wykonuje testy środowiska JS (canvas fingerprint, WebGL, timing), aby odróżnić realną przeglądarkę od headless browsera.
- Reputacja IP — datacenter IP (AWS, GCP, DigitalOcean) są klasyfikowane jako podejrzane i blokowane po zaledwie 2–5 żądaniach.
Danecenter proxy nie wystarczą do scrapowania Best Buy. Potrzebujesz residential IP, najlepiej z geo-targetingiem na poziomie miasta w USA.
Tabela: Porównanie typów proxy dla Best Buy
| Typ proxy | Wygoda Akamai | Geo-targeting | Koszt | Rekomendacja |
|---|---|---|---|---|
| Datacenter | Blokowane po 2–5 req | Tylko kraj | Niski | Nie rekomendowane |
| Residential (rotating) | Wysoka sukces rate | Kraj + miasto | Średni | Najlepsza opcja |
| Mobile | Bardzo wysoka | Kraj | Wysoki | Dla trudnych przypadków |
3. Wzorce URL i selektory CSS/XPath
Strony produktów Best Buy mają przewidywalny wzorzec URL:
https://www.bestbuy.com/site/{slug}/{sku}.p?skuId={sku}
Na przykład:
https://www.bestbuy.com/site/sony-playstation-5-console/6426149.p?skuId=6426149
Kluczowe selektory CSS
- Cena:
.priceView-customer-pricelub.priceView-hero-price priceView-purchase-price - Tytuł produktu:
.sku-title h1 - Dostępność wysyłkowa:
.fulfillment-fulfillment-summary - SKU:
.sku-model .sku-value
Wewnętrzne endpointy JSON
Strona produktu ładuje dynamicznie dane o dostępności i cenie przez wewnętrzne endpointy:
https://www.bestbuy.com/productfulfillment?skus={sku}&zip={zipcode}
https://api.bestbuy.com/v1/products(sku={sku})?format=json&apiKey={key}
Endpoint /productfulfillment zwraca JSON z informacją o dostępności w sklepie (inStoreAvailability) oraz cenie dla danego kodu pocztowego. To jest serce Best Buy stock checker.
Przykładowy (skrócony) response z /productfulfillment:
{
"sku": "6426149",
"price": {"currentPrice": 499.99, "regularPrice": 499.99},
"inStoreAvailability": true,
"stores": [
{"storeId": "281", "stockLevel": "IN_STOCK", "distance": 3.2}
]
}
4. Dlaczego store-level stock wymaga US residential proxy z city geo
Dostępność produktu w sklepie fizycznym Best Buy jest zależna od lokalizacji. Strona używa kodu pocztowego, aby określić, które sklepy pokazać. Jeśli Twoje żądanie pochodzi z IP spoza USA lub z datacenter IP, Best Buy może zwrócić ogólną dostępność lub zablokować żądanie.
Dlatego musisz użyć US residential proxy z geo-targetingiem na poziomie miasta. ProxyHat obsługuje to przez flagi w nazwie użytkownika:
http://user-country-US-region-illinois-city-chicago:pass@gate.proxyhat.com:8080
Dla każdego kodu pocztowego używasz odpowiedniego miasta:
- Nowy Jork (10001) →
user-country-US-region-new_york-city-new_york_city - Los Angeles (90001) →
user-country-US-region-california-city-los_angeles - Chicago (60601) →
user-country-US-region-illinois-city-chicago
Więcej lokalizacji znajdziesz na stronie lokalizacji ProxyHat.
5. Praktyczny przykład w Pythonie z curl_cffi i ProxyHat
Akamai wymaga poprawnego TLS fingerprintu. Biblioteka curl_cffi emuluje fingerprint Chrome/Firefox, co znacznie zwiększa sukces rate w porównaniu do zwykłego requests.
Instalacja
pip install curl_cffi lxml
Kod: pobieranie ceny i dostępności SKU
from curl_cffi import requests as cffi_requests
from lxml import html
import json, time, random
PROXY = "http://user-country-US-region-illinois-city-chicago:pass@gate.proxyhat.com:8080"
SKU = "6426149"
ZIP = "60601"
def fetch_sku_page(sku, session_id=None):
url = f"https://www.bestbuy.com/site/product/{sku}.p?skuId={sku}"
proxy = PROXY
if session_id:
proxy = proxy.replace("user-", f"user-sid-{session_id}-")
r = cffi_requests.get(
url,
proxy=proxy,
impersonate="chrome120",
timeout=15
)
if r.status_code == 403:
print("Akamai challenge — backoff")
time.sleep(random.uniform(5, 15))
return None
return r
def fetch_fulfillment(sku, zip_code, session_id=None):
url = f"https://www.bestbuy.com/productfulfillment?skus={sku}&zip={zip_code}"
proxy = PROXY
if session_id:
proxy = proxy.replace("user-", f"user-sid-{session_id}-")
r = cffi_requests.get(
url,
proxy=proxy,
impersonate="chrome120",
timeout=15
)
if r.status_code == 200:
return r.json()
return None
def parse_price(html_text):
tree = html.fromstring(html_text)
price_node = tree.cssselect(".priceView-customer-price")
title_node = tree.cssselect(".sku-title h1")
price = price_node[0].text_content().strip() if price_node else None
title = title_node[0].text_content().strip() if title_node else None
return {"title": title, "price": price}
# Główny przepływ
session = f"zip{ZIP}"
page = fetch_sku_page(SKU, session)
if page:
info = parse_price(page.text)
print(f"Produkt: {info['title']}")
print(f"Cena: {info['price']}")
fulfillment = fetch_fulfillment(SKU, ZIP, session)
if fulfillment:
data = fulfillment[0] if isinstance(fulfillment, list) else fulfillment
print(f"SKU: {data.get('sku')}")
print(f"Cena JSON: {data.get('price', {}).get('currentPrice')}")
print(f"Dostępność: {data.get('inStoreAvailability')}")
Ten skrypt pobiera stronę produktu, parsuje cenę i tytuł, a następnie odpytuje endpoint /productfulfillment dla konkretnego kodu pocztowego. Sticky session (-sid-zip60601) zapewnia, że wszystkie żądania dla tego kodu pocztowego wychodzą z tego samego IP.
6. Strategie rotacji IP i backoff
Rotating sticky sessions per zip
Dla monitorowania dostępności w wielu lokalizacjach jednocześnie, używaj sticky session per zip code:
# Chicago — session per zip
http://user-sid-zip60601-country-US-region-illinois-city-chicago:pass@gate.proxyhat.com:8080
# Nowy Jork — session per zip
http://user-sid-zip10001-country-US-region-new_york-city-new_york_city:pass@gate.proxyhat.com:8080
# Los Angeles — session per zip
http://user-sid-zip90001-country-US-region-california-city-los_angeles:pass@gate.proxyhat.com:8080
Sticky session utrzymuje ten sam IP przez całą sesję, co jest kluczowe dla Akamai — ciasteczka _abck są powiązane z IP. Nagła zmiana IP w środku sesji wywołuje challenge.
Backoff przy 403/Akamai challenge
Gdy otrzymasz HTTP 403 lub wykryjesz challenge Akamai (np. redirect do strony z JS puzzle), zastosuj strategię backoff:
- Przerwa 5–15 sekund przed ponowną próbą.
- Zmiana session ID — wymusza nowy IP.
- Limit 3 prób na SKU, potem skip na 24h.
- Monitoruj rate 403 — jeśli przekracza 5% żądań, zmniejsz concurrency.
Paginacja kategorii
Strony kategorii Best Buy używają paginacji z parametrem cp:
https://www.bestbuy.com/site/laptops/pc-laptops/pcmcat247400050000.c?id=pcmcat247400050000&cp=1
https://www.bestbuy.com/site/laptops/pc-laptops/pcmcat247400050000.c?id=pcmcat247400050000&cp=2
Każda strona zawiera ~24 produkty. Dla pełnego skanu kategorii używaj rotacji IP co 2–3 strony, aby uniknąć pattern detection.
7. Typowe błędy i edge cases
- Brak ciasteczek Akamai — pierwsze żądanie bez
_abckczęsto przechodzi, ale kolejne są blokowane. Rozwiązanie: zachowuj ciasteczka w sesjicurl_cffi. - Zmiana IP w środku sesji — Akamai natychmiast wykrywa mismatch IP/cookie. Używaj sticky session.
- Headless browser detection — Selenium/Puppeteer z defaultowymi flagami jest wykrywany. Używaj
undetected-chromedriverlubplaywright-stealth. - Rate limit API — nawet residential IP mają limity. Utrzymuj ≤10 req/s na IP.
- Produkty wyprzedane — strona zmienia strukturę DOM dla OOS produktów. Sprawdzaj obecność
.fulfillment-fulfillment-summaryprzed parsowaniem ceny.
8. Konfiguracja ProxyHat i linki wewnętrzne
ProxyHat oferuje residential proxy z geo-targetingiem na poziomie kraju i miasta, co jest kluczowe dla scrape Best Buy. Konfiguracja:
- HTTP:
http://user-country-US-region-illinois-city-chicago:pass@gate.proxyhat.com:8080 - SOCKS5:
socks5://user-country-US-region-illinois-city-chicago:pass@gate.proxyhat.com:1080
Pełną dokumentację znajdziesz na docs.proxyhat.com. Cennik residential proxy: /pl/pricing. Przypadki użycia scraping: /pl/use-cases/web-scraping. SERP tracking: /pl/use-cases/serp-tracking.
9. Etyka, ToS i aspekty prawne
Scraping publicznie dostępnych danych katalogowych i cenowych z Best Buy jest powszechnie praktykowany, ale wymaga ostrożności:
- Publiczne dane tylko — scrapuj tylko publicznie dostępne ceny i dostępność. Nie automatyzuj logowania ani checkoutu.
- Respektuj robots.txt — Best Buy może określić niedozwolone ścieżki w robots.txt.
- CFAA — w USA Computer Fraud and Abuse Act może mieć zastosowanie do nadmiernego scraping. Utrzymuj rozsądne rate.
- GDPR/CCPA — nie zbieraj danych osobowych (recenzje z imionami, dane kont). Tylko dane produktowe.
- Oficjalne API — jeśli Twoje potrzeby spełnia warstwa API (cena katalogowa bez store-level), użyj jej. Jest legalna i stabilna.
Scraping nie zastępuje oficjalnego API tam, gdzie API wystarcza. Używaj scraping tylko dla danych niedostępnych przez API (store-level availability, live pricing).






