Walmart 제품 데이터를 스크래핑하는 방법: JSON, 지역 가격, 차단
Walmart는 공개 API가 없고, 각 페이지를 개인화하며, 스크래퍼를 누르고 있는 CAPTCHA로 차단합니다. 그러나 Next.js JSON은 구조화된 데이터를 제공합니다 — 만약 IP가 통과한다면. 전체 방법을 소개합니다.
Walmart는 세계 최대의 소매업체로, 그 가격은 실시간 경제 신호입니다 — 그러나 이를 읽을 수 있는 공개 Walmart API는 없습니다. 그래서 사람들은 스크래핑을 합니다. 좋은 소식은: Walmart는 Next.js 사이트이며, 모든 제품 페이지는 이미 구문 분석된 완전하고 깨끗한 데이터가 포함된 단일 JSON 블롭을 가지고 있습니다. 나쁜 소식은: 데이터센터 IP는 그 JSON을 보기 전에 누르고 있는 CAPTCHA에 걸립니다. 이 가이드는 신뢰할 수 있는 방법을 다룹니다 — 스타일이 적용된 HTML 대신 하이드레이션 JSON을 읽고, 올바른 IP로 HUMAN의 봇 방어를 통과하며, 매장 수준의 지역 가격을 가져옵니다.
태그 구문 분석을 중지하세요. __NEXT_DATA__ JSON을 읽으세요
대부분의 튜토리얼은 제목을 위한 h1과 가격을 위한 span을 찾도록 가르칩니다. 이는 Walmart가 클래스 이름을 자주 변경할 때까지 작동합니다. 지속 가능한 접근 방식: Walmart는 id="__NEXT_DATA__"를 가진 스크립트 태그에서 React를 렌더링하며, 전체 제품 모델을 JSON으로 포함합니다. 그것을 한 번 가져오면 모든 필드가 구조화됩니다:
import requests, json
from bs4 import BeautifulSoup
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
}
proxies = {"http": "http://USER:PASS@gate.quantumproxies.io:8000",
"https": "http://USER:PASS@gate.quantumproxies.io:8000"}
url = "https://www.walmart.com/ip/1756765288"
r = requests.get(url, headers=headers, proxies=proxies, timeout=20)
soup = BeautifulSoup(r.text, "html.parser")
blob = soup.find("script", id="__NEXT_DATA__")
data = json.loads(blob.string)
product = data["props"]["pageProps"]["initialData"]["data"]["product"]
print(product["name"], product["priceInfo"]["currentPrice"]["price"])
정확한 키 경로는 시간이 지남에 따라 변경되므로, 최상위 키를 한 번 출력하고 거기서부터 탐색하세요. 하지만 원칙은 유지됩니다: JSON은 진실의 원천이며, 가격, 가용성, 판매자, 변형 및 평가를 한 곳에 포함하고 있습니다 — 필드별 선택기가 필요 없습니다.
문: "로봇인가 인간인가?"
데이터센터 IP에서 요청을 실행하면 제품 JSON을 얻지 못하고 "로봇인가 인간인가? 버튼을 눌러 인간임을 확인하세요."라는 페이지를 받게 됩니다. 이는 Walmart가 실행하는 HUMAN(이전의 PerimeterX)이라는 봇 방어 계층입니다. 이는 IP 평판, TLS 지문 및 헤더를 함께 평가하며, 점수가 낮을 때 누르고 있는 도전을 제공합니다.
그 CAPTCHA를 해결하는 것이 아니라, 그것을 유발하지 않는 것입니다. 가장 큰 지렛대는 IP입니다. 주거용 프록시는 실제 Walmart 쇼핑객의 연결로 나타나며, 점수를 충분히 높게 유지하여 실제 페이지를 제공합니다. 데이터센터 범위는 의심스럽게 사전 점수화되어 요청 하나에 벽을 맞습니다. HUMAN이 자동화를 감지하는 방법에 대한 우리의 분석은 그 점수에 기여하는 다른 요소를 다룹니다.

지역 가격: 하나의 제품, 여러 가격
Walmart의 가격과 재고는 매장별로 다릅니다. 동일한 항목은 쇼핑 위치에 따라 다른 가격과 가용성을 보여주므로, 위치가 설정되지 않은 스크래퍼는 임의의 매장을 읽고 있는 것입니다. ZIP으로 위치를 설정하여 어느 매장을 가격 책정할지 제어하세요 — Walmart는 이를 위치 쿠키에 유지하므로 모든 요청에 이를 전송하세요:
# pin the store location by US ZIP before reading price/stock
cookies = {"assortmentStoreId": "3081", "locationData": '{"postalCode":"10001"}'}
r = requests.get(url, headers=headers, cookies=cookies,
proxies=proxies, timeout=20)
# now priceInfo + availabilityStatus reflect that store
시장에서 제품을 비교하려면 ZIP 목록을 반복하고 각 지역의 주거용 출구와 짝지으세요 — 뉴욕 쇼핑객이 NYC 매장 가격을 읽는 것이 한 위치를 주장하지만 다른 곳에서 종료되는 요청보다 훨씬 일관성이 있습니다. 그 지리적 일관성은 경쟁자 가격 모니터링이 생존하는 데 필수적입니다.
검색 페이지 및 페이지 매김
카탈로그 작업을 위해서는 제품 페이지뿐만 아니라 검색 결과를 스크래핑하세요. 알아야 할 두 가지: Walmart는 사용자별로 검색 순서를 개인화하므로 실행 간에 안정적인 순위를 기대하지 마세요, 그리고 결과는 여러 페이지에 걸쳐 있으며 page 매개변수로 페이지를 넘깁니다. 동일한 __NEXT_DATA__ 패턴이 적용됩니다 — 검색 JSON은 가격과 ID가 포함된 전체 항목 목록을 가지고 있으므로, 변형 수준의 세부 정보를 원하지 않는 한 제품 페이지를 거의 건드릴 필요가 없습니다:
def search(query, pages=5):
items = []
for page in range(1, pages + 1):
url = f"https://www.walmart.com/search?q={query}&page={page}"
html = requests.get(url, headers=headers, cookies=cookies,
proxies=proxies, timeout=20).text
blob = BeautifulSoup(html, "html.parser").find("script", id="__NEXT_DATA__")
data = json.loads(blob.string)
stacks = data["props"]["pageProps"]["initialData"]["searchResult"]["itemStacks"]
for stack in stacks:
items += stack["items"]
return items
손으로 직접 작성하는 것을 언제 멈출지
원시 요청과 주거용 IP는 Walmart에서 많은 것을 얻을 수 있습니다. 그만한 가치가 없어지는 지점은 규모입니다: 요청당 출구를 회전시키고, 여전히 벽에 부딪히는 요청을 재시도하며, 수천 개의 ZIP에 걸쳐 매장 쿠키 논리를 일관되게 유지하는 것은 실제로 유지보수 부담입니다. 브라우저 지문을 포함하고, 주거용 IP를 회전시키며, 구문 분석된 JSON을 반환할 수 있는 Scraper API는 이를 단일 호출로 축소합니다 — Walmart URL을 보내고 제품 모델을 반환받으며, 차단이 처리됩니다. 페이지가 데이터 대신 CAPTCHA 셸로 돌아오면, 이는 고전적인 빈 페이지 증상이며, 이는 렌더링 및 IP 문제이지 파서 버그가 아닙니다.

Walmart에 도달할 수 있는 주거용 IP를 얻으세요
자주 묻는 질문
Walmart에 제품 데이터 API가 있습니까?
임의의 제품 및 가격 데이터를 위한 공개 API는 없으며, 그래서 스크래핑이 일반적인 경로입니다. Walmart의 제휴 및 마켓플레이스 판매자 API는 존재하지만 제한적이고 범위가 제한적입니다. 광범위한 제품, 가격 및 가용성 수집을 위해서는 주거용 IP를 통해 페이지의 __NEXT_DATA__ JSON을 읽는 것이 실용적인 방법입니다.
Walmart 가격을 차단 없이 스크래핑하려면 어떻게 해야 하나요?
요청을 주거용 프록시를 통해 라우팅하여 HUMAN의 봇 방어가 당신을 실제 쇼핑객으로 평가하도록 하고, 일관된 브라우저 User-Agent와 Accept-Language를 보내며, 많은 선택기 요청을 두드리는 대신 하이드레이션 JSON을 읽으세요. ZIP 쿠키로 매장을 고정하고 출구 지역을 일관되게 유지하세요. 이 조합은 대부분의 요청에서 누르고 있는 CAPTCHA를 피합니다.
왜 Walmart는 동일한 제품에 대해 다른 가격을 보여주나요?
Walmart의 가격과 재고는 매장 수준입니다. 세션에 설정된 위치에 따라 보이는 가격이 다르므로, 다른 ZIP 위치로 두 번 요청하면 합법적으로 다른 가격을 반환합니다. 비교 가능한 데이터를 수집하려면 ZIP을 명시적으로 고정하고 프록시 출구를 해당 지역과 일치시키세요, Walmart가 IP에서 추측하도록 두지 마세요.
__NEXT_DATA__ JSON이 HTML 구문 분석보다 나은가요?
네, 내구성 측면에서 그렇습니다. Walmart의 가시적인 클래스 이름은 자주 변경되어 CSS 선택기 스크래퍼를 깨뜨리지만, Next.js 하이드레이션 JSON은 가격, 변형, 판매자 및 가용성을 하나의 객체로 안정적으로 구조화된 제품 모델입니다. JSON을 한 번 구문 분석하면 취약한 필드별 선택기 스택을 피할 수 있습니다.
Walmart가 어려운 이유는 데이터가 숨겨져 있어서가 아닙니다 — 페이지 JSON에 바로 있습니다. 어려운 이유는 누가 노크하는지를 확인하기 때문입니다. __NEXT_DATA__를 태그 대신 읽고, ZIP으로 매장을 설정하고, 주거용 IP로 노크하면, 대규모로 깨끗하고 비교 가능한 제품 데이터를 얻을 수 있습니다. 더 넓은 대형 매장 가격 작업을 위해 동일한 플레이북은 Best Buy 및 Target에도 확장됩니다.