Walmart เปลี่ยนราคาสินค้าบางรายการ หลายครั้งต่อวัน ถ้าคุณเคยพยายามติดตามแบบอัตโนมัติ คุณคงรู้ดีว่ามันน่าปวดหัวแค่ไหน: สคริปต์รันไปได้ 20 นาที แล้วจู่ๆ ก็เริ่มเจอหน้า CAPTCHA ที่แอบปลอมตัวมาเหมือนเป็นคำตอบ 200 OK ปกติ
ผมใช้เวลาไม่น้อยกับการฝ่าระบบป้องกันบอตของ Walmart ตอนทำงานด้านการดึงข้อมูลที่ Thunderbit และอยากเอาทุกอย่างที่เรียนรู้มาสรุปไว้ตรงนี้ — ทั้งวิธีที่ใช้ได้จริงในปี 2025 จุดพังเงียบๆ ที่ทำให้ข้อมูลเสีย และการชั่งน้ำหนักแบบตรงไปตรงมาระหว่างการเขียนสคริปต์เอง การจ่ายเงินให้ API สำหรับการดึงข้อมูล หรือใช้เครื่องมือแบบไม่ต้องเขียนโค้ด บทความนี้จะครอบคลุม 3 วิธีในการดึงข้อมูล (การแยกวิเคราะห์ HTML, JSON __NEXT_DATA__ และการดักจับ API ภายใน) แนวทางรับมือข้อผิดพลาดระดับใช้งานจริงที่บทความส่วนใหญ่มักข้ามไป และกรอบการตัดสินใจแบบตรงไปตรงมาเพื่อเลือกแนวทางที่เหมาะกับคุณ ไม่ว่าคุณจะเขียน Python เองหรือแค่อยากได้สเปรดชีตที่มีราคาครบก่อนเที่ยง บทความนี้ก็มีคำตอบให้
ทำไมต้องดึงข้อมูล Walmart ด้วย Python?
Walmart คือผู้ค้าปลีกรายใหญ่ที่สุดในโลกถ้าวัดจากรายได้ — 680,985 ล้านดอลลาร์ ในปีงบประมาณ 2025 และครอง อันดับ 1 บน Fortune Global 500 ต่อเนื่อง 12 ปี เว็บไซต์นี้มีรายการสินค้าลงขายแบบสดอยู่ราว 420 ล้านรายการ โดย CFO ของ Walmart เคยระบุว่ามี “SKU ครึ่งพันล้านรายการ” บนมาร์เก็ตเพลซ รายการประมาณ 95% มาจากผู้ขายภายนอก ซึ่งหมายความว่าแค็ตตาล็อกมีความผันผวนสูง — ผู้ขายเข้าออกตลอด รุ่นย่อยเปลี่ยน และสต็อกสลับสถานะทุกวัน

ความผันผวนแบบนี้แหละที่ทำให้การดึงข้อมูลสำคัญ รายงานรายไตรมาสไม่สามารถเก็บรายละเอียดได้เท่ากับการดึงข้อมูลทุกคืน ตัวอย่างการใช้งานที่พบบ่อยมีดังนี้:
| กรณีใช้งาน | ใครต้องใช้ | สิ่งที่ดึงมา |
|---|---|---|
| การติดตามราคาคู่แข่ง | ทีมอีคอมเมิร์ซ, เครื่องมือปรับราคา | ราคา, โปรโมชั่น, การปฏิบัติตาม MAP |
| การเติมข้อมูลแค็ตตาล็อกสินค้า | ทีมขายและทีมจัดการสินค้า | คำอธิบาย, รูปภาพ, สเปก, รุ่นย่อย |
| การติดตามสินค้าคงเหลือ | ซัพพลายเชน, ดรอปชิปเปอร์ | สถานะสต็อก, ข้อมูลผู้ขาย |
| การวิจัยตลาดและวิเคราะห์เทรนด์ | ทีมการตลาด, ผู้จัดการผลิตภัณฑ์ | คะแนนรีวิว, รีวิว, สัดส่วนหมวดสินค้า |
| การหาลีด | ทีมขาย | ชื่อผู้ขาย, จำนวนสินค้า, หมวดหมู่ |
ตลาดซอฟต์แวร์ติดตามราคาคู่แข่งเพียงอย่างเดียวก็แตะ 1.92 พันล้านดอลลาร์ในปี 2025 และคาดว่าจะโตถึง 5.09 พันล้านดอลลาร์ภายในปี 2033 พฤติกรรมผู้บริโภคก็เป็นตัวผลักดันการใช้จ่ายนี้ด้วย: 94% ของลูกค้าเปรียบเทียบราคาขณะช้อปปิ้งออนไลน์ และ 83% เปรียบเทียบราคาข้ามหลายเว็บไซต์
Python คือภาษาหลักที่ใช้กับงานนี้ รายงาน Infrastructure ปี 2026 ของ Apify ระบุว่า Python ครองสัดส่วน 71.7% ของงานดึงข้อมูลเว็บทั้งหมด และไลบรารีหลักอย่าง requests มียอดดาวน์โหลด ราว 30 ล้านครั้งต่อสัปดาห์ ถ้าคุณกำลังดึงข้อมูลในระดับจริงจัง คุณแทบจะทำด้วย Python แน่นอน
ทำไม Walmart ถึงเป็นหนึ่งในเว็บไซต์ที่ดึงข้อมูลยากที่สุด
Walmart ยากเป็นพิเศษเพราะมันใช้ ผลิตภัณฑ์ป้องกันบอตเชิงพาณิชย์ 2 ชั้นซ้อนกัน: Akamai Bot Manager เป็นชั้น edge WAF และ TLS fingerprinting ส่วน PerimeterX (รีแบรนด์เป็น HUMAN Security) เป็นชั้นความท้าทาย JavaScript เชิงพฤติกรรม Scrape.do บอกว่าการผสมนี้ “หายากและยากมากที่จะหลบเลี่ยง”

ScrapeOps ให้คะแนนความยากของ Walmart อยู่ที่ 9/10 โดย Akamai อย่างเดียวก็ 9/10 อยู่แล้ว จากประสบการณ์ผมก็ถือว่าค่อนข้างตรง
สิ่งที่คุณต้องเจอจริงๆ มีดังนี้:
Akamai Bot Manager ตรวจสอบ TLS fingerprint ของคุณ (แฮช JA3/JA4), ลำดับเฟรม HTTP/2, ลำดับและตัวพิมพ์ของหัวข้อ HTTP และคุกกี้เซสชัน (_abck, ak_bmsc) การเรียก requests แบบมาตรฐานจาก Python จะส่ง TLS fingerprint ที่ไม่มีเบราว์เซอร์จริงตัวไหนสร้างขึ้น Akamai จึงจับได้ก่อนที่คำขอของคุณจะไปถึงเซิร์ฟเวอร์ของ Walmart ด้วยซ้ำ
PerimeterX/HUMAN ทำงานต่อจาก Akamai โดยรัน JavaScript fingerprinting (px.js) เพื่อเช็กค่าต่างๆ เช่น navigator properties, canvas rendering, WebGL, audio context และ biometrics เชิงพฤติกรรม (การขยับเมาส์ ความเร็วการเลื่อนหน้า จังหวะการกดแป้นพิมพ์) ความล้มเหลวที่เห็นชัดคือด่าน “Press & Hold” อันโด่งดัง — ปุ่มที่คุณต้องกดค้างราว 10 วินาทีขณะระบบสุ่มเก็บสัญญาณพฤติกรรม Oxylabs พูดตรงๆ ว่า: “Walmart ใช้ CAPTCHA แบบ ‘Press & Hold’ ซึ่งให้โดย PerimeterX และเป็นที่รู้กันว่าแทบจะแก้จากโค้ดของคุณไม่ได้เลย”
พฤติกรรมที่อันตรายจริงๆ คือ การบล็อกแบบเงียบ Walmart ส่งกลับเป็น HTTP 200 พร้อมเนื้อหา CAPTCHA แทนที่จะเป็น 403 ScrapingBee ยืนยัน ว่า: “Walmart ส่งสถานะ 200 OK แม้ตอนที่เสิร์ฟหน้า CAPTCHA คุณจึงไม่สามารถเช็กแค่ status code เพื่อรู้ว่าคำขอสำเร็จหรือไม่” สคริปต์ของคุณก็จะพยายามแยก HTML ของ CAPTCHA ว่าเป็น “ไม่พบสินค้า” แล้วทำงานต่อ ชุดข้อมูลของคุณครึ่งหนึ่งจึงกลายเป็นขยะโดยที่คุณไม่รู้ตัว
นอกจากนี้ยังมี ปัญหาข้อมูลที่ผูกกับสาขา/ร้าน อีกด้วย ราคาและสต็อกของ Walmart ขึ้นอยู่กับตำแหน่ง โดยควบคุมผ่านคุกกี้อย่าง locDataV3 และ assortmentStoreId ถ้าไม่มีคุกกี้ที่ถูกต้อง คุณจะได้ข้อมูลแบบ “ค่าเริ่มต้นระดับประเทศ” ซึ่งดูเหมือนครบ แต่ไม่ตรงกับสิ่งที่ลูกค้าจริงเห็น คุกกี้ที่หายไปไม่ได้ทำให้เกิดหน้า block — แต่มันสร้าง ข้อมูลที่ผิดโดยไม่มีความล้มเหลวให้เห็น ซึ่งแย่กว่า
3 วิธีในการดึงข้อมูลจาก Walmart (และเปรียบเทียบกันอย่างไร)
ก่อนจะลงมือทีละขั้น มาดู 3 แนวทางหลักกันก่อน บทความคู่แข่งส่วนใหญ่จะพูดแค่ 1 หรือ 2 วิธี ผมจะไล่ให้ครบทั้ง 3 เพื่อให้คุณเลือกวิธีที่เหมาะกับสถานการณ์ของคุณ
| วิธี | ความน่าเชื่อถือ | ความครบถ้วนของข้อมูล | ความยากของการหลบระบบป้องกันบอต | ภาระในการดูแล |
|---|---|---|---|---|
| HTML + BeautifulSoup | ⚠️ ต่ำ (ตัวเลือกพังทุกครั้งที่ deploy) | ปานกลาง | สูง | สูง |
JSON __NEXT_DATA__ | ✅ ดี | สูง | ปานกลาง-สูง | ปานกลาง |
| การดักจับ API ภายใน | ✅ ดีที่สุด | สูงที่สุด (รุ่นย่อย, สต็อก, รีวิว) | ปานกลาง-สูง | ต่ำ (JSON มีโครงสร้าง) |
| Thunderbit (ไม่ต้องเขียนโค้ด) | ✅ ดี | สูง | ต่ำ (ให้ AI จัดการ) | ไม่มี |
การแยกวิเคราะห์ HTML เป็นตัวเลือกที่แย่ที่สุดสำหรับ Walmart — เว็บไซต์นี้ส่งบันเดิล Next.js พร้อมชื่อคลาส CSS ที่แฮชและเปลี่ยนทุกครั้งที่มีการ deploy วิธี JSON __NEXT_DATA__ คือทางเลือกเชิงปฏิบัติที่สคริปต์โอเพนซอร์สจริงจังสำหรับ Walmart ในช่วง 2024–2026 ใช้กันทุกเจ้า การดักจับ API ภายในทรงพลังที่สุด แต่ก็มาพร้อมข้อควรระวังที่บทความส่วนใหญ่ไม่ค่อยพูดถึง และ Thunderbit คือคำตอบที่เหมาะเมื่อคุณไม่ต้องการทำ pipeline เองเลย
ลองใช้ Thunderbit สำหรับดึงข้อมูล Walmart
ตั้งค่าสภาพแวดล้อม Python เพื่อดึงข้อมูล Walmart
สิ่งที่คุณต้องมี:
- ระดับความยาก: ปานกลาง
- เวลาที่ต้องใช้: ประมาณ 30 นาทีสำหรับการตั้งค่า บวกกับเวลาสำหรับเขียนโค้ด
- สิ่งที่ต้องเตรียม: Python 3.10+, pip, โปรแกรมแก้ไขโค้ด และ (สำหรับใช้งานจริง) บริการ proxy หรือ scraping API
สร้างโฟลเดอร์โปรเจกต์และ virtual environment:
mkdir walmart-scraper && cd walmart-scraper
python -m venv venv
source venv/bin/activate # บน Windows: venv\Scripts\activate
ติดตั้งไลบรารีที่จำเป็น:
pip install curl_cffi parsel beautifulsoup4 lxml
curl_cffi คือมาตรฐานปี 2025 สำหรับการดึงข้อมูลจากเป้าหมายที่รับมือยาก มันเป็น binding ของ libcurl ที่สามารถปลอมตัวเป็น TLS fingerprint ของเบราว์เซอร์ได้แบบตรงรุ่น Bright Data อธิบาย ว่า: “Walmart ใช้ TLS fingerprinting เป็นส่วนหนึ่งของการตรวจจับบอต และแค่ตั้ง User-Agent ให้เหมือนเบราว์เซอร์จริงก็ยังไม่พอจะข้ามได้” requests หรือ httpx แบบธรรมดาจะผ่าน Akamai ไม่ได้ไม่ว่าคุณจะตั้ง header อะไร curl_cffi พร้อม impersonate="chrome124" คือสิ่งที่ทำให้ต่าง
คุณจะต้องใช้ json (มีมาให้ในตัว), csv (มีมาให้ในตัว), time, random และ logging สำหรับแพตเทิร์นระดับใช้งานจริงที่เราจะพูดถึงต่อไป
ทีละขั้นตอน: ดึงข้อมูลหน้าสินค้า Walmart ด้วย Python
ขั้นตอนที่ 1: ดึงหน้า Product ของ Walmart
งานแรกของคุณคือส่ง HTTP request ที่ไม่โดนบล็อกทันที นี่คือชุด header มาตรฐานที่ Scrapfly, Scrapingdog, Oxylabs และ ScrapeOps ใช้กันในช่วง 2024–2026:
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)
พารามิเตอร์ impersonate="chrome124" คือส่วนที่แบกงานหนักตรงนี้ มันบอก curl_cffi ให้เลียนแบบ TLS ClientHello ของ Chrome 124, การจัดลำดับเฟรม HTTP/2 และลำดับ pseudo-header แบบตรงรุ่น ถ้าไม่มีสิ่งนี้ Akamai จะเห็น hash JA3 แบบเฉพาะของ Python แล้วบล็อกคุณก่อนคำขอจะไปถึงชั้นแอปพลิเคชันของ Walmart ด้วยซ้ำ
หน้าตาการตอบกลับที่โดนบล็อกเป็นอย่างไร: ถ้าคุณเห็น "Robot or human?" ใน title ของ HTML ที่ตอบกลับ หรือถ้า response redirect ไปที่ walmart.com/blocked แปลว่าคุณโดนจับได้แล้ว จุดที่ยากคือ Walmart มักส่งกลับสถานะ 200 พร้อมเนื้อหา CAPTCHA — ดังนั้นการเช็กแค่ response.ok อย่างเดียวไม่พอ
สำหรับงานระดับโปรดักชันหรือการใช้งานซ้ำๆ คุณจะต้องใช้ proxy แบบ residential เพราะ IP จากดาต้าเซ็นเตอร์จะโดนเผาทันทีโดยระบบ reputation ของ Akamai ผมจะอธิบายแนวทางจัดการ error และ proxy แบบครบถ้วนในส่วนโปรดักชันด้านล่าง
ขั้นตอนที่ 2: แยกข้อมูลสินค้าจาก JSON __NEXT_DATA__
Walmart.com เป็นแอป Next.js และ HTML ที่ render จากฝั่งเซิร์ฟเวอร์จะฝัง payload สำหรับ hydration ทั้งหมดไว้ในแท็กสคริปต์เดียว: <script id="__NEXT_DATA__" type="application/json"> นี่คือแหล่งทองคำ
คู่มือปี 2026 ของ Scrapfly ยืนยัน ว่า: “ในปี 2026 Walmart ใช้ Next.js พร้อม JSON แบบมีโครงสร้างในแท็กสคริปต์ __NEXT_DATA__ ทำให้การดึงข้อมูลที่ซ่อนอยู่เชื่อถือได้กว่าการแยกวิเคราะห์ด้วย CSS selector แบบดั้งเดิม” สคริปต์โอเพนซอร์สระดับดังทุกตัวสำหรับ Walmart — ทั้ง ของ Scrapfly, ของ Oxylabs, python-scrapy-playbook — ใช้วิธีนี้
วิธีดึงข้อมูลมีดังนี้:
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", {})
บทความส่วนใหญ่จะหยุดแค่นี้ ด้านล่างคือ แผนผัง JSON path แบบครบถ้วน สำหรับฟิลด์ที่คุณต้องการจริงๆ — ตรวจสอบแล้วกับหน้า Walmart จริงในช่วง 2024–2026:
| ฟิลด์ข้อมูล | JSON Path (ใต้ initialData) | ประเภท | หมายเหตุ |
|---|---|---|---|
| ชื่อสินค้า | data > product > name | String | — |
| แบรนด์ | data > product > brand | String | — |
| ราคาปัจจุบัน (ตัวเลข) | data > product > priceInfo > currentPrice > price | Float | อาจต่างกันตามคุกกี้ร้านค้า |
| ราคาปัจจุบัน (ข้อความ) | data > product > priceInfo > currentPrice > priceString | String | ฟอร์แมตเช่น "$9.99" |
| คำอธิบายสั้น | data > product > shortDescription | HTML String | ใช้ BeautifulSoup แยกเป็นข้อความ |
| คำอธิบายยาว | data > idml > longDescription | HTML String | อยู่ใน idml ไม่ใช่ใน product — นี่คือจุดที่คู่มือเก่ามักพลาด |
| รูปภาพทั้งหมด | data > product > imageInfo > allImages | Array | รายการอ็อบเจ็กต์ {id, url} |
| คะแนนเฉลี่ย | data > product > averageRating | Float | ใช้คีย์ averageRating ไม่ใช่ rating แบบเก่า |
| จำนวนรีวิว | data > product > numberOfReviews | Integer | — |
| รุ่นย่อย | data > product > variantCriteria | Array | กลุ่มตัวเลือก (ขนาด, สี) |
| ความพร้อมจำหน่าย | data > product > availabilityStatus | String | IN_STOCK, OUT_OF_STOCK, LIMITED_STOCK |
| ผู้ขาย | data > product > sellerDisplayName | String | — |
| ผู้ผลิต | data > product > manufacturerName | String | — |
เส้นทาง longDescription คือกับดักที่ทำให้หลายคนพลาด คู่มือของ ScrapeHero ในปี 2023 วางไว้ที่ product.longDescription แต่แหล่งข้อมูลตั้งแต่ปี 2024 เป็นต้นมาระบุตรงกันว่ามันอยู่ที่คีย์พี่น้อง idml เสมอ อ่าน idml.longDescription ก่อน แล้วค่อย fallback ไปที่ product.longDescription สำหรับหน้าที่เก่ากว่า
นี่คือแพตเทิร์นการดึงข้อมูลแบบปลอดภัยด้วย .get() chain:
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 path เลย AI ของ Thunderbit จะระบุและจัดโครงสร้างฟิลด์เหล่านี้ให้อัตโนมัติ — ไม่ต้องแมป path เอง คุณแค่คลิก “AI Suggest Fields” มันอ่านหน้าให้ แล้วคุณก็ได้ตารางข้อมูล แต่ถ้าคุณกำลังสร้าง pipeline แบบกำหนดเอง แผนผังด้านบนคือข้อมูลอ้างอิงของคุณ
ขั้นตอนที่ 3: ดักจับ endpoint API ภายในของ Walmart เพื่อข้อมูลที่ละเอียดกว่า
ไม่มีบทความคู่แข่งไหนอธิบายวิธีนี้อย่างเหมาะสม มันคือเส้นทางการดึงข้อมูลที่ทรงพลังที่สุด — และซับซ้อนที่สุด
เฟรอนต์เอนด์ของ Walmart เรียกใช้ แบ็กเอนด์ GraphQL แบบ federated ที่สร้างบน Apollo Gateway endpoint อยู่ภายใต้ www.walmart.com/orchestra/*:
/orchestra/pdp/graphql/...— ข้อมูล hydration ของหน้าสินค้า + การสลับรุ่นย่อย/orchestra/snb/graphql/...— การแบ่งหน้าของ search-n-browse/orchestra/reviews/graphql/...— รีวิวแบบแบ่งหน้า
สิ่งเหล่านี้ส่ง JSON ที่สะอาดและมีโครงสร้าง พร้อมข้อมูลที่ __NEXT_DATA__ บางครั้งตัดทิ้ง เช่น ราคาในระดับรุ่นย่อย จำนวนสต็อกแบบเรียลไทม์ และการแบ่งหน้าของรีวิวแบบเต็มๆ
จุดที่บทความมักอ้อมไปอ้อมมา: Walmart ใช้ Apollo persisted queries เนื้อหาใน request body จะส่งแค่ SHA-256 hash (persistedQuery.sha256Hash) ไม่ได้ส่ง query text ถ้าเซิร์ฟเวอร์ไม่รู้จัก hash นั้น คุณจะได้ PersistedQueryNotFound Walmart เปลี่ยน hash เหล่านี้ทุกครั้งที่ deploy นี่คือเหตุผลที่สคริปต์โอเพนซอร์สระดับดังสำหรับ Walmart ไม่มีใครปล่อยโค้ด /orchestra/ ที่ก๊อปวางแล้วใช้ได้ตรงๆ
เวอร์ชันที่ใช้งานได้จริงแบบตรงไปตรงมาคือการไล่ดูใน DevTools:
- เปิดหน้า product ของ Walmart ใน Chrome
- เปิด DevTools → แท็บ Network แล้วกรองด้วย “Fetch/XHR”
- ใช้งานหน้าแบบปกติ — คลิกรุ่นย่อย เลื่อนลงไปดูรีวิว เปลี่ยนตำแหน่งร้าน
- มองหา request ไปยัง endpoint
/orchestra/*ที่ส่งกลับ JSON พร้อมข้อมูลสินค้า - คลิกขวาที่ request → “Copy as cURL”
- แปลงคำสั่ง cURL เป็น Python ด้วย
curl_cffi
ตัวอย่างการเรียก API ที่ replay แล้ว:
import json
from curl_cffi import requests
session = requests.Session(impersonate="chrome124")
# ก่อนอื่น ให้อุ่นเซสชันด้วยการเข้า product page
session.get("https://www.walmart.com/ip/some-product/1234567", headers=HEADERS)
# จากนั้น replay internal API call (คัดลอกจาก DevTools)
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": "your-copied-correlation-id",
}
payload = {
# วาง request body ตรงจาก DevTools
"variables": {"productId": "1234567"},
"extensions": {
"persistedQuery": {
"version": 1,
"sha256Hash": "the-hash-you-copied"
}
}
}
api_response = session.post(api_url, headers=api_headers, json=payload)
api_data = api_response.json()
ขั้นตอนการอุ่นเซสชันสำคัญมาก คุกกี้ PerimeterX ของ Walmart (_px3, _pxhd, ACID) ต้องถูกตั้งค่าจากการดึง HTML ครั้งแรกก่อนที่ API call จะสำเร็จ ถ้าไม่มี คุณจะได้ 412 หรือ 403
เมื่อไรควรใช้วิธีนี้: ตอนที่คุณต้องการข้อมูลที่ __NEXT_DATA__ ไม่มี เช่น ราคาระดับรุ่นย่อย จำนวนรีวิวแบบแบ่งหน้าหลังจากชุดแรก หรือจำนวนสต็อกแบบเรียลไทม์ สำหรับการใช้งานส่วนใหญ่ __NEXT_DATA__ เพียงพอและง่ายกว่ามาก
ดึงข้อมูลผลการค้นหา Walmart และหลายหน้า
ผลการค้นหามีรูปแบบ __NEXT_DATA__ คล้ายกัน แต่ใช้ JSON path ต่างออกไป:
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"]
# กรองสินค้าที่ได้รับการสนับสนุนออก
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"))
การแบ่งหน้าทำได้โดยเพิ่มพารามิเตอร์ page: &page=1, &page=2 เป็นต้น แต่มีข้อจำกัดที่ไม่ได้ระบุไว้ชัดเจน: Walmart จำกัดหน้าผลการค้นหาไว้ที่ 25 หน้า ไม่ว่าจำนวนผลลัพธ์จริงจะมีเท่าไร Scrapfly ยืนยัน: “Walmart กำหนดจำนวนหน้าผลลัพธ์สูงสุดที่เข้าถึงได้ไว้ที่ 25 หน้า ไม่ว่าจำนวนหน้าจริงจะมีเท่าไร”
วิธีอ้อมเพื่อให้ครอบคลุมได้ลึกขึ้น:
- สลับลำดับการจัดเรียง: รันคำค้นเดิมด้วย
&sort=price_lowแล้วตามด้วย&sort=price_highเพื่อให้ครอบคลุมได้ประมาณ 50 หน้า - ตัดตามช่วงราคา: เพิ่ม
&min_price=X&max_price=Yเพื่อแบ่งแค็ตตาล็อกเป็นช่วงย่อย - ตัดตามหมวดหมู่: ค้นหาในหมวดเฉพาะแทนการค้นหาทั่วทั้งไซต์
สังเกตว่า itemStacks เป็นอาร์เรย์ Scrapfly hardcode [0] ไว้ใน repo ของเขา แต่หน้าหมวดหมู่และหน้า browse บางครั้งมีหลาย stack (“Top picks,” “More results”) แพตเทิร์นที่แข็งแรงกว่าจะวนทุก stack:
for stack in search_result.get("itemStacks", []):
for item in stack.get("items", []):
if item.get("__typename") == "Product":
# ประมวลผล item
pass
อีกเรื่องที่ควรจำ: robots.txt ของ Walmart ไม่อนุญาต /search หน้ารายละเอียดสินค้า (/ip/...) และหน้าหมวดหมู่ส่วนใหญ่ (/cp/...) ไม่ได้ถูกห้าม หากคุณกังวลเรื่องการปฏิบัติตามข้อกำหนด ให้เริ่มจากหน้าสินค้าและโครงสร้างหมวดหมู่แทนการใช้ search
อย่าให้การบล็อกแบบเงียบทำลายข้อมูลของคุณ: การจัดการข้อผิดพลาดระดับโปรดักชัน
บทความส่วนใหญ่พังตรงนี้ พวกเขาแสดงวิธีดึงหนึ่งหน้า แยกหนึ่งสินค้า แล้วก็จบ แต่ในโปรดักชันคุณกำลังดึงเป็นพันหน้า และ Walmart ก็กำลังพยายามหยุดคุณอยู่ ความต่างระหว่างสคริปต์เดโมกับสคริปต์ที่ใช้งานได้จริง คือวิธีรับมือกับความล้มเหลว
ตรวจจับการบล็อกแบบเงียบก่อนที่มันจะทำให้ข้อมูลเสีย
ฟังก์ชันที่สำคัญที่สุดใน Walmart scraper คือ block detector จากฉันทามติของผู้ให้บริการอย่าง ScrapingBee, Scrapingdog, Oxylabs และ Decodo คุณต้องมี 4 การตรวจสอบแยกกัน:
BLOCK_MARKERS = (
"Robot or human",
"Press & Hold",
"Press & Hold",
"px-captcha",
"perimeterx",
)
def is_walmart_blocked(response) -> bool:
# 1. ถูก redirect ไปยัง endpoint block โดยเฉพาะ
if "/blocked" in str(response.url):
return True
# 2. status code แบบหนัก
if response.status_code in (403, 412, 428, 429, 503):
return True
# 3. 200 OK แต่เนื้อหาเป็น CAPTCHA (กรณี silent block)
body = response.text or ""
if any(m.lower() in body.lower() for m in BLOCK_MARKERS):
return True
# 4. ตรวจความสมเหตุสมผลของขนาด response — PDP จริงมักอยู่ที่ 300-900 KB
if len(response.content) < 50_000 and "/ip/" in str(response.url):
return True
return False
การตรวจสอบข้อที่ 4 — ขนาด response — ใช้จับกรณีที่ Walmart ส่งหน้าที่ถูกตัดทอน ซึ่งไม่มี marker CAPTCHA ที่ชัดเจน แต่ก็ไม่มีข้อมูลสินค้าที่คุณต้องการเช่นกัน
Retry พร้อม Exponential Backoff และ Jitter
เมื่อ request ล้มเหลว คุณไม่ควรยิง Walmart ซ้ำทันที รูปแบบมาตรฐานคือใช้ exponential backoff ร่วมกับ jitter เพื่อไม่ให้การ retry พุ่งพร้อมกัน:
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"Throttled: {response.status_code}")
if is_walmart_blocked(response):
raise Exception("ตรวจพบการบล็อกแบบเงียบ")
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"ลองครั้งที่ {attempt + 1} ไม่สำเร็จ: {e} จะลองใหม่ใน {wait:.1f} วินาที")
time.sleep(wait)
return None
jitter (random.uniform(0, 3)) ไม่ได้มีไว้ตกแต่ง — มันช่วยแยกจังหวะของ worker หลายตัว เพื่อไม่ให้สคริปต์จำนวนมากรีไทรพร้อมกันในวินาทีเดียวจนไปกระตุ้นตัวตรวจจับความถี่ของ Akamai
การจำกัดอัตรา
ทั้ง Thunderbit และ Scrape.do ลงความเห็นตรงกันว่าควรใช้ ดีเลย์แบบสุ่ม 3–6 วินาทีต่อ request สำหรับ Walmart: “ให้ลดอัตราคำขอโดยเว้น 3–6 วินาทีระหว่างการโหลดหน้า และสุ่มเวลาให้ไม่ตายตัว”
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
ถ้าเป็นงานระดับสเกล ให้พิจารณาใช้ aiolimiter สำหรับการจำกัดอัตราแบบ async:
from aiolimiter import AsyncLimiter
limiter = AsyncLimiter(max_rate=10, time_period=60) # 10 requests ต่อ นาที
การตรวจสอบความถูกต้องของข้อมูล
แม้ response จะไม่ถูกบล็อก ข้อมูลที่แยกได้ก็อาจผิดได้ (ร้านผิด, payload เสื่อมสภาพ) ควรตรวจสอบก่อนเขียนออกไฟล์:
def validate_product(product):
"""คืนค่า True ถ้าข้อมูลสินค้าดูสมเหตุสมผล"""
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
การบันทึกสถานะเซสชัน
ติดตามอัตราความสำเร็จต่อเซสชันไว้ด้วย ถ้ามันตกต่ำกว่า 80% เป็นเวลา 10 นาที แปลว่ามีอะไรเปลี่ยนไป — ไม่ว่า IP จะถูกเผา คุกกี้หมดอายุ หรือ Walmart เพิ่งปล่อยกฎ anti-bot ใหม่
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"อัตราความสำเร็จตกลงเหลือ {self.success_rate:.1f}% — ควรพิจารณาเปลี่ยน proxy หรือหยุดพัก")
ไม่หวือหวา แต่สิ่งนี้แหละที่ช่วยให้ข้อมูลของคุณสะอาด
เขียน Python เอง vs. ใช้ Scraping API vs. ไม่ต้องเขียนโค้ด: เลือกแนวทางที่เหมาะกับการดึงข้อมูล Walmart
นักพัฒนาหลายคนพุ่งไปเขียน scraper เองทันทีโดยไม่ถามก่อนว่านั่นคือทางเลือกที่ถูกไหม ScrapeOps ให้คะแนนความยากของ Walmart ไว้ 9/10 ผู้ใช้ในฟอรัมมักอธิบายว่ามัน “เกือบจะ 9/10” และสงสัยว่า “API สำหรับดึงข้อมูลโดยเฉพาะจะเกินความจำเป็นไหม” คำตอบขึ้นอยู่กับปริมาณ งบประมาณ และกำลังของทีมวิศวกรรม
| ปัจจัย | DIY Python (requests + proxies) | Scraping API (Oxylabs, Bright Data, ฯลฯ) | เครื่องมือไม่ต้องเขียนโค้ด (Thunderbit) |
|---|---|---|---|
| เวลาตั้งค่าถึงแถวแรก | หลายชั่วโมง | 15–60 นาที | ประมาณ 2 นาที |
| เวลาตั้งค่าถึงใช้งานจริง | 40–80 ชม. | 4–16 ชม. | ประมาณ 30 นาที |
| การจัดการ anti-bot | คุณต้องดูแลเอง (ยาก) | ผู้ให้บริการดูแลให้ | จัดการให้อัตโนมัติ |
| ค่าใช้จ่ายเมื่อสเกลเล็ก (<1K หน้า/เดือน) | ต่ำ (ค่า proxy ประมาณ $4–8/GB) | แพ็กเกจเริ่มต้น $40–$49/เดือน | ฟรี–$15/เดือน |
| ค่าใช้จ่ายเมื่อสเกลใหญ่ (100K+ หน้า/เดือน) | ต้นทุนต่อคำขอต่ำกว่า | ต้นทุนต่อคำขอสูงกว่า | แตกต่างกันไป |
| การปรับแต่ง | ควบคุมได้เต็มที่ | ปรับได้ตามพารามิเตอร์ API | จำกัดตาม UI/ฟิลด์ |
| การดูแลต่อเนื่อง | 4–8 ชม./เดือน | แทบไม่มี | ไม่มี (AI ปรับตัวให้) |
| เหมาะที่สุดสำหรับ | นักพัฒนาที่สร้าง pipeline แบบกำหนดเอง | งานสเกลกลางในโปรดักชัน | ผู้ใช้ธุรกิจ, งานดึงข้อมูลครั้งคราวแบบเร่งด่วน |
เมื่อไร DIY Python ถึงคุ้ม
DIY คุ้มเมื่อคุณมีสัญญา proxy อยู่แล้ว ต้องการควบคุม header, การกำหนด zip code หรือกลุ่มผู้ขายอย่างเข้มงวด คุณกำลังทำดัชนีเป็นล้านหน้าในแต่ละเดือนจนค่าธรรมเนียมต่อเรคคอร์ดของ API ทบกันเยอะ หรือคุณต้องการข้อกำหนดด้าน on-prem หรือ compliance ต้นทุนที่แลกมาคือเวลาเชิงวิศวกรรมจริงจัง: Scrapy spider ที่พร้อมใช้งานระดับโปรดักชันพร้อม pagination, retries, การสลับ proxy, TLS impersonation และ schema ของหลายประเภทหน้า ใช้เวลา 40–80 ชั่วโมงของงาน Python ระดับ senior บวกกับค่าดูแล 4–8 ชั่วโมงต่อเดือนเมื่อ Walmart เปลี่ยน fingerprint
เมื่อ Scraping API ช่วยประหยัดเวลา
Scraping API ช่วยจัดการชั้น anti-bot ให้คุณ ผลทดสอบของ ScrapeOps แสดงอัตราความสำเร็จ 99% สำหรับ Zyte API และ 98% สำหรับ Scrape.do บน Walmart ราคาแพ็กเกจเริ่มต้นอยู่ที่ $40–$49/เดือนสำหรับเครื่องมืออย่าง ScraperAPI, Oxylabs และ Scrapingdog ถ้าคุณเป็นทีม 2–5 คนและปริมาณการดึงข้อมูลอยู่ที่ 10K–1M หน้า/เดือน API มักจะเป็นคำตอบที่เหมาะที่สุด คุณแลกต้นทุนต่อคำขอเพื่อแลกกับไม่ต้องดูแล
เมื่อไม่ต้องเขียนโค้ดคือคำตอบที่ใช่
Thunderbit เหมาะกับอีกโปรไฟล์หนึ่งโดยสิ้นเชิง ถ้าคุณเป็น PM, นักวิเคราะห์ หรือผู้ดูแลอีคอมเมิร์ซที่ต้องการข้อมูลสินค้า Walmart ลงในสเปรดชีตภายในบ่ายนี้ — ไม่ใช่สปรินต์หน้า — เครื่องมือแบบไม่ต้องเขียนโค้ดคือคำตอบที่ตรงไปตรงมา
เวิร์กโฟลว์คือ: ติดตั้ง Thunderbit Chrome Extension เข้าไปที่หน้าสินค้าหรือหน้าค้นหาของ Walmart คลิก “AI Suggest Fields” แล้ว AI ของ Thunderbit จะอ่านหน้าและแนะนำคอลัมน์ (ชื่อสินค้า ราคา คะแนน ฯลฯ) คลิก “Scrape” แล้วข้อมูลจะถูกเติมลงในตาราง ส่งออกไปยัง Excel, Google Sheets, Airtable หรือ Notion — ฟรีทั้งหมด ไม่มี paywall
Thunderbit จัดการ anti-bot บนคลาวด์ให้ คุณจึงไม่ต้องยุ่งกับ CAPTCHA, proxy หรือ TLS fingerprinting AI จะปรับตัวตามการเปลี่ยน layout อัตโนมัติ จึงแทบไม่มีงานดูแล สำหรับผู้ใช้ที่ไม่อยากจัดการกับการไล่ JSON path เลย นี่คือเส้นทางที่ต้านทานน้อยที่สุด
ข้อจำกัดแบบตรงไปตรงมา: Thunderbit ไม่ได้สร้างมาเพื่อดึงข้อมูล 100K+ หน้า/วัน โควตาเครดิตและข้อจำกัดฝั่งคลาวด์ทำให้การ ingest ปริมาณสูงไม่คุ้มเมื่อเทียบกับ API ตรงๆ และคุณก็ยังไม่สามารถล็อก zip code หรือ ASN แบบเฉพาะเจาะจงได้ เว้นแต่ว่าเครื่องมือรองรับ ถ้าเป็น pipeline ระยะยาวปริมาณสูง DIY หรือ scraping API ยังเป็นทางเลือกที่เหมาะกว่า
คำนวณคร่าวๆ: ข้อมูลสินค้า Walmart 1,000 แถวบน Thunderbit ใช้ประมาณ 2,000 เครดิต (ราว $0.60–$1.10 ในแพ็กเกจ Starter/Pro) ซึ่งใกล้เคียงกับ Walmart API ของ Oxylabs และถูกกว่า scraping API ระดับงานอดิเรกส่วนใหญ่เมื่อปริมาณต่ำ ดูราคาของ Thunderbit สำหรับรายละเอียดล่าสุด
ดึงข้อมูลสินค้า Walmart ด้วย AI Get Started Free
การส่งออกข้อมูล Walmart ที่คุณดึงมา
พอได้ข้อมูลแล้ว คุณก็ต้องส่งไปไว้ในที่ที่ใช้งานได้จริง รูปแบบหลักๆ 3 แบบครอบคลุมความต้องการส่วนใหญ่:
CSV — รูปแบบพื้นฐานที่นักวิเคราะห์เปิดใช้จริง:
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})
ใช้ encoding utf-8-sig เพื่อให้เข้ากับ Excel ได้ BOM marker จะช่วยป้องกันไม่ให้ Excel ทำอักขระพิเศษเพี้ยน
JSONL — รูปแบบสำหรับโปรดักชันของ pipeline ดึงข้อมูล:
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 ทนทานต่อการล้มเหลว (ถ้าการเขียนถูกตัดกลางคันจะเสียแค่บรรทัดสุดท้าย) สตรีมได้ด้วยหน่วยความจำคงที่ และเก็บข้อมูลแบบซ้อน เช่น รุ่นย่อยและรีวิว ได้ครบ
Excel — สำหรับส่งต่อให้ analyst แบบครั้งเดียว:
from openpyxl import Workbook
def export_excel(products, filename="walmart_products.xlsx"):
wb = Workbook(write_only=True)
ws = wb.create_sheet("Products")
ws.append(["Name", "Price", "Availability", "Rating", "Reviews", "Seller"])
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 ครอบคลุมเรื่อง export ให้กับคนที่ไม่ใช้ Python: ส่งออกไปยัง Google Sheets, Airtable, Notion, Excel, CSV และ JSON ได้ในคลิกเดียว — ฟรีทั้งหมดในแพ็กเกจพื้นฐาน สำหรับการเฝ้าติดตามต่อเนื่อง ฟีเจอร์ scheduled scraper ของ Thunderbit สามารถรันการดึงข้อมูลซ้ำได้อัตโนมัติ
ข้อควรระวังเรื่องการตั้งเวลา: อย่าใช้ GitHub Actions สำหรับการดึงข้อมูล Walmart runner ของ GitHub Actions อยู่บนช่วง IP ของ Azure ซึ่ง anti-bot ของ Walmart บล็อกทันที ใช้ APScheduler บน VPS หรือส่งทราฟฟิกทั้งหมดผ่าน proxy แบบ residential แทน
แนวทางด้านกฎหมายและจริยธรรมสำหรับการดึงข้อมูล Walmart
ผู้ใช้ในฟอรัมพูดถึงเรื่องนี้ตรงๆ ว่า: “ผมโอเคกับการเล่นแมวไล่จับกับนักพัฒนา แต่ไม่ค่อยอยากเล่นกับทีมกฎหมายของเขา”
เงื่อนไขการใช้งานของ Walmart ระบุห้ามอย่างชัดเจน ไม่ให้ใช้ “หุ่นยนต์ สไปเดอร์… หรืออุปกรณ์แบบแมนนวลหรืออัตโนมัติอื่นใดเพื่อดึงข้อมูล จัดทำดัชนี ‘scrape,’ ‘data mine’ หรือรวบรวม Materials ใดๆ” โดยไม่ได้รับ “ความยินยอมเป็นลายลักษณ์อักษรล่วงหน้าอย่างชัดแจ้ง”
robots.txt ของ Walmart ห้าม /search, /account, /api/ และ endpoint ภายในอีกหลายสิบรายการ หน้ารายละเอียดสินค้า (/ip/...) และรีวิว (/reviews/product/) ไม่ได้ถูกห้าม
บรรทัดฐาน hiQ v. LinkedIn (ศาลอุทธรณ์ภาค 9, 2022) ระบุว่าการดึงข้อมูลสาธารณะไม่น่าจะละเมิด CFAA ของรัฐบาลกลาง แต่คดีเดียวกันกลับลงเอยด้วยการที่ hiQ ละเมิดข้อตกลงผู้ใช้ของ LinkedIn และถูกตัดสินยอมรับค่าเสียหาย 500,000 ดอลลาร์ ต่อมาในปี 2024 มีคำตัดสินเพิ่มเติม (Meta v. Bright Data, X Corp. v. Bright Data) ที่ทำให้ขอบเขตของ CFAA แคบลงและเปิดแนวทางป้องกันเรื่อง copyright-preemption แต่คำตัดสินเหล่านั้นอาศัยถ้อยคำ ToU เฉพาะกรณีซึ่งไม่ได้แมปเข้ากับ Walmart แบบตรงตัว
แนวทางปฏิบัติ: อย่าถาโถมเซิร์ฟเวอร์ เคารพ rate limit อย่าดึงข้อมูลส่วนบุคคลหรือข้อมูลผู้ใช้ ใช้ข้อมูลอย่างรับผิดชอบ การดึงข้อมูลหน้าสินค้า Walmart แบบสาธารณะในอัตราที่พอเหมาะเพื่อการวิจัยส่วนตัว มีระดับความเสี่ยงต่างจากการดึงในระดับเชิงพาณิชย์ที่ฝ่าฝืนเงื่อนไขของ Walmart อย่างมาก ถ้าคุณกำลังสร้างผลิตภัณฑ์บนข้อมูล Walmart ให้ปรึกษาทนายและดู API อย่างเป็นทางการของ Walmart สำหรับ affiliate และ seller
ข้อจำกัดความรับผิด: ข้อมูลนี้มีไว้เพื่อการศึกษา ไม่ใช่คำแนะนำทางกฎหมาย
สรุปและประเด็นสำคัญ
การดึงข้อมูล Walmart ด้วย Python คือความท้าทายระดับ 9/10 เพราะมีชั้น anti-bot คู่ของ Akamai + PerimeterX ไม่ได้แปลว่าเป็นไปไม่ได้ — แต่คุณต้องมีเครื่องมือและแพตเทิร์นที่ถูกต้อง
ประเด็นสำคัญ:
- การดึงข้อมูลจาก JSON
__NEXT_DATA__คือทางเลือกเชิงปฏิบัติ สำหรับ use case ส่วนใหญ่ มันคือวิธีที่สคริปต์โอเพนซอร์สสำหรับ Walmart ที่จริงจังในช่วง 2024–2026 ใช้กัน โครงสร้างพื้นฐานคือprops.pageProps.initialData.data.productสำหรับ PDP และsearchResult.itemStacksสำหรับ search/browse curl_cffiพร้อมimpersonate="chrome124"เป็นสิ่งจำเป็นrequestsหรือhttpxแบบธรรมดาไม่สามารถผ่าน TLS fingerprinting ของ Akamai ได้ไม่ว่าคุณจะตั้ง header อะไร- การบล็อกแบบเงียบคืออันตรายจริง Walmart ส่งกลับ 200 OK พร้อม body แบบ CAPTCHA ดังนั้นต้องเช็กเนื้อหาที่ตอบกลับ ไม่ใช่แค่ status code
- scraper ระดับโปรดักชันต้องมีมากกว่าโค้ดแบบ happy path exponential backoff พร้อม jitter, การตรวจจับบล็อกจากสัญญาณ 4 แบบ, rate limiting ที่ 3–6 วินาทีต่อ request, การตรวจสอบความถูกต้องของข้อมูล และการเฝ้าระวังสุขภาพเซสชัน ล้วนจำเป็น
- การดักจับ API ภายในผ่าน
/orchestra/*ทรงพลังแต่เปราะบาง ใช้เป็นการฝึกไล่ดูใน DevTools สำหรับความต้องการข้อมูลเฉพาะ ไม่ใช่วิธีหลักในการดึงข้อมูล - Walmart จำกัดผลการค้นหาไว้ที่ 25 หน้า ถ้าต้องการกว้างขึ้น ให้สลับลำดับการจัดเรียงและตัดช่วงราคาย่อย
- เลือกแนวทางอย่างตรงไปตรงมา: DIY Python สำหรับนักพัฒนาที่มีความต้องการเฉพาะและปริมาณสูง, Scraping API สำหรับทีมขนาดกลางที่ไม่มีวิศวกร scraping, Thunderbit สำหรับผู้ใช้ธุรกิจที่อยากได้ข้อมูลลง Google Sheets ภายในบ่ายนี้
ถ้าคุณอยากลองทางไม่ต้องเขียนโค้ด Thunderbit Chrome Extension มีแพ็กเกจฟรี คุณสามารถดึงข้อมูล Walmart ได้ไม่กี่หน้าแล้วดูผลลัพธ์ด้วยตัวเอง ถ้าคุณจะไปทาง Python แพตเทิร์นโค้ดในบทความนี้ผ่านการทดสอบในงานจริงแล้ว ไม่ว่าทางไหน ตอนนี้คุณก็มีแผนที่ของระบบป้องกัน Walmart และ 3 เส้นทางที่จะฝ่ามันได้
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเทคนิคการดึงข้อมูลเว็บ ลองดูคู่มือของเราเรื่อง วิธีทำเว็บสแครปด้วย Python, เครื่องมือดึงข้อมูลเว็บอัตโนมัติที่ดีที่สุด, และ การดึงข้อมูลเว็บโดยไม่โดนบล็อก คุณยังสามารถดูวิดีโอสอนต่างๆ ได้ที่ Thunderbit YouTube Channel
คำถามที่พบบ่อย
การดึงข้อมูลสินค้าจาก Walmart ถือว่าถูกกฎหมายไหม?
เงื่อนไขการใช้งานของ Walmart ห้ามการดึงข้อมูลอัตโนมัติโดยไม่ได้รับความยินยอมเป็นลายลักษณ์อักษร คำตัดสิน hiQ v. LinkedIn ของศาลอุทธรณ์ภาค 9 (2022) ระบุว่า CFAA ของรัฐบาลกลางไม่น่าจะใช้กับการดึงข้อมูลหน้าสาธารณะได้ แต่คดีเดียวกันก็จบลงด้วยคำพิพากษาเรื่องละเมิดสัญญามูลค่า 500,000 ดอลลาร์ ต่อผู้ดึงข้อมูล การดึงหน้าสินค้าสาธารณะในอัตราไม่สูงเพื่อการวิจัยส่วนตัวมีระดับความเสี่ยงต่างจากการดึงเชิงพาณิชย์อย่างมาก ถ้าคุณกำลังสร้างธุรกิจบนข้อมูล Walmart ควรปรึกษาทนาย
ทำไม scraper ของ Walmart ฉันถึงโดนบล็อกตลอด?
สาเหตุที่พบบ่อยที่สุดคือ: ใช้ requests หรือ httpx แบบธรรมดา (ซึ่งส่ง TLS fingerprint แบบเฉพาะของ Python จน Akamai ตรวจจับได้ทันที), ตั้ง header ไม่ครบหรือไม่ถูกต้อง, ไม่มีการสลับ proxy, ยิง request ถี่กว่าทุก 3–6 วินาทีต่อหน้า, และคุกกี้เซสชันหายไป (_px3, _abck, locDataV3) เปลี่ยนไปใช้ curl_cffi พร้อม impersonate="chrome124", ใช้ residential proxy และนำการตรวจจับบล็อกกับรูปแบบ retry ที่อธิบายในบทความนี้ไปใช้
ฉันดึงข้อมูลอะไรจาก Walmart ด้วย Python ได้บ้าง?
ชื่อสินค้า, ราคา (ปัจจุบันและ rollback), รูปภาพ, คำอธิบายสั้นและยาว, คะแนนรีวิว, จำนวนรีวิว, สถานะสต็อก, ชื่อผู้ขาย, ข้อมูลผู้ผลิต, ตัวเลือกรุ่นย่อย (ขนาด สี) และตำแหน่งในหมวดหมู่ ด้วยวิธี __NEXT_DATA__ ข้อมูลทั้งหมดนี้จะอยู่ในรูป JSON ที่มีโครงสร้าง ส่วนการดักจับ API ภายในยังสามารถให้ราคาระดับรุ่นย่อย จำนวนสต็อกแบบเรียลไทม์ และข้อมูลรีวิวแบบแบ่งหน้าได้อีกด้วย
จำเป็นต้องใช้ proxy เพื่อดึงข้อมูล Walmart ไหม?
จำเป็น สำหรับการใช้งานจริงหรือการใช้งานซ้ำๆ ระบบ anti-bot ของ Walmart บล็อกคำขอธรรมดาอย่างสม่ำเสมอ — ต่อให้ header สมบูรณ์แบบ IP ที่ไม่ใช่ residential ก็ยังถูกระบบ reputation ของ Akamai ตรวจจับอยู่ดี ต้องใช้ proxy แบบ residential หรือ mobile ส่วน IP จากดาต้าเซ็นเตอร์จะถูกเผาเกือบทันที งบประมาณคร่าวๆ อยู่ที่ $3–$17 ต่อ 1,000 หน้า ขึ้นอยู่กับผู้ให้บริการและแพ็กเกจ
ฉันสามารถดึงข้อมูล Walmart ได้โดยไม่ต้องเขียนโค้ดไหม?
ได้ Thunderbit คือ Chrome extension ที่ขับเคลื่อนด้วย AI และดึงข้อมูล Walmart ได้ในสองคลิก: “AI Suggest Fields” เพื่อให้ตรวจจับคอลัมน์ข้อมูลสินค้าอัตโนมัติ จากนั้น “Scrape” เพื่อดึงข้อมูลออกมา มันจัดการด่าน anti-bot บนคลาวด์และส่งออกตรงไปยัง Excel, Google Sheets, Airtable หรือ Notion — ฟรีทั้งหมด เหมาะที่สุดสำหรับนักวิเคราะห์, PM และผู้ใช้ธุรกิจที่ต้องการข้อมูลเร็วๆ โดยไม่ต้องสร้าง pipeline เอง ถ้าเป็นงานดึงข้อมูลปริมาณสูงหรือปรับแต่งเยอะ Python หรือ scraping API ยังเป็นทางเลือกที่เหมาะกว่า
ลองใช้ Thunderbit สำหรับ AI Walmart scraping Get Started Free
ดูเพิ่มเติม


