如何用 Python 抓取 Walmart(而且不被封鎖)

最後更新於 April 15, 2026

Walmart 會在一天內多次調整部分商品的價格。 如果你曾經想用程式方式追蹤這些變化,你一定懂那種痛苦:腳本明明跑得好好的,20 分鐘後卻悄悄開始回傳偽裝成正常 200 OK 的 CAPTCHA 頁面。

我在 的資料擷取工作中,花了很多時間研究 Walmart 的反機器人防護機制。這篇文章想把我學到的東西一次整理給你——哪些方法在 2025 年真的有效、哪些「無聲失敗」會污染你的資料,以及自己寫爬蟲、付費用抓取 API、或直接用無程式碼工具之間,該怎麼做出務實選擇。這份指南會涵蓋三種擷取方法(HTML 解析、__NEXT_DATA__ JSON、內部 API 攔截)、許多教學都完全略過的生產級錯誤處理,以及幫你判斷最適合方案的實用決策框架。無論你是要寫 Python,還是只想在中午前把價格資料整理成試算表,這裡都找得到答案。

為什麼要用 Python 抓取 Walmart?

Walmart 以營收計算是全球最大零售商之一——在 2025 財年創下 ,並且連續 。網站上大約有 ,而 Walmart 財務長甚至提到市集上有 。其中約 ,這代表商品目錄非常動態——賣家進出頻繁、變體常改、庫存每天都在變。

walmart_stats_670d06c6bd.png

也正因為這種波動性,抓取才有價值。季度報告永遠捕捉不到每晚爬取能看到的變化。以下是我最常見的使用情境:

使用情境需求對象擷取內容
競爭對手價格監控電商營運、動態定價工具價格、促銷、MAP 合規
商品目錄補強業務與商品陳列團隊商品描述、圖片、規格、變體
庫存可用性追蹤供應鏈、代發貨商庫存狀態、賣家資訊
市場研究與趨勢分析行銷、產品經理評分、評論、分類品項組合
開發潛在客戶業務團隊賣家名稱、商品數量、分類

單是 ,並預估到 2033 年會成長至 50.9 億美元。消費者行為也推動了這個需求:,而且 83% 會跨多個網站比較。

Python 是這類工作的預設語言。根據 Apify 的 2026 Infrastructure Report,,而核心套件 requests 每週下載量大約有 。只要你有一定規模的爬取需求,幾乎一定會用 Python。

為什麼 Walmart 是最難抓的網站之一

Walmart 難抓,原因是它把 兩套商業級反機器人產品串聯起來:前端邊緣 WAF 與 TLS 指紋識別層使用 ,再接上行為式 JavaScript 挑戰層 。Scrape.do 形容這種組合「罕見,而且極難繞過」。

walmart_antibot_3d67d0119c.png

,單看 Akamai 也是 9/10。以我的經驗來說,這個評分很合理。

你實際上面對的是這些機制:

Akamai Bot Manager 會檢查你的 TLS 指紋(JA3/JA4 hash)、HTTP/2 frame 排列、header 順序與大小寫,以及 session cookie(_abckak_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 的價格與庫存會依地區而不同,受 locDataV3assortmentStoreId 這類 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 改成看起來像真實瀏覽器,也不會因此通過。」單靠 requestshttpx,不管你怎麼調 header,都過不了 Akamai。真正有差別的是 curl_cffi 搭配 impersonate="chrome124"

另外也建議準備內建的 jsoncsvtimerandomlogging,等等我們會在生產級範例中用到。

逐步教學:用 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 > shortDescriptionHTML 字串建議用 BeautifulSoup 轉成純文字
詳細描述data > idml > longDescriptionHTML 字串idml 裡,不是在 product——這是舊教學最常搞錯的地方
所有圖片data > product > imageInfo > allImages陣列{id, url} 物件組成
平均評分data > product > averageRating浮點數鍵名是 averageRating,不是舊版的 rating
評論數量data > product > numberOfReviews整數
變體data > product > variantCriteria陣列尺寸、顏色等選項群組
可購買狀態data > product > availabilityStatus字串IN_STOCKOUT_OF_STOCKLIMITED_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 實際觀察:

  1. 在 Chrome 打開 Walmart 商品頁
  2. 開啟 DevTools → Network 分頁,篩選 "Fetch/XHR"
  3. 正常操作頁面——點變體、捲動評論區、切換門市位置
  4. 找出回傳商品資料的 /orchestra/* 請求
  5. 右鍵該請求 → "Copy as cURL"
  6. 再用 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_pxhdACID)必須先透過初次 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 &amp; 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) &lt; 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 &lt;= 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 &gt; 0 else 0
18    def check_health(self):
19        if self.total &gt; 20 and self.success_rate &lt; 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" 是必備。 單靠 requestshttpx,不管怎麼調 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 爬蟲一直被封?

最常見原因包括:使用原生 requestshttpx(會發出 Python 專屬 TLS 指紋,Akamai 會立刻識別)、header 設定不正確、沒有代理輪替、每頁請求速度快於 3–6 秒,以及缺少 session cookie(_px3_abcklocDataV3)。請改用 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 仍然更合適。

試試 Thunderbit 進行 AI Walmart 抓取

延伸閱讀

Shuai Guan
Shuai Guan
Co-founder/CEO @ Thunderbit. Passionate about cross section of AI and Automation. He's a big advocate of automation and loves making it more accessible to everyone. Beyond tech, he channels his creativity through a passion for photography, capturing stories one picture at a time.
目錄

試試 Thunderbit

只要 2 次點擊,就能抓取潛在客戶與其他資料。AI 驅動。

取得 Thunderbit 免費使用
用 AI 擷取資料
輕鬆將資料轉移到 Google Sheets、Airtable 或 Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week