Scrapowanie Best Buy w 2026 roku wymaga zupełnie innego podejścia niż jeszcze kilka lat temu. Oficjalne Best Buy Products API jest dostępne tylko dla zatwierdzonych partnerów, a klucze API są rygorystycznie limitowane — typowo do kilkudziesięciu żądań na sekundę. Live pricing i dostępność na poziomie sklepu (store-level availability) najczęściej pochodzą więc bezpośrednio z front-endu strony. W tym przewodniku pokazujemy, jak scrapować ceny i stan magazynowy Best Buy w 2026 roku, korzystając z proxy rezydentnych ProxyHat, biblioteki curl_cffi i sprawdzonych selektorów CSS.
Dlaczego scrapowanie Best Buy w 2026 wymaga proxy — API vs HTML
Best Buy oferuje publiczne API produktów (developer.bestbuy.com), ale jego użyteczność dla monitorowania cen w czasie rzeczywistym jest ograniczona. Klucze API wymagają rejestracji i zatwierdzenia, a limity żądań są niskie — w darmowym tierze często poniżej 100 żądań na sekundę. Co więcej, endpointy API nie zawsze odzwierciedlają dostępność w konkretnym sklepie stacjonarnym — zwracają ogólnokrajowy stan magazynowy, który dla e-commerce i resellerów jest mało użyteczny.
Dlatego inżynierowie monitorowania cen i stanów magazynowych sięgają po HTML scraping. Strona bestbuy.com udostępnia bogate dane strukturalne: ceny, specyfikacje, oceny i — co najważniejsze — dostępność per lokalizacja. Wymaga to jednak obejścia zaawansowanego stosu anti-bot.
Stos anti-bot Best Buy: Akamai Bot Manager
Best Buy korzysta z Akamai Bot Manager, jednego z najbardziej zaawansowanych systemów wykrywania botów na rynku. Akamai opiera się na dwóch kluczowych mechanizmach:
- Ciasteczko
_abck— token sesyjny generowany przez JavaScript sensor, który zbiera ponad 100 sygnałów przeglądarki (canvas fingerprint, WebGL, czasy zdarzeń, właściwościnavigator). - Ciasteczko
bm_sz— drugi token weryfikacyjny, ustawiany w odpowiedzi na żądanie z poprawnym sensorem.
Adresy IP z centrów danych (datacenter) są zazwyczaj blokowane lub challenge'owane w ciągu kilku żądań — często już po 2–5 żądaniach Akamai zwraca HTTP 403 lub wymaga rozwiązania CAPTCHA. Zwykłe biblioteki HTTP takie jak requests czy httpx nie radzą sobie z generowaniem poprawnego sensora Akamai. Więcej o mechanizmach Akamai można przeczytać w dokumentacji Mozilla na temat ciasteczek HTTP oraz w publikacjach akademickich o fingerprintingu przeglądarek.
Proxy rezydentne (residential proxies) są tu kluczowe, ponieważ ruch pochodzi z prawdziwych adresów ISP — Akamai traktuje je jak organiczny ruch użytkowników, a nie botów z centrów danych.
Wzorce URL i selektory CSS/XPath
Strona produktu Best Buy ma 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
| Dane | Selektor CSS | Uwagi |
|---|---|---|
| Cena | .priceView-customer-price | Zawiera cenę bieżącą; .priceView-price dla promocji |
| Tytuł produktu | .sku-title h1 | Nazwa produktu |
| Ocena | .c-reviews-v4 .ugc-c-review-average | Średnia ocen (np. 4.7) |
| Dostępność online | .fulfillment-add-to-cart-button | Przycisk „Add to Cart” = dostępny |
| SKU | [data-sku-id] | Atrybut na elemencie kontenera |
Wewnętrzne endpointy JSON
Oprócz parsowania HTML, Best Buy udostępnia wewnętrzne endpointy JSON, które są wywoływane przez front-end JavaScript. Te endpointy są cenniejsze, bo zwracają ustrukturyzowane dane bez konieczności parsowania DOM:
# Dostępność i cena per SKU + kod pocztowy
https://www.bestbuy.com/productfulfillment?skus=6426149&zip=60601
# Szczegóły ceny
https://www.bestbuy.com/priceview?skuId=6426149
Endpoint /productfulfillment zwraca JSON zawierający m.in. sku, price, inStoreAvailability oraz shippingAvailability. Wymaga jednak poprawnych ciasteczek Akamai (_abck, bm_sz) i adresu IP z odpowiedniej lokalizacji.
Dlaczego stan magazynowy wymaga proxy rezydentnych z geo-targetingiem miasta
Dostępność w sklepach stacjonarnych Best Buy jest per-lokacja. Jeśli sprawdzasz stan z adresu IP z Frankfurtu, Best Buy zwróci dane dla najbliższego sklepu w USA lub w ogóle nie zwróci danych o dostępności stacjonarnej. Dlatego do monitorowania stanów magazynowych potrzebujesz proxy rezydentnych z geo-targetingiem na poziomie miasta w USA.
ProxyHat pozwala na precyzyjne geo-targetowanie poprzez flagi w nazwie użytkownika:
# Chicago, IL
http://user-country-US-city-chicago:pass@gate.proxyhat.com:8080
# Nowy Jork, NY
http://user-country-US-city-newyork:pass@gate.proxyhat.com:8080
# Los Angeles, CA
http://user-country-US-city-losangeles:pass@gate.proxyhat.com:8080
Każde żądanie z danego miasta symuluje lokalnego użytkownika, co daje poprawne dane o dostępności w okolicznych sklepach. Pełną listę dostępnych lokalizacji znajdziesz na stronie lokalizacji ProxyHat.
Praktyczna implementacja w Pythonie
Poniżej znajduje się kompletny przykład scrapowania ceny i dostępności produktu Best Buy z użyciem biblioteki curl_cffi (która emuluje TLS fingerprint przeglądarki Chrome) oraz proxy rezydentnych ProxyHat.
Krok 1: Instalacja zależności
pip install curl_cffi beautifulsoup4 lxml
Krok 2: Scrapowanie strony produktu
from curl_cffi import requests
from bs4 import BeautifulSoup
import json
# Konfiguracja proxy ProxyHat — Chicago, sesja sticky
PROXY = "http://user-country-US-city-chicago-session-chi01:pass@gate.proxyhat.com:8080"
SKU = "6426149"
URL = f"https://www.bestbuy.com/site/sony-playstation-5-console/{SKU}.p?skuId={SKU}"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.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",
}
response = requests.get(URL, headers=headers, proxies={"http": PROXY, "https": PROXY}, impersonate="chrome131", timeout=30)
if response.status_code == 200:
soup = BeautifulSoup(response.text, "lxml")
# Cena
price_el = soup.select_one(".priceView-customer-price")
price = price_el.text.strip() if price_el else "N/A"
# Tytuł
title_el = soup.select_one(".sku-title h1")
title = title_el.text.strip() if title_el else "N/A"
print(f"SKU: {SKU}")
print(f"Title: {title}")
print(f"Price: {price}")
else:
print(f"HTTP {response.status_code} — możliwy challenge Akamai")
Krok 3: Pobieranie JSON dostępności per kod pocztowy
import json
from curl_cffi import requests
# Endpoint dostępności — wymaga poprawnych ciasteczek Akamai
ZIP_CODE = "60601"
FULFILLMENT_URL = f"https://www.bestbuy.com/productfulfillment?skus={SKU}&zip={ZIP_CODE}"
# Użyj tej samej sesji co przy pobieraniu strony produktu
response = requests.get(
FULFILLMENT_URL,
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Accept": "application/json",
"Referer": f"https://www.bestbuy.com/site/product/{SKU}.p?skuId={SKU}",
},
proxies={"http": PROXY, "https": PROXY},
impersonate="chrome131",
timeout=30,
)
if response.status_code == 200:
data = response.json()
# Truncated przykład odpowiedzi:
# {
# "sku": "6426149",
# "price": 499.99,
# "inStoreAvailability": true,
# "shippingAvailability": true,
# "stores": [
# {"storeNumber": "0615", "distance": 2.1, "inStoreAvailability": true},
# ...
# ]
# }
print(json.dumps(data, indent=2)[:500])
else:
print(f"HTTP {response.status_code}")
Krok 4: Sprawdzanie wielu SKU z rotacją sesji
import time
import random
from curl_cffi import requests
SKUS = ["6426149", "6523313", "6512397", "6488349"]
ZIP_CODES = ["60601", "10001", "90001", "75201"]
BASE_PROXY = "http://user-country-US-city-{}-session-{}:pass@gate.proxyhat.com:8080"
def fetch_sku(sku, zip_code):
city = "chicago" if zip_code == "60601" else "newyork" if zip_code == "10001" else "losangeles" if zip_code == "90001" else "dallas"
session_id = f"{city}-{zip_code}-{random.randint(1000,9999)}"
proxy = BASE_PROXY.format(city, session_id)
url = f"https://www.bestbuy.com/productfulfillment?skus={sku}&zip={zip_code}"
for attempt in range(3):
try:
resp = requests.get(
url,
headers={"User-Agent": "Mozilla/5.0", "Accept": "application/json"},
proxies={"http": proxy, "https": proxy},
impersonate="chrome131",
timeout=30,
)
if resp.status_code == 200:
return resp.json()
elif resp.status_code == 403:
# Akamai challenge — backoff i retry z nową sesją
wait = 2 ** attempt + random.uniform(0.5, 2.0)
time.sleep(wait)
session_id = f"{city}-{zip_code}-{random.randint(1000,9999)}"
proxy = BASE_PROXY.format(city, session_id)
else:
time.sleep(1)
except Exception as e:
print(f"Error: {e}")
time.sleep(2)
return None
for sku in SKUS:
for zip_code in ZIP_CODES:
result = fetch_sku(sku, zip_code)
if result:
print(f"SKU {sku} @ {zip_code}: price=${result.get('price', 'N/A')}, inStore={result.get('inStoreAvailability', 'N/A')}")
time.sleep(1.5) # Rate limit: ~40 req/min per IP
Strategie rotacji, backoff i paginacja
Rotacja sticky sesji per kod pocztowy
Używaj sticky sessions (flaga -session-) przypisanych do każdego kodu pocztowego. Pozwala to utrzymać ciasteczka Akamai i uniknąć ponownego generowania sensora przy każdym żądaniu. Przykład:
# Sticky sesja dla Chicago 60601
http://user-country-US-city-chicago-session-chi60601:pass@gate.proxyhat.com:8080
# Sticky sesja dla NYC 10001
http://user-country-US-city-newyork-session-nyc10001:pass@gate.proxyhat.com:8080
Rotuj sesję dopiero po otrzymaniu HTTP 403 lub po ustalonym limicie żądań (np. 40 żądań na sesję).
Backoff przy 403 / Akamai challenge
Gdy otrzymasz HTTP 403, zastosuj exponential backoff z jitter:
- Pierwsza próba: czekaj 2 sekundy
- Druga próba: czekaj 4 sekundy + jitter 0.5–2s
- Trzecia próba: czekaj 8 sekund + jitter 0.5–2s
- Po trzech nieudanych próbach: rotuj sesję proxy i zacznij od nowa
Paginacja stron kategorii
Strony kategorii Best Buy używają paginacji URL:
https://www.bestbuy.com/site/tvs/led-tvs/abcat0101005.c?id=abcat0101005&cp=1
https://www.bestbuy.com/site/tvs/led-tvs/abcat0101005.c?id=abcat0101005&cp=2
Parametr cp określa numer strony. Każda strona zawiera do 30 produktów. Aby uniknąć blokad, nie przekraczaj 1 żądania na 2 sekundy per sesja proxy przy scrapowaniu kategorii.
Typowe błędy i przypadki brzegowe
1. TLS fingerprint mismatch
Standardowe biblioteki requests wysyłają TLS handshake, który Akamai natychmiast rozpoznaje jako non-browser. Używaj curl_cffi z parametrem impersonate="chrome131" lub impersonate="safari17", aby emulować fingerprint prawdziwej przeglądarki.
2. Brak ciasteczek Akamai
Endpoint /productfulfillment wymaga poprawnych ciasteczek _abck i bm_sz. Najpierw pobierz stronę produktu HTML (która ustawia ciasteczka), a dopiero potem wywołaj endpoint JSON — w tej samej sesji.
3. Nieprawidłowe geo-targetowanie
Jeśli używasz proxy z Niemiec lub Wielkiej Brytanii, Best Buy może zwracać puste dane o dostępności stacjonarnej lub przekierowywać na lokalną wersję strony. Zawsze używaj -country-US dla danych z amerykańskich sklepów.
4. Zbyt agresywny rate limit
Wysyłanie więcej niż 60 żądań na minutę z jednej sesji proxy niemal na pewno wywoła challenge Akamai. Utrzymuj tempo 30–40 żądań na minutę per sesja i rotuj sesje między kodami pocztowymi.
Etyka, regulamin i kwestie prawne
Scrapowanie publicznych danych katalogowych i cenowych z bestbuy.com jest możliwe, ale wymaga ostrożności:
- Publiczne dane tylko: scrapuj wyłącznie publicznie dostępne ceny, specyfikacje i dostępność. Nie próbuj omijać logowania ani automatyzować procesu zakupu (checkout automation).
- CFAA i GDPR: w USA Computer Fraud and Abuse Act może mieć zastosowanie do nieautoryzowanego dostępu. W UE, RODO (GDPR) ogranicza zbieranie danych osobowych. Nie zbieraj danych użytkowników, recenzji z danymi osobowymi ani informacji z kont.
- robots.txt: sprawdź
https://www.bestbuy.com/robots.txti przestrzegaj dyrektywDisallow. - Rate limiting: nie przeciążaj serwerów Best Buy. Utrzymuj rozsądne tempo i używaj backoff.
- Kiedy oficjalne API wystarczy: jeśli potrzebujesz tylko ogólnokrajowych cen i metadanych produktów bez dostępności per-sklep, oficjalne Best Buy API może być wystarczające i zgodne z regulaminem.
Nigdy nie automatyzuj procesu zakupu (add-to-cart → checkout) z użyciem botów. To narusza regulamin Best Buy i może skutkować trwałym banem IP oraz konsekwencjami prawnymi.
Konfiguracja ProxyHat — krok po kroku
ProxyHat oferuje proxy rezydentne, mobilne i datacenter z geo-targetingiem na poziomie kraju i miasta. Do scrapowania Best Buy rekomendujemy proxy rezydentne USA.
Parametry połączenia
| Parametr | Wartość |
|---|---|
| Gateway | gate.proxyhat.com |
| Port HTTP | 8080 |
| Port SOCKS5 | 1080 |
| Format URL HTTP | http://USERNAME:PASSWORD@gate.proxyhat.com:8080 |
| Format URL SOCKS5 | socks5://USERNAME:PASSWORD@gate.proxyhat.com:1080 |
Flagi w nazwie użytkownika
# Kraj + miasto + sesja sticky
user-country-US-city-chicago-session-abc123:pass
# Tylko kraj (rotacja per-request)
user-country-US:pass
# SOCKS5 z geo-targetingiem
socks5://user-country-US-city-newyork-session-nyc01:pass@gate.proxyhat.com:1080
Szczegóły cennika znajdziesz na stronie cen ProxyHat. Więcej o przypadkach użycia przeczytasz na stronie web scraping oraz SERP tracking. Pełną dokumentację techniczną znajdziesz pod adresem docs.proxyhat.com.
Najważniejsze wnioski (Key Takeaways)
- Oficjalne API Best Buy jest limitowane i nie zapewnia dostępności per-sklep — HTML scraping jest często jedyną opcją dla monitoringu inventory.
- Akamai Bot Manager (
_abck,bm_sz) blokuje datacenter IP w ciągu kilku żądań — używaj proxy rezydentnych z geo-targetingiem miasta. - Endpoint
/productfulfillmentzwraca ustrukturyzowane JSON z ceną i dostępnością per kod pocztowy — wymaga poprawnych ciasteczek Akamai. - Sticky sesje per kod pocztowy (np.
-session-chi60601) utrzymują ciasteczka i zmniejszają ryzyko challenge'ów. - Tempo max ~40 żądań/min per sesja, z exponential backoff przy 403.
- curl_cffi z impersonate jest konieczne do emulacji TLS fingerprint przeglądarki.
- Etyka: scrapuj tylko publiczne dane katalogowe, nie automatyzuj checkout, przestrzegaj robots.txt i regulaminu.
Często zadawane pytania (FAQ)
Czym jest scrapowanie cen i stanu magazynowego Best Buy w 2026?
To proces automatycznego pobierania danych o cenach i dostępności produktów ze strony bestbuy.com, z pominięciem oficjalnego API. Wymaga proxy rezydentnych z geo-targetingiem na miasta USA, aby uzyskać poprawne dane o dostępności w sklepach stacjonarnych. W 2026 roku kluczowe jest obejście Akamai Bot Manager i użycie bibliotek emulujących TLS fingerprint przeglądarki, takich jak curl_cffi.
Dlaczego scrapowanie Best Buy jest ważne dla użytkowników proxy?
Best Buy jest jednym z największych retailerów elektroniki w USA, a dane o cenach i dostępności są kluczowe dla price tracking, inventory monitoring i competitive intelligence. Proxy rezydentne z geo-targetingiem miasta są niezbędne, ponieważ dostępność jest per-lokacja, a Akamai Bot Manager skutecznie blokuje ruch z centrów danych już po kilku żądaniach.
Który typ proxy działa najlepiej do scrapowania Best Buy?
Proxy rezydentne USA z geo-targetingiem na poziomie miasta (np. -country-US-city-chicago) są optymalne. Zapewniają ruch z prawdziwych adresów ISP, który Akamai traktuje jako organiczny. Proxy datacenter są blokowane w ciągu 2–5 żądań. Proxy mobilne również działają, ale są droższe i nie oferują precyzyjnego geo-targetowania na miasta.
Jak uniknąć blokad przy scrapowaniu Best Buy?
Używaj curl_cffi z parametrem impersonate="chrome131" dla emulacji TLS fingerprint, utrzymuj tempo max 40 żądań/minutę per sesja, stosuj sticky sessions per kod pocztowy, rotuj sesję po 40 żądaniach lub po HTTP 403, zastosuj exponential backoff (2s, 4s, 8s) przy challenge'ach Akamai, i zawsze najpierw pobierz stronę HTML produktu przed wywołaniem endpointu JSON /productfulfillment, aby uzyskać poprawne ciasteczka _abck i bm_sz.
Czy oficjalne Best Buy API wystarcza do monitorowania cen?
Oficjalne Best Buy Products API (developer.bestbuy.com) jest wystarczające dla ogólnokrajowych cen i metadanych produktów, ale nie zapewnia dostępności per-sklep stacjonarny. Wymaga rejestracji i zatwierdzenia, a limity żądań są niskie (często poniżej 100 req/s). Dla monitoringu dostępności w sklepach stacjonarnych HTML scraping z proxy rezydentnymi jest koniecznością.






