Walmart bazı ürünlerin fiyatlarını günde birden çok kez değiştiriyor. Bunu programatik olarak izlemeye çalıştıysanız, acısını bilirsiniz: betiğiniz 20 dakika çalışır, sonra sessizce normal 200 OK yanıtı gibi görünen CAPTCHA sayfaları döndürmeye başlar.
Thunderbit bünyesindeki veri çıkarma çalışmalarımız kapsamında Walmart'ın bot karşıtı savunmalarıyla epey zaman geçirdim ve öğrendiğim her şeyi paylaşmak istiyorum: gerçekte işe yarayan yöntemler, verinizi zehirleyen sessiz hatalar ve kendi kazıyıcınızı yazmak, bir scraping API için ödeme yapmak ya da doğrudan kod yazmadan bir araç kullanmak arasındaki dürüst artı-eksi dengesi. Bu rehber üç çıkarım yöntemini kapsıyor (HTML ayrıştırma, __NEXT_DATA__ JSON'u ve dahili API yakalama), çoğu anlatımın tamamen atladığı üretime hazır hata yönetimini ve doğru yaklaşımı seçmek için net bir karar çerçevesini içeriyor. Python yazıyor olun ya da öğleye kadar fiyatlarla dolu bir tablo istiyor olun, burada size göre bir şey var.
Neden Walmart'ı Python ile Kazımak?
Walmart, gelir açısından dünyanın en büyük perakendecisi — FY2025'te 680,985 milyar $ — ve Fortune Global 500'de 12 yıl üst üste 1. sırada yer alıyor. Site yaklaşık 420 milyon canlı listeleme barındırıyor; Walmart CFO’su pazaryerinde "yarım milyar SKU" bulunduğunu söylüyor. Bu listelemelerin yaklaşık %95’i üçüncü taraf satıcılardan geliyor; bu da katalogun oldukça değişken olduğu anlamına gelir — satıcılar girip çıkar, varyantlar değişir ve stoklar her gün dalgalanır.

Bu değişkenlik, kazımanın neden önemli olduğunu açıklıyor. Üç aylık bir rapor, gece çalışan bir kazıyıcının yakalayabileceğini yakalayamaz. En yaygın kullanım senaryoları şunlar:
| Kullanım Senaryosu | Kimler İçin | Neleri Çıkarır |
|---|---|---|
| Rakip fiyat takibi | E-ticaret operasyonları, yeniden fiyatlama araçları | Fiyatlar, promosyonlar, MAP uyumu |
| Ürün kataloğu zenginleştirme | Satış ve merchandising ekipleri | Açıklamalar, görseller, teknik özellikler, varyantlar |
| Stok uygunluğu takibi | Tedarik zinciri, dropshipper’lar | Envanter durumu, satıcı bilgisi |
| Pazar araştırması ve trend analizi | Pazarlama, ürün yöneticileri | Puanlar, yorumlar, kategori çeşitliliği |
| Lead generation | Satış ekipleri | Satıcı adları, ürün sayıları, kategoriler |
Sadece rakip fiyat takibi yazılımı pazarı 2025'te 1,92 milyar $ seviyesine ulaştı ve 2033'e kadar 5,09 milyar $'a çıkması bekleniyor. Tüketici davranışı da bu harcamayı körüklüyor: Müşterilerin %94’ü online alışverişte fiyat karşılaştırması yapıyor, %83'ü ise birden fazla sitede kıyaslama yapıyor.
Bu işin varsayılan dili Python. Apify'nin 2026 Infrastructure Report'una göre web kazımanın %71,7’si Python ile yapılıyor ve temel kütüphane (requests) haftada yaklaşık 30 milyon indirme alıyor. Ölçek ne olursa olsun kazıyorsanız, büyük olasılıkla bunu Python ile yapıyorsunuz.
Walmart Neden Kazıması En Zor Sitelerden Biri?
Walmart'ın zor olmasının nedeni, iki ticari anti-bot ürününü art arda çalıştırması: kenar WAF ve TLS parmak izi katmanı olarak Akamai Bot Manager ve davranışsal JavaScript meydan okuma katmanı olarak PerimeterX (yeniden markalanmış HUMAN Security). Scrape.do bu birleşimi "nadir ve aşılması son derece zor" diye tanımlıyor.

ScrapeOps, Walmart'ı genel kazıma zorluğunda 10 üzerinden 9 olarak değerlendiriyor; yalnız Akamai bile 9/10. Deneyimlerime göre bu değerlendirme oldukça yerinde.
Aslında karşı karşıya olduğunuz şey şu:
Akamai Bot Manager, TLS parmak izinizi (JA3/JA4 hash), HTTP/2 çerçeve sırasını, başlıkların sıralanışını ve büyük/küçük harf kullanımını, ayrıca oturum çerezlerini (_abck, ak_bmsc) inceler. Standart bir Python requests çağrısı, gerçek bir tarayıcının üretmediği bir TLS parmak izi gönderir — Akamai isteğiniz Walmart sunucularına ulaşmadan bunu işaretler.
PerimeterX/HUMAN, Akamai'den sonra devreye girer ve navigator özelliklerini, canvas çıktısını, WebGL'i, audio context'i ve davranışsal biyometrileri (fare hareketi, kaydırma hızı, tuşlama dinamiği) kontrol eden JavaScript parmak izi alma (px.js) çalıştırır. Görünen başarısızlık, meşhur "Press & Hold" meydan okumasıdır — davranış sinyalleri örneklenirken yaklaşık 10 saniye basılı tutmanız gereken bir düğme. Oxylabs bunu açıkça söylüyor: "Walmart, PerimeterX tarafından sunulan ve kodunuzla çözülmesi neredeyse imkânsız olduğu bilinen 'Press & Hold' CAPTCHA modelini kullanıyor."
Gerçekten tehlikeli davranış ise sessiz engel. Walmart, 403 yerine CAPTCHA gövdesiyle HTTP 200 döndürüyor. ScrapingBee bunu doğruluyor: "Walmart, CAPTCHA sayfası sunarken bile 200 OK durum kodu döndürüyor. İsteğinizin başarılı olup olmadığını anlamak için yalnızca durum koduna güvenemezsiniz." Betiğiniz CAPTCHA HTML'ini gayet sakin bir şekilde "ürün bulunamadı" diye ayrıştırıp devam eder. Veri setinizin yarısı çöp olur ve bunu fark etmezsiniz.
Bir de mağaza kapsamlı veri sorunu var. Walmart fiyatları ve envanteri konuma göre değişir; locDataV3 ve assortmentStoreId gibi çerezlerle kontrol edilir. Doğru çerezler olmadan "varsayılan ulusal" veri alırsınız; bu veri eksiksiz görünebilir ama gerçek alışveriş yapanların gördüğüyle uyuşmaz. Eksik çerezler bir blok sayfası üretmez — hatalı ama görünür bir başarısızlık göstermeyen veri üretir; bu daha kötüdür.
Walmart'tan Veri Çıkarmanın Üç Yolu (ve Karşılaştırması)
Adım adım anlatıma geçmeden önce, üç ana çıkarım yaklaşımı şunlar. Rakip rehberlerin çoğu yalnızca birini ya da ikisini ele alıyor. Size uygun olanı seçebilmeniz için üçünü de anlatacağım.
| Yöntem | Güvenilirlik | Veri Tamlığı | Anti-Bot Zorluğu | Bakım Yükü |
|---|---|---|---|---|
| HTML + BeautifulSoup | ⚠️ Düşük (seçiciler her dağıtımda bozulur) | Orta | Yüksek | Yüksek |
__NEXT_DATA__ JSON | ✅ İyi | Yüksek | Orta-Yüksek | Orta |
| Dahili API yakalama | ✅ En iyi | En yüksek (varyantlar, stok, yorumlar) | Orta-Yüksek | Düşük (yapılandırılmış JSON) |
| Thunderbit (kodsuz) | ✅ İyi | Yüksek | Düşük (AI tarafından yönetilir) | Yok |
HTML ayrıştırma Walmart için en kötü seçenek — site, her dağıtımda değişen hash'li CSS sınıf adlarıyla Next.js paketleri gönderiyor. __NEXT_DATA__ JSON yöntemi, 2024–2026 arasında ciddi Walmart kazıyıcılarının kullandığı pragmatik çözüm. Dahili API yakalama en güçlü yöntemdir, ancak çoğu anlatımın üstünü örttüğü bazı uyarıları vardır. Hiç özel bir boru hattına ihtiyacınız yoksa Thunderbit doğru tercihtir.
Walmart kazıma için Thunderbit'i deneyin
Walmart'ı Kazımak İçin Python Ortamınızı Kurma
İhtiyacınız olanlar:
- Zorluk: Orta seviye
- Gerekli Süre: Kurulum için ~30 dakika, ardından kodlama süresi
- İhtiyacınız Olanlar: Python 3.10+, pip, bir kod editörü ve (üretim kullanımı için) proxy hizmeti veya scraping API
Proje klasörünü ve sanal ortamınızı oluşturun:
mkdir walmart-scraper && cd walmart-scraper
python -m venv venv
source venv/bin/activate # Windows'ta: venv\Scripts\activate
Gerekli kütüphaneleri yükleyin:
pip install curl_cffi parsel beautifulsoup4 lxml
curl_cffi, zor hedefleri kazımak için 2025 standardı haline geldi. Tam tarayıcı TLS parmak izlerini taklit edebilen bir libcurl bağlayıcısıdır. Bright Data şöyle açıklıyor: "Walmart, bot tespitinin bir parçası olarak TLS parmak izi kullanıyor ve User-Agent'ı gerçek bir tarayıcıyı taklit edecek şekilde ayarlamak bunu aşmaya yetmez." Sade requests veya httpx, başlıklara ne yazarsanız yazın Akamai'den geçemez. Farkı yaratan şey impersonate="chrome124" ile kullanılan curl_cffi'dir.
Ayrıca ileride ele alacağımız üretim desenleri için yerleşik json, csv, time, random ve logging modüllerine de ihtiyacınız olacak.
Adım Adım: Walmart Ürün Sayfalarını Python ile Kazıyın
Adım 1: Walmart Ürün Sayfasını Alın
İlk işiniz, hemen bloke edilmeyen bir HTTP isteği yapmak. İşte 2024–2026 arasında Scrapfly, Scrapingdog, Oxylabs ve ScrapeOps tarafından kullanılan klasik başlık seti:
from curl_cffi import requests
HEADERS = {
"User-Agent": (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/124.0.0.0 Safari/537.36"
),
"Accept": (
"text/html,application/xhtml+xml,application/xml;q=0.9,"
"image/avif,image/webp,*/*;q=0.8"
),
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Referer": "https://www.google.com/",
}
session = requests.Session(impersonate="chrome124")
url = "https://www.walmart.com/ip/Apple-AirPods-Pro-2nd-Generation/1752657021"
response = session.get(url, headers=HEADERS)
Buradaki ağır işi impersonate="chrome124" parametresi yapıyor. curl_cffi'ye Chrome 124'ün tam TLS ClientHello'sunu, HTTP/2 çerçeve sırasını ve sözde başlık sırasını eşleştirmesini söylüyor. Bu olmadan Akamai, bir Python'a özgü JA3 hash'i görür ve isteğiniz Walmart'ın uygulama katmanına ulaşmadan sizi engeller.
Engellenmiş yanıt nasıl görünür: Yanıt HTML başlığında "Robot or human?" görürseniz ya da yanıt walmart.com/blocked adresine yönlenirse, yakalanmışsınız demektir. Zor kısım şu: Walmart çoğu zaman CAPTCHA gövdesiyle birlikte 200 durum kodu döndürür — bu yüzden yalnızca response.ok kontrol etmek yeterli değildir.
Üretimde ya da tekrarlanan her kullanımda residential proxy'lere ihtiyacınız olacak. Datacenter IP'leri, Akamai'nin IP itibar sistemi tarafından anında yakılır. Hata yönetimi ve proxy stratejisinin tamamını aşağıdaki üretim bölümünde ele alacağım.
Adım 2: __NEXT_DATA__ JSON'undan Ürün Verisini Ayrıştırın
Walmart.com bir Next.js uygulamasıdır ve sunucu tarafında oluşturulan HTML, tam hydration yükünü tek bir script etiketi içine gömer: <script id="__NEXT_DATA__" type="application/json">. İşte altın madeniniz bu.
Scrapfly'nin 2026 rehberi bunu doğruluyor: "2026'da Walmart, __NEXT_DATA__ script etiketlerinde yapılandırılmış JSON ile Next.js kullanıyor; bu da gizli veri çıkarmayı geleneksel CSS seçici ayrıştırmadan daha güvenilir hale getiriyor." Yüksek profilli açık kaynak Walmart kazıyıcılarının hepsi — Scrapfly, Oxylabs, python-scrapy-playbook — bu yöntemi kullanıyor.
Bunu nasıl çıkaracağınız şöyle:
import json
from parsel import Selector
sel = Selector(text=response.text)
raw = sel.xpath('//script[@id="__NEXT_DATA__"]/text()').get()
data = json.loads(raw)
product = data["props"]["pageProps"]["initialData"]["data"]["product"]
idml = data["props"]["pageProps"]["initialData"]["data"].get("idml", {})
Çoğu anlatım burada durur. Aşağıda, gerçekten önem verdiğiniz alanlar için tam JSON yol haritası var — 2024–2026 arasındaki canlı Walmart sayfalarıyla doğrulanmıştır:
| Veri Alanı | JSON Yolu (initialData altında) | Tür | Notlar |
|---|---|---|---|
| Ürün Adı | data > product > name | String | — |
| Marka | data > product > brand | String | — |
| Güncel Fiyat (sayısal) | data > product > priceInfo > currentPrice > price | Float | Mağaza çerezine göre değişebilir |
| Güncel Fiyat (metin) | data > product > priceInfo > currentPrice > priceString | String | Örn. "$9.99" |
| Kısa Açıklama | data > product > shortDescription | HTML String | Metin için BeautifulSoup ile ayrıştırın |
| Uzun Açıklama | data > idml > longDescription | HTML String | product içinde DEĞİL, idml üzerinde yer alır — eski rehberlerin yanıldığı yer burasıdır |
| Tüm Görseller | data > product > imageInfo > allImages | Dizi | {id, url} nesnelerinin listesi |
| Ortalama Puan | data > product > averageRating | Float | Anahtar rating değil, averageRating |
| Yorum Sayısı | data > product > numberOfReviews | Integer | — |
| Varyantlar | data > product > variantCriteria | Dizi | Seçenek grupları (beden, renk) |
| Kullanılabilirlik | data > product > availabilityStatus | String | IN_STOCK, OUT_OF_STOCK, LIMITED_STOCK |
| Satıcı | data > product > sellerDisplayName | String | — |
| Üretici | data > product > manufacturerName | String | — |
Buradaki asıl tuzak longDescription yoludur. 2023'te bir ScrapeHero yazısı bunu product.longDescription olarak konumlandırmıştı, ancak 2024+ kaynaklar bunu tutarlı biçimde kardeş idml anahtarına koyuyor. Her zaman önce idml.longDescription'ı okuyun, eski sayfalar için product.longDescription'a geri düşün.
Güvenli çıkarım kalıbı .get() zincirleriyle şöyle görünür:
def extract_product(data):
product = data["props"]["pageProps"]["initialData"]["data"]["product"]
idml = data["props"]["pageProps"]["initialData"]["data"].get("idml", {})
price_info = product.get("priceInfo", {})
current_price = price_info.get("currentPrice", {})
image_info = product.get("imageInfo", {})
return {
"name": product.get("name"),
"brand": product.get("brand"),
"price": current_price.get("price"),
"price_string": current_price.get("priceString"),
"short_desc": product.get("shortDescription"),
"long_desc": idml.get("longDescription", product.get("longDescription")),
"images": [img.get("url") for img in image_info.get("allImages", [])],
"rating": product.get("averageRating"),
"review_count": product.get("numberOfReviews"),
"variants": product.get("variantCriteria"),
"availability": product.get("availabilityStatus"),
"seller": product.get("sellerDisplayName"),
"manufacturer": product.get("manufacturerName"),
}
JSON yolu gezinmekle hiç uğraşmak istemeyenler için, Thunderbit'in AI'sı bu alanları otomatik olarak tanır ve yapılandırır — manuel yol eşleştirmesi gerekmez. "AI Suggest Fields" düğmesine tıklarsınız, sayfayı okur ve bir tablo elde edersiniz. Ama özel bir boru hattı kuruyorsanız, yukarıdaki harita sizin referansınız.
Adım 3: Daha Zengin Veri İçin Walmart'ın Dahili API Uç Noktalarını Yakalayın
Rakip makalelerin hiçbiri bu yöntemi düzgün anlatmıyor. Bu, en güçlü çıkarım yolu — ve en karmaşık olanı.
Walmart'ın ön yüzü, Apollo Gateway üzerine kurulu federated GraphQL arka ucunu çağırır. Uç noktalar www.walmart.com/orchestra/* altında yer alır:
/orchestra/pdp/graphql/...— ürün ayrıntısı hydration'ı + varyant değişimleri/orchestra/snb/graphql/...— search-n-browse sayfalama/orchestra/reviews/graphql/...— sayfalanmış yorumlar
Bunlar, __NEXT_DATA__'nın bazen kırptığı verilerle temiz, yapılandırılmış JSON döndürür — varyant düzeyinde fiyatlandırma, gerçek zamanlı stok sayıları, tam yorum sayfalaması.
Blog yazılarının üstü kapalı geçtiği kritik nokta: Walmart Apollo persisted query kullanıyor. İstek gövdesi yalnızca SHA-256 hash'i (persistedQuery.sha256Hash) gönderir, sorgu metni göndermez. Hash sunucu tarafından bilinmiyorsa PersistedQueryNotFound alırsınız. Walmart bu hash'leri dağıtımlarda döndürür. Bu yüzden yüksek profilli açık kaynak Walmart kazıyıcılarının hiçbiri kopyala-yapıştır yapılabilir /orchestra/ kodu yayınlamaz.
Bu yöntemin pratik ve dürüst hali bir DevTools çalışmasıdır:
- Chrome'da bir Walmart ürün sayfası açın
- DevTools → Network sekmesini açın, "Fetch/XHR" ile filtreleyin
- Sayfada normal şekilde gezinin — varyantlara tıklayın, yorumlara kaydırın, mağaza konumunu değiştirin
- Ürün verisi döndüren
/orchestra/*uç noktalarına yapılan istekleri arayın - İsteğe sağ tıklayın → "Copy as cURL"
- cURL komutunu
curl_cffikullanarak Python'a dönüştürün
Yeniden oynatılan bir API çağrısı şöyle görünür:
import json
from curl_cffi import requests
session = requests.Session(impersonate="chrome124")
# Önce ürün sayfasını ziyaret ederek oturumu ısıtın
session.get("https://www.walmart.com/ip/some-product/1234567", headers=HEADERS)
# Ardından dahili API çağrısını yeniden oynatın (DevTools'tan kopyalanmış)
api_url = "https://www.walmart.com/orchestra/pdp/graphql"
api_headers = {
**HEADERS,
"accept": "application/json",
"content-type": "application/json",
"referer": "https://www.walmart.com/ip/some-product/1234567",
"wm_qos.correlation_id": "kopyaladığınız-correlation-id",
}
payload = {
# DevTools'taki tam istek gövdesini yapıştırın
"variables": {"productId": "1234567"},
"extensions": {
"persistedQuery": {
"version": 1,
"sha256Hash": "kopyaladığınız-hash"
}
}
}
api_response = session.post(api_url, headers=api_headers, json=payload)
api_data = api_response.json()
Oturumu ısıtma adımı kritik. Walmart'ın PerimeterX çerezleri (_px3, _pxhd, ACID) API çağrısı başarılı olmadan önce ilk HTML çekiminden gelmiş olmalıdır. Bunlar olmadan 412 veya 403 alırsınız.
Bu yöntemi ne zaman kullanmalısınız: __NEXT_DATA__ içinde olmayan veriye ihtiyaç duyduğunuzda — derin varyant fiyatları, ilk partinin ötesindeki sayfalanmış yorumlar ya da gerçek zamanlı envanter sayıları. Çoğu kullanım için __NEXT_DATA__ yeterlidir ve çok daha basittir.
Walmart Arama Sonuçlarını ve Çoklu Sayfaları Kazımak
Arama sonuçları benzer bir __NEXT_DATA__ desenini izler, ancak JSON yolu farklıdır:
search_url = "https://www.walmart.com/search?q=laptops&page=1"
response = session.get(search_url, headers=HEADERS)
sel = Selector(text=response.text)
raw = sel.xpath('//script[@id="__NEXT_DATA__"]/text()').get()
data = json.loads(raw)
search_result = data["props"]["pageProps"]["initialData"]["searchResult"]
items = search_result["itemStacks"][0]["items"]
# Sponsorlu ürünleri filtrele
organic_items = [i for i in items if i.get("__typename") == "Product"]
for item in organic_items:
print(item.get("name"), item.get("priceInfo", {}).get("currentPrice", {}).get("price"))
Sayfalama, page parametresini artırarak çalışır: &page=1, &page=2 vb. Ancak burada belgelenmemiş bir sınır var: Walmart, gerçek toplam sayıya bakmadan arama sonuçlarını 25 sayfayla sınırlar. Scrapfly bunu doğruluyor: "Walmart, erişilebilecek maksimum sonuç sayfası sayısını, mevcut toplam sayfa sayısından bağımsız olarak 25 ile sınırlar."
Daha derin kapsama ulaşmak için geçici çözümler:
- Sıralama yönünü ters çevirme: Aynı sorguyu önce
&sort=price_low, sonra&sort=price_highile çalıştırarak yaklaşık 50 sayfalık kapsama elde edin - Fiyat aralığına bölme: Kataloğu daha küçük pencerelere ayırmak için
&min_price=X&max_price=Yekleyin - Kategoriye göre bölme: Site genelinde aramak yerine belirli kategoriler içinde arayın
itemStacks'in bir dizi olduğuna dikkat edin. Scrapfly deposunda [0] değerini sabitler, ancak kategori ve göz atma sayfaları bazen birden fazla yığın içerir ("Top picks", "More results"). Sağlam desen, tüm yığınları dolaşır:
for stack in search_result.get("itemStacks", []):
for item in stack.get("items", []):
if item.get("__typename") == "Product":
# öğeyi işle
pass
Bir başka önemli nokta: Walmart'ın robots.txt dosyası [/search] yolunu yasaklıyor. Ürün detay sayfaları (/ip/...) ve çoğu kategori sayfası (/cp/...) yasaklanmış değil. Uyumluluk konusunda endişeniz varsa, arama yerine ürün sayfaları ve kategori ağaçlarıyla başlayın.
Sessiz Engeller Verinizi Bozmasın: Üretime Hazır Hata Yönetimi
Çoğu anlatım tam burada dağılıyor. Size bir sayfayı nasıl çekeceğinizi, bir ürünü nasıl ayrıştıracağınızı gösteriyor ve bitti sanıyor. Üretimde ise binlerce sayfa çekiyorsunuz ve Walmart sizi aktif olarak durdurmaya çalışıyor. Demo kazıyıcı ile gerçekten çalışan kazıyıcı arasındaki fark, hatayı nasıl yönettiğinizdir.
Sessiz Engeller Verinizi Bozmadan Önce Tespit Edin
Bir Walmart kazıyıcısındaki en önemli fonksiyon blok tespitidir. ScrapingBee, Scrapingdog, Oxylabs ve Decodo genelinde satıcı görüş birliğine göre dört bağımsız kontrol gerekir:
BLOCK_MARKERS = (
"Robot or human",
"Press & Hold",
"Press & Hold",
"px-captcha",
"perimeterx",
)
def is_walmart_blocked(response) -> bool:
# 1. Özel blok uç noktasına yönlendirme
if "/blocked" in str(response.url):
return True
# 2. Sert durum kodları
if response.status_code in (403, 412, 428, 429, 503):
return True
# 3. CAPTCHA gövdesiyle 200 OK (sessiz engel durumu)
body = response.text or ""
if any(m.lower() in body.lower() for m in BLOCK_MARKERS):
return True
# 4. Yanıt uzunluğu kontrolü — gerçek PDP'ler 300-900 KB civarındadır
if len(response.content) < 50_000 and "/ip/" in str(response.url):
return True
return False
Dördüncü kontrol — yanıt uzunluğu — Walmart'ın bariz CAPTCHA işaretleri içermeyen ama ihtiyaç duyduğunuz ürün verisini de içermeyen kısaltılmış bir sayfa döndürdüğü durumları yakalar.
Üstel Geri Çekilme ve Jitter ile Yeniden Deneme Mantığı
Bir istek başarısız olduğunda Walmart'a hemen yüklenmek istemezsiniz. Standart desen, yeniden denemeleri birbirinden ayırmak için jitter içeren üstel geri çekilme kullanır:
import time
import random
import logging
from curl_cffi import requests as cffi_requests
log = logging.getLogger("walmart")
def fetch_with_retry(session, url, max_retries=5, base_delay=2, max_delay=60):
for attempt in range(max_retries):
try:
response = session.get(url, headers=HEADERS, timeout=15)
if response.status_code in (429, 503):
raise Exception(f"Hız sınırı: {response.status_code}")
if is_walmart_blocked(response):
raise Exception("Sessiz engel tespit edildi")
return response
except Exception as e:
if attempt == max_retries - 1:
raise
wait = min(max_delay, base_delay * (2 ** attempt)) + random.uniform(0, 3)
log.warning(f"Deneme {attempt + 1} başarısız: {e}. {wait:.1f}s sonra yeniden denenecek")
time.sleep(wait)
return None
Jitter (random.uniform(0, 3)) süs değildir — birden fazla kazıyıcı aynı saniyede yeniden deneme yapıp Akamai'nin hız algılayıcılarını tetiklemesin diye iş yükünü desenkronize eder.
Hız Sınırlama
Hem Thunderbit hem de Scrape.do Walmart için istek başına 3–6 saniyelik rastgele gecikmede birleşiyor: "Sayfa yüklemeleri arasında 3–6 saniye bekleyerek isteklerinizi sınırlayın ve gecikmeleri rastgeleleştirin."
import time
import random
def rate_limited_fetch(session, url):
response = fetch_with_retry(session, url)
time.sleep(random.uniform(3.0, 6.0))
return response
Ölçek büyüdüğünde asenkron hız sınırlama için aiolimiter kullanmayı düşünün:
from aiolimiter import AsyncLimiter
limiter = AsyncLimiter(max_rate=10, time_period=60) # dakikada 10 istek
Veri Doğrulama
Yanıt bloklanmamış olsa bile ayrıştırılan veri yanlış olabilir (yanlış mağaza, bozulmuş yük). Çıktıya yazmadan önce doğrulayın:
def validate_product(product):
"""Ürün verisi meşru görünüyorsa True döner."""
if not product.get("name"):
return False
price = (product.get("priceInfo") or {}).get("currentPrice", {}).get("price")
if not isinstance(price, (int, float)) or price <= 0:
return False
if product.get("availabilityStatus") not in ("IN_STOCK", "OUT_OF_STOCK", "LIMITED_STOCK"):
return False
return True
Oturum Kaydı
Her oturum için başarı oranınızı izleyin. 10 dakika boyunca %80'in altına düşerse, bir şey değişmiş demektir — IP'niz yakılmıştır, çerezlerinizin süresi dolmuştur ya da Walmart yeni bir anti-bot kuralı dağıtmıştır.
class ScrapeMetrics:
def __init__(self):
self.total = 0
self.success = 0
self.blocks = 0
self.errors = 0
def record(self, result):
self.total += 1
if result == "success":
self.success += 1
elif result == "blocked":
self.blocks += 1
else:
self.errors += 1
@property
def success_rate(self):
return (self.success / self.total * 100) if self.total > 0 else 0
def check_health(self):
if self.total > 20 and self.success_rate < 80:
log.critical(f"Başarı oranı % {self.success_rate:.1f}'e düştü — proxy değiştirmeyi veya duraklamayı düşünün")
Gösterişli değil. Ama verinizin temiz kalmasını sağlayan şey bu.
DIY Python mı, Scraping API mi, Kodsuz Araç mı: Walmart'ı Kazımak İçin Doğru Yolu Seçmek
Birçok geliştirici, bunun gerçekten doğru tercih olup olmadığını sormadan doğrudan özel bir kazıyıcı yazmaya atlıyor. ScrapeOps, Walmart'ı zorlukta 9/10 olarak değerlendiriyor. Forum kullanıcıları bunu "temelde 9/10" diye tanımlıyor ve "özel bir web scraping API'sinin aşırı olup olmayacağını" merak ediyor. Cevap; hacim, bütçe ve mühendislik kapasitesine bağlı.
| Faktör | DIY Python (requests + proxy'ler) | Scraping API (Oxylabs, Bright Data vb.) | Kodsuz Araç (Thunderbit) |
|---|---|---|---|
| İlk satıra kadar kurulum süresi | Saatler | 15–60 dk | ~2 dk |
| Üretime alma süresi | 40–80 saat | 4–16 saat | ~30 dk |
| Anti-bot yönetimi | Siz yönetirsiniz (zor) | Sağlayıcı yönetir | Otomatik yönetilir |
| Küçük ölçekte maliyet (<aylık 1K sayfa) | Düşük (proxy maliyeti ~$4–8/GB) | $40–$49/ay başlangıç planları | Ücretsiz–$15/ay |
| Ölçek maliyeti (aylık 100K+ sayfa) | İstek başına daha düşük | İstek başına daha yüksek | Değişken |
| Özelleştirme | Tam kontrol | API parametreleri | Arayüz/alanlarla sınırlı |
| Sürekli bakım | Aylık 4–8 saat | Neredeyse sıfır | Yok (AI uyum sağlar) |
| En uygun kullanım | Özel boru hattı kuran geliştiriciler | Orta ölçekli üretim kazıma | İş kullanıcıları, hızlı tek seferlik çıkarımlar |
DIY Python Ne Zaman Mantıklı?
DIY; zaten bir proxy sözleşmeniz varsa, başlıklar, posta kodu hedefleme veya satıcı kümeleri üzerinde sıkı kontrol gerekiyorsa, ayda milyonlarca sayfa indeksleyip kayıt başına API ücretlerinin birikmesini istemiyorsanız ya da on-prem veya uyumluluk güvencelerine ihtiyaç duyuyorsanız kazanır. Takas açıktır: sayfalama, yeniden deneme, proxy rotasyonu, TLS taklidi ve birden fazla sayfa türü şeması içeren üretime hazır bir Scrapy örümceği 40–80 saat kıdemli Python çalışması gerektirir; ayrıca Walmart parmak izlerini döndürdükçe ayda 4–8 saat bakım ister.
Bir Scraping API Ne Zaman Zaman Kazandırır?
Scraping API'leri anti-bot katmanını sizin için yönetir. ScrapeOps benchmark'ları, Walmart'ta Zyte API için %99 ve Scrape.do için %98 başarı oranı gösteriyor. ScraperAPI, Oxylabs ve Scrapingdog gibi araçlarda başlangıç fiyatları $40–$49/ay seviyesinde. 2–5 mühendislik ekipseniz ve kazıma hacminiz ayda 10K–1M sayfa arasındaysa, bir API neredeyse her zaman doğru tercihtir. İstek başına maliyeti sıfır bakımla takas edersiniz.
Kodsuz Seçenek Ne Zaman Doğru Tercih?
Thunderbit bambaşka bir profile hitap eder. Eğer bir PM, analist veya e-ticaret operatörüyseniz ve bu öğleden sonra, bir sonraki sprintte değil, Walmart ürün verisini bir tabloya almak istiyorsanız, dürüst cevap budur.
İş akışı şu şekilde: Thunderbit Chrome Uzantısı'nı kurun, bir Walmart ürün veya arama sayfasına gidin, "AI Suggest Fields" düğmesine tıklayın; Thunderbit'in AI'sı sayfayı okuyup sütunlar önerir (ürün adı, fiyat, puan vb.). "Scrape" düğmesine bastığınızda veri tabloya dolar. Excel, Google Sheets, Airtable veya Notion'a dışa aktarın — hepsi ücretsiz, paywall yok.
Thunderbit, anti-bot işlemlerini bulutta halleder; CAPTCHA, proxy veya TLS parmak iziyle uğraşmazsınız. AI, düzen değişikliklerine otomatik uyum sağlar; dolayısıyla bakım yoktur. JSON yolu gezinmekle hiç uğraşmak istemeyen kullanıcılar için en düşük dirençli yoldur.
Dürüst sınırlamalar: Thunderbit, günde 100K+ sayfa için tasarlanmamıştır. Kredi bütçeleri ve bulut limitleri, yüksek hacimli ingest'i ham API'lere kıyasla ekonomik olmaktan çıkarır. Ayrıca araç bunu desteklemiyorsa belirli bir posta kodu veya ASN sabitleyemezsiniz. Sürekli, yüksek hacimli boru hatları için DIY veya bir scraping API hâlâ en iyi yoldur.
Kabaca fiyatlandırma: Thunderbit'te 1.000 Walmart ürün satırı yaklaşık 2.000 krediye mal olur (~Starter/Pro planlarında $0,60–$1,10). Bu, Oxylabs'ın Walmart API'siyle karşılaştırılabilir ve düşük hacimde çoğu hobi seviyesi scraping API'sinden daha ucuzdur. Güncel ayrıntılar için Thunderbit fiyatlandırmasına bakın.
Yapay zeka ile Walmart ürün verisini kazıyın Get Started Free
Kazıdığınız Walmart Verisini Dışa Aktarma
Veriyi aldıktan sonra onu kullanışlı bir yere koymanız gerekir. Üç format çoğu ihtiyacı karşılar:
CSV — analistlerin gerçekten açtığı en yaygın format:
import csv
def export_csv(products, filename="walmart_products.csv"):
fieldnames = ["name", "price", "availability", "rating", "review_count", "seller", "url"]
with open(filename, "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=fieldnames, quoting=csv.QUOTE_MINIMAL)
writer.writeheader()
for p in products:
writer.writerow({k: p.get(k) for k in fieldnames})
Excel uyumluluğu için utf-8-sig kodlamasını kullanın. BOM işareti, Excel'in özel karakterleri bozmasını engeller.
JSONL — scraping boru hatları için üretim formatı:
import json
import gzip
def export_jsonl(products, filename="walmart_products.jsonl.gz"):
with gzip.open(filename, "at", encoding="utf-8") as f:
for p in products:
f.write(json.dumps(p, ensure_ascii=False) + "\n")
JSONL çökme güvenlidir (yarım kalan yazım yalnızca son satırı kaybettirir), sabit bellekle akıtılabilir ve varyantlar ile yorumlar gibi iç içe verileri olduğu gibi tutar.
Excel — tek seferlik analist teslimleri için:
from openpyxl import Workbook
def export_excel(products, filename="walmart_products.xlsx"):
wb = Workbook(write_only=True)
ws = wb.create_sheet("Products")
ws.append(["Ad", "Fiyat", "Uygunluk", "Puan", "Yorumlar", "Satıcı"])
for p in products:
ws.append([p.get("name"), p.get("price"), p.get("availability"),
p.get("rating"), p.get("review_count"), p.get("seller")])
wb.save(filename)
Thunderbit, Python kullanmayanlar için dışa aktarma tarafını da karşılar: Google Sheets, Airtable, Notion, Excel, CSV ve JSON'a tek tıkla dışa aktarma — temel planda hepsi ücretsiz. Sürekli izleme için Thunderbit'in planlanmış kazıyıcı özelliği tekrar eden çıkarımları otomatik olarak çalıştırabilir.
Zamanlama konusunda bir not: Walmart kazıma için GitHub Actions kullanmayın. GitHub Actions çalıştırıcıları, Walmart'ın anti-bot sisteminin anında engellediği Azure IP aralıklarında yer alır. Bir VPS üzerinde APScheduler kullanın veya tüm trafiği residential proxy'ler üzerinden yönlendirin.
Walmart Kazıma İçin Yasal ve Etik Yönergeler
Forum kullanıcıları bu endişeyi açıkça dile getiriyor: "Geliştiricilerle kedi-fare oynamakta sorun yaşamam ama hukuk ekipleriyle oynamaktan çekiniyorum."
Walmart Kullanım Şartları, "herhangi bir robot, örümcek… ya da başka bir manuel veya otomatik cihazı" "herhangi bir materyali almak, indekslemek, 'scrape etmek', 'data mine etmek' veya başka şekilde toplamak" için açık yazılı onay olmadan kullanmayı açıkça yasaklıyor.
Walmart'ın robots.txt dosyası /search, /account, /api/ ve düzinelerce dahili uç noktayı yasaklıyor. Ürün detay sayfaları (/ip/...) ve yorumlar (/reviews/product/) yasaklı değil.
hiQ v. LinkedIn emsali (9. Daire, 2022), kamuya açık verileri kazımanın federal CFAA'yı ihlal etmesinin olası olmadığını ortaya koydu. Ancak aynı mahkeme daha sonra hiQ'nun LinkedIn Kullanıcı Sözleşmesi'ni ihlal ettiğine hükmetti ve aleyhine $500.000'lık bir sulh kararı girdi. Daha yakın tarihli 2024 kararları (Meta v. Bright Data, X Corp. v. Bright Data) CFAA'yı daha da daralttı ve telif önceliği savunmaları oluşturdu; ancak bu kararlar Walmart'a birebir uymayan belirli ToU diline dayanıyordu.
Pratik yönergeler: Sunucuları aşırı yüklemeyin. Hız sınırlarına uyun. Kişisel veya kullanıcı verisi kazımayın. Veriyi sorumlu kullanın. Kamuya açık Walmart ürün sayfalarını kişisel araştırma için makul bir hızda kazımak, ticari ölçekte ve Walmart'ın şartlarına aykırı kazımaktan çok farklı bir risk profilidir. Walmart verisi üzerinde bir ürün geliştiriyorsanız, bir avukata danışın ve Walmart'ın resmi affiliate ve satıcı API'lerini inceleyin.
Sorumluluk reddi: Bu içerik eğitim amaçlıdır, hukuki tavsiye değildir.
Sonuç ve Temel Çıkarımlar
Python ile Walmart kazımak, çift katmanlı Akamai + PerimeterX anti-bot yığını nedeniyle 10 üzerinden 9 zorlukta bir iştir. İmkânsız değil — ama doğru araçlara ve kalıplara ihtiyacınız var.
Temel çıkarımlar:
__NEXT_DATA__JSON çıkarımı, çoğu kullanım için en pragmatik seçimdir. 2024–2026 arasındaki ciddi açık kaynak Walmart kazıyıcılarının hepsi bunu kullanır. Temel yol, PDP'ler içinprops.pageProps.initialData.data.product, arama/göz atma içinsearchResult.itemStacks'tir.impersonate="chrome124"ilecurl_cffizorunludur. Saderequestsveyahttpx, başlıklar ne olursa olsun Akamai'nin TLS parmak izinden geçemez.- Sessiz bloklar asıl tehlikedir. Walmart CAPTCHA gövdeleriyle 200 OK döndürür. Yalnızca durum kodunu değil, yanıt içeriğini kontrol edin.
- Üretim kazıyıcıları, mutlu yol kodundan fazlasına ihtiyaç duyar. Jitter içeren üstel geri çekilme, dört sinyalle blok tespiti, istek başına 3–6 saniye hız sınırlama, veri doğrulama ve oturum sağlığı izleme zorunludur.
/orchestra/*üzerinden dahili API yakalama güçlü ama kırılgandır. Bunu, özel veri ihtiyaçları için bir DevTools alıştırması olarak kullanın; birincil çıkarım yönteminiz olarak değil.- Walmart arama sonuçlarını 25 sayfayla sınırlar. Sıralama yönünü ters çevirme ve fiyat aralığına bölme ile daha geniş kapsama gidin.
- Yaklaşımınızı dürüstçe seçin: Özel ihtiyaçları ve yüksek hacmi olan geliştiriciler için DIY Python. Scraping mühendisi olmayan orta ölçekli ekipler için scraping API'leri. Bu öğleden sonra veriyi Google Sheets'te isteyen iş kullanıcıları için Thunderbit.
Kodsuz yolu denemek isterseniz, Thunderbit Chrome Uzantısı ücretsiz bir katman sunar — birkaç Walmart sayfasını kazıyıp sonucu kendiniz görebilirsiniz. Python yoluna gidecekseniz, bu makaledeki kod kalıpları üretimde test edilmiştir. Her iki durumda da artık Walmart'ın savunmalarının haritasına ve içinden geçmenin üç yoluna sahipsiniz.
Daha fazla web kazıma tekniği için şu rehberlerimize göz atın: Python ile web kazıma nasıl yapılır, en iyi otomatik web kazıma araçları ve engellenmeden web kazıma. Ayrıca Thunderbit YouTube Kanalı üzerindeki eğitim videolarını da izleyebilirsiniz.
SSS
Walmart ürün verisini kazımak yasal mı?
Walmart Kullanım Şartları, yazılı onay olmadan otomatik kazımayı yasaklıyor. 9. Daire'nin hiQ v. LinkedIn kararı (2022), federal CFAA'nın kamuya açık sayfaların kazınmasına uygulanmasının olası olmadığını ortaya koydu; ancak aynı dava, kazıyıcı aleyhine $500.000'lık sözleşme ihlali kararıyla sonuçlandı. Kamuya açık ürün sayfalarını kişisel araştırma için makul oranlarda kazımak, ticari ölçekteki çıkarımdan çok farklı bir risk profili taşır. Walmart verisi üzerinde iş kuruyorsanız bir avukata danışın.
Walmart kazıyıcım neden sürekli engelleniyor?
En yaygın nedenler şunlar: Sade requests veya httpx kullanmak (Akamai'nin anında işaretlediği Python'a özgü bir TLS parmak izi üretirler), eksik veya yanlış başlıklar, proxy rotasyonunun olmaması, istek hızının sayfa başına 3–6 saniyeden hızlı olması ve oturum çerezlerinin (_px3, _abck, locDataV3) eksik olması. impersonate="chrome124" ile curl_cffi'ye geçin, residential proxy'ler kullanın ve bu makalede anlatılan blok tespiti ile yeniden deneme kalıplarını uygulayın.
Python ile Walmart'tan hangi verileri kazıyabilirim?
Ürün adları, fiyatlar (güncel ve indirim sonrası), görseller, kısa ve uzun açıklamalar, puanlar, yorum sayıları, stok uygunluk durumu, satıcı adları, üretici bilgisi, varyant seçenekleri (beden, renk) ve kategori konumu. __NEXT_DATA__ yöntemiyle bunların hepsi yapılandırılmış JSON olarak alınabilir. Dahili API yakalama ayrıca varyant düzeyinde fiyatlandırma, gerçek zamanlı envanter sayıları ve sayfalanmış yorum verileri döndürebilir.
Walmart'ı kazımak için proxy gerekli mi?
Evet, üretim veya tekrarlanan her kullanım için. Walmart'ın anti-bot sistemleri sade istekleri tutarlı biçimde engelliyor — başlıklar mükemmel olsa bile residential olmayan bir IP, Akamai'nin IP itibar sistemi tarafından işaretlenir. Residential veya mobil proxy gereklidir. Datacenter IP'leri neredeyse anında yanar. Proxy sağlayıcınıza ve seviyenize bağlı olarak 1.000 sayfa başına kabaca $3–$17 bütçe ayırın.
Kod yazmadan Walmart kazıyabilir miyim?
Evet. Thunderbit, Walmart'ı iki tıkta kazıyan yapay zekâ destekli bir Chrome uzantısıdır: ürün veri sütunlarını otomatik algılamak için "AI Suggest Fields", ardından veriyi çıkarmak için "Scrape". Anti-bot zorluklarını bulutta yönetir ve veriyi doğrudan Excel, Google Sheets, Airtable veya Notion'a dışa aktarır — hepsi ücretsiz. Hızlıca veri isteyen analistler, PM'ler ve iş kullanıcıları için uygundur; özel bir boru hattı kurmadan çalışır. Yüksek hacimli veya çok özelleştirilmiş kazıma için Python veya bir scraping API hâlâ daha iyi seçimdir.
Yapay zekâ ile Walmart kazıma için Thunderbit'i deneyin Get Started Free
Daha Fazla Bilgi


