Walmart 會在一天內多次調整部分商品的價格。 如果你曾經想用程式方式追蹤這些變化,你一定懂那種痛苦:腳本明明跑得好好的,20 分鐘後卻悄悄開始回傳偽裝成正常 200 OK 的 CAPTCHA 頁面。
我在 的資料擷取工作中,花了很多時間研究 Walmart 的反機器人防護機制。這篇文章想把我學到的東西一次整理給你——哪些方法在 2025 年真的有效、哪些「無聲失敗」會污染你的資料,以及自己寫爬蟲、付費用抓取 API、或直接用無程式碼工具之間,該怎麼做出務實選擇。這份指南會涵蓋三種擷取方法(HTML 解析、__NEXT_DATA__ JSON、內部 API 攔截)、許多教學都完全略過的生產級錯誤處理,以及幫你判斷最適合方案的實用決策框架。無論你是要寫 Python,還是只想在中午前把價格資料整理成試算表,這裡都找得到答案。
為什麼要用 Python 抓取 Walmart?
Walmart 以營收計算是全球最大零售商之一——在 2025 財年創下 ,並且連續 。網站上大約有 ,而 Walmart 財務長甚至提到市集上有 。其中約 ,這代表商品目錄非常動態——賣家進出頻繁、變體常改、庫存每天都在變。

也正因為這種波動性,抓取才有價值。季度報告永遠捕捉不到每晚爬取能看到的變化。以下是我最常見的使用情境:
| 使用情境 | 需求對象 | 擷取內容 |
|---|---|---|
| 競爭對手價格監控 | 電商營運、動態定價工具 | 價格、促銷、MAP 合規 |
| 商品目錄補強 | 業務與商品陳列團隊 | 商品描述、圖片、規格、變體 |
| 庫存可用性追蹤 | 供應鏈、代發貨商 | 庫存狀態、賣家資訊 |
| 市場研究與趨勢分析 | 行銷、產品經理 | 評分、評論、分類品項組合 |
| 開發潛在客戶 | 業務團隊 | 賣家名稱、商品數量、分類 |
單是 ,並預估到 2033 年會成長至 50.9 億美元。消費者行為也推動了這個需求:,而且 83% 會跨多個網站比較。
Python 是這類工作的預設語言。根據 Apify 的 2026 Infrastructure Report,,而核心套件 requests 每週下載量大約有 。只要你有一定規模的爬取需求,幾乎一定會用 Python。
為什麼 Walmart 是最難抓的網站之一
Walmart 難抓,原因是它把 兩套商業級反機器人產品串聯起來:前端邊緣 WAF 與 TLS 指紋識別層使用 ,再接上行為式 JavaScript 挑戰層 。Scrape.do 形容這種組合「罕見,而且極難繞過」。

,單看 Akamai 也是 9/10。以我的經驗來說,這個評分很合理。
你實際上面對的是這些機制:
Akamai Bot Manager 會檢查你的 TLS 指紋(JA3/JA4 hash)、HTTP/2 frame 排列、header 順序與大小寫,以及 session cookie(_abck、ak_bmsc)。一般 Python requests 發出的 TLS 指紋,跟任何真實瀏覽器都不一樣——Akamai 甚至在你的請求到達 Walmart 伺服器之前,就會先把它擋下來。
PerimeterX/HUMAN 則是在 Akamai 後面運作,執行 JavaScript 指紋偵測(px.js),檢查 navigator 屬性、canvas 渲染、WebGL、audio context,以及行為生物特徵(滑鼠移動、捲動速度、按鍵節奏)。最常見的失敗畫面就是惡名昭彰的 ——你必須按住按鈕約 10 秒,系統會在這段時間蒐集行為訊號。Oxylabs 直白地說:「Walmart 使用由 PerimeterX 提供的 'Press & Hold' CAPTCHA,幾乎不可能靠程式碼解開。」
真正危險的是 無聲封鎖。Walmart 不一定回傳 403,而是會直接回 HTTP 200,但內容其實是 CAPTCHA。:「即使是 CAPTCHA 頁面,Walmart 也可能回傳 200 OK,因此不能只靠狀態碼判斷請求是否成功。」你的腳本會很開心地把 CAPTCHA HTML 當成「商品不存在」來解析,然後繼續往下跑。最後一半資料都是垃圾,你卻完全不知道。
再來是 門市範圍資料問題。Walmart 的價格與庫存會依地區而不同,受 locDataV3 和 assortmentStoreId 這類 cookie 控制。沒有正確 cookie,你拿到的會是「預設全國資料」,看起來完整,實際上卻不一定和真實消費者看到的一樣。缺少 cookie 不會跳封鎖頁,而是會產生 錯誤資料且沒有任何明顯失敗訊號,這更糟。
擷取 Walmart 資料的三種方法(以及比較)
在進入逐步教學前,先看看三種主要擷取方式。大多數競品教學只講一兩種。我會把三種都走一遍,方便你挑出最適合自己情境的方法。
| 方法 | 可靠度 | 資料完整度 | 反機器人難度 | 維護成本 |
|---|---|---|---|---|
| HTML + BeautifulSoup | ⚠️ 低(選擇器常因部署而失效) | 中等 | 高 | 高 |
__NEXT_DATA__ JSON | ✅ 不錯 | 高 | 中高 | 中等 |
| 內部 API 攔截 | ✅ 最佳 | 最高(變體、庫存、評論) | 中高 | 低(結構化 JSON) |
| Thunderbit(無程式碼) | ✅ 不錯 | 高 | 低(由 AI 處理) | 無 |
對 Walmart 來說,HTML 解析是最差的選擇——網站使用 Next.js bundle,CSS class 名稱還會在每次部署時變動。__NEXT_DATA__ JSON 方法則是務實的選擇,幾乎所有 2024–2026 年嚴肅的開源 Walmart 爬蟲都在用。內部 API 攔截最強大,但也有許多教學會刻意略過的限制。而如果你根本不需要客製化資料管線,那 Thunderbit 會是更合適的選擇。
設定 Python 環境來抓取 Walmart
你需要準備:
- 難度: 中等
- 所需時間: 約 30 分鐘完成環境設定,另外再加上開發時間
- 你需要的工具: Python 3.10+、pip、程式編輯器,以及(若要正式上線)代理服務或抓取 API
先建立專案資料夾與虛擬環境:
1mkdir walmart-scraper && cd walmart-scraper
2python -m venv venv
3source venv/bin/activate # Windows 上請執行:venv\Scripts\activate
安裝必要套件:
1pip install curl_cffi parsel beautifulsoup4 lxml
到了 2025 年,curl_cffi 幾乎是硬目標網站爬取的標準工具。它是 libcurl 的綁定,可以精準模擬瀏覽器 TLS 指紋。:「Walmart 會把 TLS 指紋納入機器人偵測,即使把 User-Agent 改成看起來像真實瀏覽器,也不會因此通過。」單靠 requests 或 httpx,不管你怎麼調 header,都過不了 Akamai。真正有差別的是 curl_cffi 搭配 impersonate="chrome124"。
另外也建議準備內建的 json、csv、time、random 和 logging,等等我們會在生產級範例中用到。
逐步教學:用 Python 抓取 Walmart 商品頁
第 1 步:先抓取 Walmart 商品頁
你的第一個任務,是發出一個不會立刻被擋下來的 HTTP 請求。以下是 2024–2026 年間 Scrapfly、Scrapingdog、Oxylabs 和 ScrapeOps 都常用的標準 header 組合:
1from curl_cffi import requests
2HEADERS = {
3 "User-Agent": (
4 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
5 "AppleWebKit/537.36 (KHTML, like Gecko) "
6 "Chrome/124.0.0.0 Safari/537.36"
7 ),
8 "Accept": (
9 "text/html,application/xhtml+xml,application/xml;q=0.9,"
10 "image/avif,image/webp,*/*;q=0.8"
11 ),
12 "Accept-Language": "en-US,en;q=0.9",
13 "Accept-Encoding": "gzip, deflate, br",
14 "Upgrade-Insecure-Requests": "1",
15 "Sec-Fetch-Dest": "document",
16 "Sec-Fetch-Mode": "navigate",
17 "Sec-Fetch-Site": "none",
18 "Sec-Fetch-User": "?1",
19 "Referer": "https://www.google.com/",
20}
21session = requests.Session(impersonate="chrome124")
22url = "https://www.walmart.com/ip/Apple-AirPods-Pro-2nd-Generation/1752657021"
23response = session.get(url, headers=HEADERS)
impersonate="chrome124" 才是這裡真正的關鍵。它會讓 curl_cffi 模擬 Chrome 124 的精確 TLS ClientHello、HTTP/2 frame 排序,以及 pseudo-header 順序。沒有它的話,Akamai 會把你看成 Python 專屬 JA3 hash,在你的請求到達 Walmart 應用層之前就直接封鎖。
被封鎖時會長什麼樣? 如果你在回傳 HTML 的標題中看到 "Robot or human?",或是被重新導向到 walmart.com/blocked,就代表你已經被抓到了。麻煩的是,Walmart 常常會直接回傳 200 狀態碼,但內容其實是 CAPTCHA——所以只檢查 response.ok 完全不夠。
只要是正式用途或重複使用,你都需要 住宅代理。資料中心 IP 會被 Akamai 的 IP 信譽系統立刻判定為可疑。下面的生產級錯誤處理與代理策略會再詳細說明。
第 2 步:從 __NEXT_DATA__ JSON 解析商品資料
Walmart.com 是一個 Next.js 應用,伺服器渲染的 HTML 會把完整的 hydration payload 放在單一 script 標籤中:<script id="__NEXT_DATA__" type="application/json">。這就是資料寶庫。
:「到了 2026 年,Walmart 使用 Next.js,並在 __NEXT_DATA__ script tag 中提供結構化 JSON,因此擷取隱藏資料比傳統 CSS selector 解析更可靠。」幾乎所有知名的開源 Walmart 爬蟲——、、——都在用這個方法。
擷取方式如下:
1import json
2from parsel import Selector
3sel = Selector(text=response.text)
4raw = sel.xpath('//script[@id="__NEXT_DATA__"]/text()').get()
5data = json.loads(raw)
6product = data["props"]["pageProps"]["initialData"]["data"]["product"]
7idml = data["props"]["pageProps"]["initialData"]["data"].get("idml", {})
大多數教學到這裡就結束了。下面我整理了一份 完整的 JSON 路徑對照表,列出你真正會在意的欄位——這些都是依據 2024–2026 的實際 Walmart 頁面驗證過的:
| 資料欄位 | JSON 路徑(在 initialData 下) | 型別 | 備註 |
|---|---|---|---|
| 商品名稱 | data > product > name | 字串 | — |
| 品牌 | data > product > brand | 字串 | — |
| 當前價格(數值) | data > product > priceInfo > currentPrice > price | 浮點數 | 可能因門市 cookie 而不同 |
| 當前價格(字串) | data > product > priceInfo > currentPrice > priceString | 字串 | 格式化後,例如 "$9.99" |
| 簡短描述 | data > product > shortDescription | HTML 字串 | 建議用 BeautifulSoup 轉成純文字 |
| 詳細描述 | data > idml > longDescription | HTML 字串 | 在 idml 裡,不是在 product 裡——這是舊教學最常搞錯的地方 |
| 所有圖片 | data > product > imageInfo > allImages | 陣列 | 由 {id, url} 物件組成 |
| 平均評分 | data > product > averageRating | 浮點數 | 鍵名是 averageRating,不是舊版的 rating |
| 評論數量 | data > product > numberOfReviews | 整數 | — |
| 變體 | data > product > variantCriteria | 陣列 | 尺寸、顏色等選項群組 |
| 可購買狀態 | data > product > availabilityStatus | 字串 | IN_STOCK、OUT_OF_STOCK、LIMITED_STOCK |
| 賣家 | data > product > sellerDisplayName | 字串 | — |
| 製造商 | data > product > manufacturerName | 字串 | — |
longDescription 這個路徑最容易踩雷。2023 年的 ScrapeHero 文章把它放在 product.longDescription,但 2024 之後的資料來源普遍都改放在同層的 idml 鍵值下。請務必先讀 idml.longDescription,再把 product.longDescription 當作舊頁面的備援。
以下是使用 .get() 串接的安全擷取寫法:
1def extract_product(data):
2 product = data["props"]["pageProps"]["initialData"]["data"]["product"]
3 idml = data["props"]["pageProps"]["initialData"]["data"].get("idml", {})
4 price_info = product.get("priceInfo", {})
5 current_price = price_info.get("currentPrice", {})
6 image_info = product.get("imageInfo", {})
7 return {
8 "name": product.get("name"),
9 "brand": product.get("brand"),
10 "price": current_price.get("price"),
11 "price_string": current_price.get("priceString"),
12 "short_desc": product.get("shortDescription"),
13 "long_desc": idml.get("longDescription", product.get("longDescription")),
14 "images": [img.get("url") for img in image_info.get("allImages", [])],
15 "rating": product.get("averageRating"),
16 "review_count": product.get("numberOfReviews"),
17 "variants": product.get("variantCriteria"),
18 "availability": product.get("availabilityStatus"),
19 "seller": product.get("sellerDisplayName"),
20 "manufacturer": product.get("manufacturerName"),
21 }
如果你完全不想碰 JSON 路徑映射, 會自動辨識並結構化這些欄位——不用手動找路徑。你只要點一下「AI Suggest Fields」,它就會讀頁面並幫你產生表格。但如果你是要建立自訂資料管線,上面這張對照表就是你的參考依據。
第 3 步:攔截 Walmart 的內部 API,取得更豐富的資料
幾乎沒有競品文章真正把這個方法講完整。這是最強大的擷取路徑,也是最複雜的一條。
Walmart 前端會呼叫建立在 Apollo Gateway 上的 。相關端點位於 www.walmart.com/orchestra/* 底下:
/orchestra/pdp/graphql/...— 商品詳情 hydration + 變體切換/orchestra/snb/graphql/...— 搜尋與瀏覽分頁/orchestra/reviews/graphql/...— 分頁式評論
這些端點會回傳乾淨、結構化的 JSON,而 __NEXT_DATA__ 有時只會給你截斷版資料——例如變體層級的價格、即時庫存數量、完整評論分頁。
但有個很多文章都會輕描淡寫帶過的重點: Walmart 使用 。請求 body 裡只會送出 SHA-256 hash(persistedQuery.sha256Hash),而不是完整 query 文本。如果伺服器不認得這個 hash,就會回 PersistedQueryNotFound。Walmart 會在部署時輪替這些 hash。這也是為什麼許多高知名度開源 Walmart 爬蟲都不會直接貼出可複製的 /orchestra/ 程式碼。
這個方法真正實用的做法,是用 DevTools 實際觀察:
- 在 Chrome 打開 Walmart 商品頁
- 開啟 DevTools → Network 分頁,篩選 "Fetch/XHR"
- 正常操作頁面——點變體、捲動評論區、切換門市位置
- 找出回傳商品資料的
/orchestra/*請求 - 右鍵該請求 → "Copy as cURL"
- 再用
curl_cffi把 cURL 指令轉成 Python
以下是重新播放 API 呼叫的範例:
1import json
2from curl_cffi import requests
3session = requests.Session(impersonate="chrome124")
4# 先拜訪商品頁,讓 session 先暖機
5session.get("https://www.walmart.com/ip/some-product/1234567", headers=HEADERS)
6# 再重播內部 API 呼叫(從 DevTools 複製)
7api_url = "https://www.walmart.com/orchestra/pdp/graphql"
8api_headers = {
9 **HEADERS,
10 "accept": "application/json",
11 "content-type": "application/json",
12 "referer": "https://www.walmart.com/ip/some-product/1234567",
13 "wm_qos.correlation_id": "your-copied-correlation-id",
14}
15payload = {
16 # 把 DevTools 裡的完整 request body 貼進來
17 "variables": {"productId": "1234567"},
18 "extensions": {
19 "persistedQuery": {
20 "version": 1,
21 "sha256Hash": "the-hash-you-copied"
22 }
23 }
24}
25api_response = session.post(api_url, headers=api_headers, json=payload)
26api_data = api_response.json()
session 暖機這一步非常重要。Walmart 的 PerimeterX cookie(_px3、_pxhd、ACID)必須先透過初次 HTML 請求設定好,之後 API 才會成功。沒有這些 cookie,你通常會拿到 412 或 403。
什麼時候該用這個方法? 當你需要 __NEXT_DATA__ 沒提供的資料時,例如更深層的變體價格、超過第一批的分頁評論,或即時庫存數量。對大多數用途來說,__NEXT_DATA__ 已經足夠,而且簡單很多。
抓取 Walmart 搜尋結果與多頁資料
搜尋結果也走類似的 __NEXT_DATA__ 模式,但 JSON 路徑不同:
1search_url = "https://www.walmart.com/search?q=laptops&page=1"
2response = session.get(search_url, headers=HEADERS)
3sel = Selector(text=response.text)
4raw = sel.xpath('//script[@id="__NEXT_DATA__"]/text()').get()
5data = json.loads(raw)
6search_result = data["props"]["pageProps"]["initialData"]["searchResult"]
7items = search_result["itemStacks"][0]["items"]
8# 排除贊助商品
9organic_items = [i for i in items if i.get("__typename") == "Product"]
10for item in organic_items:
11 print(item.get("name"), item.get("priceInfo", {}).get("currentPrice", {}).get("price"))
分頁方式就是把 page 參數往上加:&page=1、&page=2,以此類推。但這裡有個沒有明寫的上限:Walmart 不管實際總筆數多少,搜尋結果最多只開放 25 頁。 :「Walmart 不論實際頁數有多少,最多只允許存取 25 頁搜尋結果。」
想擴大覆蓋範圍,可以試試這些變通方法:
- 切換排序方式:同樣的查詢先跑
&sort=price_low,再跑&sort=price_high,可把覆蓋範圍擴到約 50 頁 - 價格區間切片:加入
&min_price=X&max_price=Y,把商品目錄拆成更小的區段 - 分類切片:在特定分類內搜尋,而不是全站搜尋
要注意的是,itemStacks 是一個陣列。Scrapfly 在倉庫裡硬寫 [0],但分類頁和瀏覽頁有時會有多個 stack(像是「Top picks」、「More results」)。比較穩健的做法是遍歷所有 stack:
1for stack in search_result.get("itemStacks", []):
2 for item in stack.get("items", []):
3 if item.get("__typename") == "Product":
4 # 處理 item
5 pass
另外值得一提的是:Walmart 的 robots.txt 。商品詳情頁(/ip/...)以及大多數分類頁(/cp/...)並未被禁止。如果你很在意合規性,建議先從商品頁與分類樹開始,而不是搜尋頁。
不要讓無聲封鎖毀掉你的資料:生產級錯誤處理
很多教學在這裡就崩了。它們只示範如何抓一頁、解析一個商品,然後就結束。但在正式環境中,你會抓上千頁,而 Walmart 也會積極阻擋你。示範版爬蟲和真正能用的爬蟲,差別就在於它怎麼處理失敗。
先偵測無聲封鎖,避免資料被污染
Walmart 爬蟲最重要的函式,就是封鎖偵測器。根據 、、 和 的共同經驗,你需要四種獨立檢查:
1BLOCK_MARKERS = (
2 "Robot or human",
3 "Press & Hold",
4 "Press & Hold",
5 "px-captcha",
6 "perimeterx",
7)
8def is_walmart_blocked(response) -> bool:
9 # 1. 是否被導向到專門的封鎖頁
10 if "/blocked" in str(response.url):
11 return True
12 # 2. 明確的狀態碼
13 if response.status_code in (403, 412, 428, 429, 503):
14 return True
15 # 3. 200 OK 但內容是 CAPTCHA(無聲封鎖)
16 body = response.text or ""
17 if any(m.lower() in body.lower() for m in BLOCK_MARKERS):
18 return True
19 # 4. 回應長度合理性檢查——真正的 PDP 通常有 300–900 KB
20 if len(response.content) < 50_000 and "/ip/" in str(response.url):
21 return True
22 return False
第四個檢查——回應長度——可以抓到那些頁面看起來沒有明顯 CAPTCHA 字樣,但也根本沒有你需要商品資料的情況。
用指數退避 + 抖動(jitter)設計重試邏輯
請求失敗時,不要立刻狂打 Walmart。標準做法是採用帶抖動的指數退避,避免重試時間全部重疊:
1import time
2import random
3import logging
4from curl_cffi import requests as cffi_requests
5log = logging.getLogger("walmart")
6def fetch_with_retry(session, url, max_retries=5, base_delay=2, max_delay=60):
7 for attempt in range(max_retries):
8 try:
9 response = session.get(url, headers=HEADERS, timeout=15)
10 if response.status_code in (429, 503):
11 raise Exception(f"Throttled: {response.status_code}")
12 if is_walmart_blocked(response):
13 raise Exception("Silent block detected")
14 return response
15 except Exception as e:
16 if attempt == max_retries - 1:
17 raise
18 wait = min(max_delay, base_delay * (2 ** attempt)) + random.uniform(0, 3)
19 log.warning(f"第 {attempt + 1} 次嘗試失敗:{e}。將在 {wait:.1f} 秒後重試")
20 time.sleep(wait)
21 return None
這個 jitter(random.uniform(0, 3))不是裝飾用的——它能讓一整批爬蟲的重試時間錯開,避免全部在同一秒重試,觸發 Akamai 的速度偵測。
限速策略
和 都給出一致建議:Walmart 每次請求最好採用 3–6 秒的隨機延遲。「在頁面載入之間等待 3–6 秒,並將延遲隨機化」。
1import time
2import random
3def rate_limited_fetch(session, url):
4 response = fetch_with_retry(session, url)
5 time.sleep(random.uniform(3.0, 6.0))
6 return response
如果是大規模作業,可以考慮用 aiolimiter 做非同步限速:
1from aiolimiter import AsyncLimiter
2limiter = AsyncLimiter(max_rate=10, time_period=60) # 每分鐘 10 個請求
資料驗證
就算回應沒被封鎖,解析出來的資料也可能有問題(錯門市、payload 被降級)。在寫入輸出前先驗證:
1def validate_product(product):
2 """如果商品資料看起來合理,回傳 True。"""
3 if not product.get("name"):
4 return False
5 price = (product.get("priceInfo") or {}).get("currentPrice", {}).get("price")
6 if not isinstance(price, (int, float)) or price <= 0:
7 return False
8 if product.get("availabilityStatus") not in ("IN_STOCK", "OUT_OF_STOCK", "LIMITED_STOCK"):
9 return False
10 return True
Session 日誌追蹤
追蹤每個 session 的成功率。當連續 10 分鐘低於 80% 時,通常代表情況有變——可能是 IP 已被標記、cookie 過期,或 Walmart 部署了新的反機器人規則。
1class ScrapeMetrics:
2 def __init__(self):
3 self.total = 0
4 self.success = 0
5 self.blocks = 0
6 self.errors = 0
7 def record(self, result):
8 self.total += 1
9 if result == "success":
10 self.success += 1
11 elif result == "blocked":
12 self.blocks += 1
13 else:
14 self.errors += 1
15 @property
16 def success_rate(self):
17 return (self.success / self.total * 100) if self.total > 0 else 0
18 def check_health(self):
19 if self.total > 20 and self.success_rate < 80:
20 log.critical(f"成功率降到 {self.success_rate:.1f}%——建議更換代理或暫停作業")
這不花俏,但它能保住你的資料品質。
DIY Python、抓取 API、無程式碼:怎麼選才適合抓 Walmart?
很多開發者會直接跳進去自己寫爬蟲,卻沒有先想過這是不是最佳選擇。。論壇使用者也常說它「基本上就是 9/10」,並懷疑「專門的網頁抓取 API 會不會太殺雞用牛刀」。答案取決於你的資料量、預算和工程能力。
| 因素 | DIY Python(requests + 代理) | 抓取 API(Oxylabs、Bright Data 等) | 無程式碼工具 (Thunderbit) |
|---|---|---|---|
| 拿到第一筆資料的設定時間 | 幾小時 | 15–60 分鐘 | 約 2 分鐘 |
| 進入正式上線的時間 | 40–80 小時 | 4–16 小時 | 約 30 分鐘 |
| 反機器人處理 | 你自己處理(很難) | 供應商處理 | 自動處理 |
| 小量成本(<1K 頁/月) | 低(代理費約 $4–8/GB) | $40–$49/月起 | 免費–$15/月 |
| 大量成本(10 萬+ 頁/月) | 單筆成本較低 | 單筆成本較高 | 視方案而定 |
| 自訂能力 | 完整控制 | API 參數 | 受 UI/欄位限制 |
| 持續維護 | 每月 4–8 小時 | 幾乎不用 | 無(AI 自動適應) |
| 最適合對象 | 正在建立自訂管線的開發者 | 中等規模的正式爬取 | 商務使用者、快速一次性擷取 |
什麼時候適合自己寫 Python
如果你已經有代理合約、需要嚴格控制 header、zipcode 或賣家族群、每月要索引數百萬頁面讓 API 單價累積得很高,或你需要本地部署/合規保證,那 DIY 會比較划算。代價是真實的工程時間:一個可上線的 Scrapy spider,包含分頁、重試、代理輪替、TLS 模擬與多頁型 schema,通常需要 ,之後還要每月再花 4–8 小時維護,因為 Walmart 會不時輪替指紋。
什麼時候抓取 API 會省時間
抓取 API 會幫你處理反機器人層,讓你不用自己扛。 顯示 Walmart 上 ,而 Scrape.do 也有 98%。像 、 和 這類工具,入門方案大約是每月 $40–$49。若你是 2–5 人的小團隊,而且每月爬取量在 1 萬到 100 萬頁之間,API 幾乎一定是更好的選擇。你用每筆請求成本,換來零維護。
什麼時候無程式碼最適合
的使用情境完全不同。如果你是 PM、分析師或電商營運,只想在今天下午就把 Walmart 商品資料送進試算表,而不是等到下一個 sprint,那無程式碼工具就是最誠實的答案。
操作流程很簡單:安裝 ,打開 Walmart 商品頁或搜尋頁,點「AI Suggest Fields」,Thunderbit 的 AI 就會自動讀取頁面並建議欄位(商品名稱、價格、評分等)。再點「Scrape」,資料就會進入表格。你可以直接匯出到 Excel、Google Sheets、Airtable 或 Notion——基礎方案全部免費。
Thunderbit 會在雲端處理反機器人問題,所以你不用碰 CAPTCHA、代理或 TLS 指紋。AI 也會自動適應版面變化,因此幾乎沒有維護成本。對於不想碰 JSON 路徑的人來說,這是最省力的路線。
但也有誠實限制:Thunderbit 不是為每天 10 萬頁以上而設計。信用額度和雲端上限,讓大規模匯入比直接用原生 API 不划算。你也無法指定固定 zipcode 或 ASN,除非工具本身支援。若你要做長期、大量的資料管線,DIY 或抓取 API 仍然更合適。
粗略價格估算: 用 Thunderbit 抓 1,000 筆 Walmart 商品資料,大約需要 2,000 credits,約 $0.60–$1.10(以 Starter/Pro 方案估算)。這和 Oxylabs 的 Walmart API 相近,也比多數低量級的入門抓取 API 便宜。請查看 以取得最新資訊。
匯出你抓到的 Walmart 資料
一旦拿到資料,你就要把它放進有用的地方。以下三種格式已經足夠應付大多數需求:
CSV —— 分析師最常打開的通用格式:
1import csv
2def export_csv(products, filename="walmart_products.csv"):
3 fieldnames = ["name", "price", "availability", "rating", "review_count", "seller", "url"]
4 with open(filename, "w", newline="", encoding="utf-8-sig") as f:
5 writer = csv.DictWriter(f, fieldnames=fieldnames, quoting=csv.QUOTE_MINIMAL)
6 writer.writeheader()
7 for p in products:
8 writer.writerow({k: p.get(k) for k in fieldnames})
請使用 utf-8-sig 編碼,這樣才能相容 Excel。BOM 標記可以避免 Excel 把特殊字元弄亂。
JSONL —— 適合正式爬蟲管線的格式:
1import json
2import gzip
3def export_jsonl(products, filename="walmart_products.jsonl.gz"):
4 with gzip.open(filename, "at", encoding="utf-8") as f:
5 for p in products:
6 f.write(json.dumps(p, ensure_ascii=False) + "\n")
(寫入中斷時通常只會少掉最後一行),也能以固定記憶體串流處理,並保留變體、評論等巢狀資料。
Excel —— 適合一次性交付給分析師:
1from openpyxl import Workbook
2def export_excel(products, filename="walmart_products.xlsx"):
3 wb = Workbook(write_only=True)
4 ws = wb.create_sheet("Products")
5 ws.append(["名稱", "價格", "可購買狀態", "評分", "評論數", "賣家"])
6 for p in products:
7 ws.append([p.get("name"), p.get("price"), p.get("availability"),
8 p.get("rating"), p.get("review_count"), p.get("seller")])
9 wb.save(filename)
對非 Python 使用者來說,Thunderbit 也把匯出流程處理好了:可一鍵匯出到 Google Sheets、Airtable、Notion、Excel、CSV 和 JSON,基礎方案全都免費。若是持續監控,Thunderbit 的排程爬蟲功能也能自動執行重複擷取。
排程這件事有個注意點:。GitHub Actions 的執行環境屬於 Azure IP 段,Walmart 的反機器人系統會直接封掉。建議改用 VPS 上的 APScheduler,或把所有流量都走住宅代理。
抓取 Walmart 的法律與道德規範
論壇使用者會直接提出這個擔憂:「我不介意跟工程團隊玩貓捉老鼠,但很怕要跟法務團隊對上。」
Walmart 的使用條款 未經事先書面同意,使用「任何機器人、蜘蛛……或其他手動或自動裝置來擷取、索引、'scrape'、'data mine' 或以其他方式蒐集任何素材」。
Walmart 的 robots.txt /search、/account、/api/ 以及許多內部端點。商品詳情頁(/ip/...)和評論頁(/reviews/product/)則沒有被禁止。
hiQ v. LinkedIn 的先例(第 9 巡迴法院,)確立了抓取公開可見資料,通常不太可能違反聯邦 CFAA。不過同一法院後來也認定 ,並對其做出 。更近的 2024 年判決(、)進一步限縮了 CFAA,並建立了著作權優先排除的抗辯,但這些判決都取決於特定的 ToU 文字,不能直接套用到 Walmart。
實務建議: 不要過度占用伺服器資源。尊重速率限制。不要抓取個資或使用者資料。負責任地使用資料。以適中速度抓取公開的 Walmart 商品頁做個人研究,和以商業規模違反 Walmart 條款進行抓取,風險完全不同。如果你要基於 Walmart 資料做產品,請先找律師,並了解 Walmart 官方的 。
免責聲明: 本文僅供教育用途,不構成法律建議。
結論與重點整理
由於 Walmart 採用雙層 Akamai + PerimeterX 反機器人堆疊,用 Python 抓 Walmart 是一項 。不是不可能,但你需要正確的工具與方法。
重點整理:
__NEXT_DATA__JSON 擷取是多數情況下最務實的選擇。 這也是 2024–2026 年嚴肅的開源 Walmart 爬蟲都在採用的方法。PDP 的基本路徑是props.pageProps.initialData.data.product,搜尋/瀏覽則是searchResult.itemStacks。curl_cffi搭配impersonate="chrome124"是必備。 單靠requests或httpx,不管怎麼調 header,都過不了 Akamai 的 TLS 指紋檢查。- 無聲封鎖才是真正危險。 Walmart 會用 200 OK 配 CAPTCHA 內容回應,所以一定要檢查回應內容,而不只是狀態碼。
- 正式爬蟲需要的不只是「成功路徑」程式。 帶 jitter 的指數退避、四種信號的封鎖偵測、每次請求 3–6 秒的限速、資料驗證,以及 session 健康監控,都是必要的。
- 透過
/orchestra/*攔截內部 API 很強,但也很脆弱。 最適合拿來針對特定資料需求做 DevTools 實驗,而不是當成主要擷取方式。 - Walmart 的搜尋結果最多只能到 25 頁。 想擴大範圍,就用排序切換和價格區間切片。
- 誠實選擇你的方法: 有自訂需求且資料量大的開發者,選 DIY Python;沒有爬蟲工程師的中型團隊,選抓取 API;想今晚就把資料放進 Google Sheets 的商務使用者,選 。
如果你想先試無程式碼路線, 有免費方案——你可以先抓幾個 Walmart 頁面,親眼看看結果。如果你要走 Python 路線,這篇文章裡的程式碼模式都已經過生產環境驗證。無論哪條路,你現在都已經有了 Walmart 防護機制的地圖,以及穿越它們的三條路。
想了解更多網頁爬取技巧,可以參考我們的指南:、、以及。你也可以到 看教學影片。
常見問題
抓取 Walmart 商品資料是否合法?
Walmart 的使用條款禁止未經書面同意的自動化抓取。第 9 巡迴法院在 hiQ v. LinkedIn(2022)中指出,聯邦 CFAA 多半不適用於抓取公開頁面,但同一案件最後仍以 告終。以適中頻率抓取公開商品頁作個人研究,風險和商業規模資料擷取完全不同。如果你要用 Walmart 資料做生意,請先諮詢律師。
為什麼我的 Walmart 爬蟲一直被封?
最常見原因包括:使用原生 requests 或 httpx(會發出 Python 專屬 TLS 指紋,Akamai 會立刻識別)、header 設定不正確、沒有代理輪替、每頁請求速度快於 3–6 秒,以及缺少 session cookie(_px3、_abck、locDataV3)。請改用 curl_cffi 搭配 impersonate="chrome124"、使用住宅代理,並實作本文提到的封鎖偵測與重試模式。
我可以用 Python 從 Walmart 抓到哪些資料?
商品名稱、價格(即時與折扣回復價)、圖片、簡短與詳細描述、評分、評論數、庫存可用狀態、賣家名稱、製造商資訊、變體選項(尺寸、顏色)與分類位置。使用 __NEXT_DATA__ 方法,這些內容都能以結構化 JSON 取得。若再加上內部 API 攔截,還能拿到變體層級價格、即時庫存數量與分頁評論資料。
抓取 Walmart 需要代理嗎?
需要,只要是正式用途或重複使用就需要。——即使 header 設得再完美,只要不是住宅 IP,Akamai 的 IP 信譽系統還是會把你標記。需要住宅或行動代理。資料中心 IP 幾乎會立刻失效。依照代理供應商與方案不同,預算大約是每 1,000 頁 $3–$17。
不寫程式也能抓 Walmart 嗎?
可以。 是一款 AI 驅動的 Chrome 擴充功能,只要兩步就能抓 Walmart:「AI Suggest Fields」自動辨識商品欄位,接著按「Scrape」即可匯出資料。它會在雲端處理反機器人挑戰,並可直接匯出到 Excel、Google Sheets、Airtable 或 Notion,而且全部免費。非常適合需要快速拿資料、但不想建立自訂管線的分析師、PM 和商務使用者。若你需要高量或高度客製化的爬取,Python 或抓取 API 仍然更合適。
延伸閱讀