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-city-chicago:pass@gate.proxyhat.com:8080
Dla każdego kodu pocztowego używasz odpowiedniego miasta:
- Nowy Jork (10001) →
user-country-US-city-newyork - Los Angeles (90001) →
user-country-US-city-losangeles - Chicago (60601) →
user-country-US-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-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-session-{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-session-{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 (-session-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-session-zip60601-country-US-city-chicago:pass@gate.proxyhat.com:8080
# Nowy Jork — session per zip
http://user-session-zip10001-country-US-city-newyork:pass@gate.proxyhat.com:8080
# Los Angeles — session per zip
http://user-session-zip90001-country-US-city-losangeles: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-city-chicago:pass@gate.proxyhat.com:8080 - SOCKS5:
socks5://user-country-US-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).
Najważniejsze wnioski (Key Takeaways)
- Akamai Bot Manager blokuje datacenter IP po 2–5 żądaniach — używaj residential proxy.
- Store-level availability wymaga US residential proxy z city geo-targetingiem.
- Sticky session per zip jest kluczowa — Akamai powiązuje ciasteczka z IP.
- curl_cffi z impersonate="chrome120" znacznie zwiększa sukces rate vs zwykły requests.
- Endpoint /productfulfillment zwraca JSON z ceną i dostępnością dla danego zip code.
- Etyka — scrapuj tylko publiczne dane, nie automatyzuj checkoutu, rozważ oficjalne API gdy wystarcza.
FAQ
Czym jest scraping cen i dostępności Best Buy w 2026?
To proces automatycznego pobierania danych o cenach produktów i ich dostępności w sklepach fizycznych Best Buy przy użyciu residential proxy i bibliotek takich jak curl_cffi. Wymaga obejścia systemu Akamai Bot Manager oraz geo-targetingu na poziomie miasta, ponieważ dostępność jest zależna od lokalizacji sklepu.
Dlaczego scraping Best Buy wymaga proxy?
Best Buy chroni stronę za pomocą Akamai Bot Manager, który blokuje datacenter IP po kilku żądaniach. Residential proxy z geo-targetingiem na poziomie miasta (np. Chicago) pozwala symulować ruch realnego użytkownika z danej lokalizacji, co jest kluczowe dla pobierania store-level availability.
Który typ proxy najlepiej nadaje się do Best Buy?
Najlepiej sprawdzają się US residential proxy z geo-targetingiem na poziomie miasta, np. user-country-US-city-chicago. Datacenter proxy są blokowane przez Akamai po 2–5 żądaniach. Mobile proxy są bardzo skuteczne, ale droższe — używaj ich tylko dla najtrudniejszych przypadków.
Jak uniknąć blokad przy scrapowaniu Best Buy?
Używaj sticky session per zip code, utrzymuj ≤10 req/s na IP, zachowuj ciasteczka Akamai (_abck, bm_sz) w sesji, stosuj backoff 5–15s przy HTTP 403, używaj curl_cffi z impersonate="chrome120" dla poprawnego TLS fingerprintu i monitoruj rate 403 — jeśli przekracza 5%, zmniejsz concurrency.






