如何抓取沃尔玛产品数据:为什么通用代理失效以及什么真正有效
Advanced Bot Mitigation Engineer
重点总结:
- 美国IP与在沃尔玛上的可用响应不同。 沃尔玛评估IP声誉、行为一致性和区域流量集中度——不仅仅是IP解析的国家。普通的美国代理可以返回HTTP 200,但其正文仍然可能是机器人检查或验证码页面。
- HTTP 200 ≠ 可提取的产品数据。 普通的美国代理经常返回
200 OK,其正文是机器人检查或验证码页面,而进一步的请求可能根本不连接。仅凭状态代码无法判断响应是否真实。 - 数据中心IP降解最快;仅有住宅IP不够。 住宅出口提高了基础,但沃尔玛还检查会话是否像浏览器一样进行——运行JavaScript、保持Cookies和展示一致的指纹。原始代理仅传送字节;它不会渲染页面。
- 渲染的反检测浏览器弥补了这一差距。 Scrapeless Scraping Browser将195多个国家的住宅代理与云端JavaScript渲染及反检测指纹相结合,因此返回的页面是真正的产品网格,而不是挑战壳。
- 渲染是可观察的。 Scrapeless Scraping Browser将沃尔玛搜索URL渲染为页面标题
laptop - Walmart.com,产生160多个产品锚点(a[link-identifier])和数十个[data-item-id]节点——这是一个真实的分页产品网格,而不是挑战壳。 - 免费开始。 新的Scrapeless账户包括免费的Scraping Browser运行时——请在app.scrapeless.com注册。
引言:200状态并不是绿色灯光
沃尔玛的公开目录是美国零售中最受关注的数据集之一。定价团队跟踪竞争对手SKU,品牌所有者监控MAP合规性,市场卖家观察买框移动,AI代理将产品属性提取到下游管道中。数据在浏览器中公开可见——这正是为什么如此多的团队假设代理和HTTP客户端足以收集它。
实际上并非如此。沃尔玛上最常见的失败模式是无声的:请求通过美国代理发送,返回200 OK,管道记录成功——但正文是机器人验证页面、空的React壳或者验证码提示。状态线表明一切正常;有效负载不包含任何产品数据。一个依赖状态代码的抓取器会认为赢得了胜利,而什么可用的信息也没有存储。
这篇文章解释了为什么普通代理在沃尔玛上无法满足需求,支持失败率并附上一个公开基准,并展示了在Scrapeless Scraping Browser之上的Python工作流程——一个渲染页面、保持会话状态并通过住宅出口进行路由的反检测云浏览器,因此返回的响应是您实际想要的产品网格。该工作流程提取搜索结果记录(标题、价格、链接、物品ID),并从结果走向其产品详细页面。
您能做什么
- 竞争价格跟踪。 收集竞争沃尔玛SKU的价格、列表价格和折扣标志。
- MAP合规性监控。 品牌所有者监视第三方卖家的定价并标记低于MAP的列表。
- 目录摄取。 将搜索和类别列表输入下游管道,以标准化的产品架构(标题、价格、链接、物品ID)进行处理。
- 买框和卖家智能。 跟踪哪个卖家持有特定列表,以及报价如何随时间变化。
- 可用性和品种。 监测哪些产品在查询中浮现,并观察结果集在各个地区的变化。
- AI代理丰富。 将渲染的产品网格交给一个对目录进行分类、去重或总结的代理。
在Scrapeless,我们仅访问公开可用的数据,同时严格遵守适用法律、法规和网站隐私政策。本文内容仅供演示用途。
为什么普通代理在沃尔玛上失败
普通代理只做一件事:它将您的HTTP请求从不同的IP转发,并返回沃尔玛发送的字节。它不运行JavaScript,不保持浏览器指纹,也不在请求之间保持会话状态。沃尔玛的防护措施就是为了检测原始代理无法伪造的内容。
沃尔玛检查的不仅仅是IP的国家
沃尔玛的反机器人层综合评估多个信号:
- IP声誉——数据中心范围和知名代理池信任度低,且快速引发挑战。
- 行为一致性——客户端是否运行页面脚本、重放Cookies,以及展示的头信息和定时是否与真实浏览器匹配。
- 区域流量集中度——不仅仅是IP解析的国家,而是来自某个区域或子网的流量是否看起来是自然分布或集中,以至于发出自动化信号。
一个国家级的美国代理只满足其中一个检查。这并不说明请求是否运行JavaScript或表现得像一个浏览器,而面向相同端点的美国数据中心IP池则以一种沃尔玛的区域检查旨在捕捉的方式集中流量。
状态码的谎言
最昂贵的症状是看起来像成功的症状。当以大量 US 代理对沃尔玛进行请求时,响应分为三类:少数返回可用产品数据,大量返回机器人检查或 CAPTCHA 页面 尽管状态为 200 OK,其余则根本无法连接。中间这类是一个陷阱——将 200 OK 视为成功的管道会默默地将挑战页面纳入其数据集。有效提取之所以保持低水平,正是因为状态码和有效载荷之间常常存在不一致。
数据中心的快速下降;仅依靠住宅代理不够
通过住宅 IP 路由提高了基准——住宅出口的信任度高于数据中心范围。但是,单靠住宅代理仍然留有行为和渲染的缺口。一个附加到普通 HTTP 客户端的住宅 IP 仍未执行沃尔玛的页面脚本,呈现出稀薄的指纹,并返回未填充的外壳。IP 更受信任;但请求仍然明显是自动化的。
什么真正填补了差距
可靠的沃尔玛代理路径结合了原始代理无法单独提供的三样东西:
- 一个真正渲染的浏览器,能够执行沃尔玛的 JavaScript,使产品网格填充到 DOM 中。
- 住宅出口,确保IP具有数据中心范围所缺乏的信任。
- 行为和指纹一致性——在请求之间保持 cookies 一致,指纹与自然流量匹配,以及持续存在的会话状态。
这个组合就是 Scrapeless Scraping Browser 提供的单一管理表面。
通用代理与渲染云浏览器
| 功能 | 通用美国代理 | Scrapeless Scraping Browser |
|---|---|---|
| 从美国 IP 转发请求 | 是 | 是 |
| 运行沃尔玛的 JavaScript(渲染产品网格) | 否 | 是 — 云端渲染 |
捕获 200 下的 CAPTCHA(返回真实页面,而不是挑战) |
否 | 是 — 渲染的网格填充,或挑战可见 |
| 住宅出口 | 仅当明确为住宅时 | 195+ 个国家的住宅代理 |
| 行为 / 会话一致性(cookies,时序) | 否 | 是 — 持久的会话状态 |
| 反检测浏览器指纹 | 否 | 是 — 在每个会话上 |
| 区域流量一致性 | 从池中集中流量 | 通过住宅网络分配 |
通用代理回答“我可以从美国 IP 发送此请求吗?”的问题。Scrapeless Scraping Browser 则回答真正重要的问题:“我能否返回渲染的产品网格?”
为什么选择 Scrapeless Scraping Browser
Scrapeless Scraping Browser 是一款可定制的、反检测的云浏览器,专为网络爬虫和 AI 代理设计。针对沃尔玛,它特地提供:
- 195+ 个国家的住宅代理,在会话创建时固定到美国出口,因此 IP 承载住宅信任而非数据中心标识。
- 云端 JavaScript 渲染,使沃尔玛的 React 网格填充,并在提取前产品节点在 DOM 中可用。
- 会话持久性,保持 cookies 和浏览器状态在搜索 → 详情流程中一致,而不是在每个请求上重置。
- 每个会话的反检测指纹,使页面的呈现方式与自然流量一致。
- 单一程序化接口——用你的 API 密钥构建一个 CDP URL,连接 Playwright,驱动真实浏览器,而无需建立基础设施。
渲染是可观察行为。Scrapeless Scraping Browser 将 https://www.walmart.com/search?q=laptop 渲染为页面标题 laptop - Walmart.com,yielding 160+ 产品锚点(a[link-identifier])和数十个 [data-item-id] 节点——一个真实的、分页的产品网格,而非挑战外壳。沃尔玛产品 URL 的形式为 https://www.walmart.com/ip/<slug>/<id>,每个结果锚点都解析为一个。
在 app.scrapeless.com 的免费计划中获取你的 API 密钥。 Scraping Browser 产品页面 和 代理解决方案 页面涵盖支持云浏览器的住宅网络。
前提条件
- Python 3.10 或更新版本。
- 一个 Scrapeless 账户和 API 密钥——在 app.scrapeless.com 注册。SDK 从
SCRAPELESS_API_KEY环境变量中读取密钥。 - 基本的终端和 Python 使用熟悉度。
安装
工作流程使用一个包:Playwright for Python,这是官方支持的客户端,通过 CDP 连接到 Scrapeless Scraping Browser,并读取渲染的 DOM。
bash
pip install playwright
Playwright 的 connect_over_cdp 驱动远程云浏览器,因此您不需要 playwright install 或任何本地浏览器二进制文件——渲染在云端进行。然后导出您的 API 密钥,以便它可以用于连接 URL:
bash
export SCRAPELESS_API_KEY=your_api_token_here
连接格式和库指南在 docs.scrapeless.com 上有文档记录。
第一步 — 构建美国出口连接 URL
Scrapeless Scraping Browser 是一个 CDP 端点。使用您的 API 密钥作为 token,并将美国出口设置为 proxyCountry 来构建 WebSocket URL——沃尔玛是一个美国零售网站,使用美国住宅会话是可用响应的基线。
python
import os
from urllib.parse import urlencode
from playwright.sync_api import sync_playwright
def scraping_browser_url(proxy_country="US", session_ttl=240):
# API 密钥通过 `token` 附加在 URL 上;出口和生存时间是查询参数。
params = urlencode({
"token": os.environ["SCRAPELESS_API_KEY"],
"sessionTTL": session_ttl,
"proxyCountry": proxy_country,
})
return f"wss://browser.scrapeless.com/api/v2/browser?{params}"
proxyCountry=US 通过美国住宅 IP 路由会话。sessionTTL=240 保持会话足够长,以便在搜索页面和您接下来访问的产品详情页面上保持 Cookie。
第二步 — 通过 CDP 连接并打开搜索页面
使用 Playwright 的 connect_over_cdp 连接到 Scraping Browser 端点,然后打开沃尔玛搜索 URL。由于这是一个实际渲染的浏览器,沃尔玛的 JavaScript 会执行,产品网格会被加载到 DOM 中。
python
SEARCH_URL = "https://www.walmart.com/search?q=laptop"
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(scraping_browser_url("US"))
page = browser.new_page()
# 首先加载主页,然后在同一会话中打开搜索。
page.goto("https://www.walmart.com/", wait_until="domcontentloaded")
page.wait_for_timeout(2500)
page.goto(SEARCH_URL, wait_until="domcontentloaded")
page.wait_for_timeout(4000) # 让 React 网格加载完成
# 确认响应是真实的产品网格,而不是挑战壳。
title = page.title() # 实际渲染上是 "laptop - Walmart.com"
cards = page.query_selector_all("a[link-identifier]") # 加载时约有 160 个以上的产品锚
print(title, len(cards))
导航后的短暂等待让 React 网格在提取之前完成加载。上述两个检查——页面标题和 a[link-identifier] 锚的数量——是确认响应真实而值得信任的方法。挑战页面不会携带产品标题或渲染网格;真实页面则同时具备这两者。
第三步 — 提取产品网格
每个搜索结果卡片锚定在 a[link-identifier] 上,[data-item-id] 节点携带沃尔玛的商品 ID。遍历锚点,并为每个产品提取标准化记录:标题、价格、链接和商品 ID。
python
import re
def extract_products(page):
products = []
for card in page.query_selector_all("[data-item-id]"):
link_el = card.query_selector("a[link-identifier]")
if not link_el:
continue
href = link_el.get_attribute("href")
item_id = card.get_attribute("data-item-id")
# 标题位于链接文本 / 结果卡片的可访问名称中。
span = link_el.query_selector("span")
title = span.inner_text() if span else link_el.get_attribute("link-identifier")
# 价格在加载后渲染到卡片中;读取可见的价格文本。
price_el = card.query_selector('[data-automation-id="product-price"]')
price = None
if price_el:
m = re.search(r"\d[\d,]*\.?\d*", price_el.inner_text().replace(",", ""))
price = float(m.group()) if m else None
link = href if not href or href.startswith("http") else f"https://www.walmart.com{href}"
products.append({
"itemId": item_id,
"title": (title or "").strip() or None,
"price": price,
"currency": "USD",
"link": link,
})
return products
上述选择器 (a[link-identifier]、[data-item-id]、[data-automation-id="product-price"]) 是搜索网格上稳定的锚点。当布局发生变化时,首先检查实时 DOM:读取渲染的 HTML,确认当前的锚点名称,并根据页面实际提供的内容来收紧选择器。哈希实用程序类名称在部署中会旋转;语义 data-* 锚点是耐用的表面。
获取您的免费计划的API密钥:app.scrapeless.com
第4步 — 从搜索结果跳转到产品详情页
每个结果链接解析为https://www.walmart.com/ip/<slug>/<id>格式的产品详情页。在同一会话中打开一个 — 会话的cookies和指纹会保留,因此详情页的渲染方式与搜索页相同。
python
def text_of(page, selector):
el = page.query_selector(selector)
return el.inner_text().strip() if el else None
def fetch_detail(page, product_url):
page.goto(product_url, wait_until="domcontentloaded")
page.wait_for_timeout(3000)
price_el = page.query_selector('[itemprop="price"]')
return {
"url": product_url,
"title": text_of(page, "h1"),
"price": (price_el.get_attribute("content") if price_el else None)
or text_of(page, '[data-automation-id="product-price"]'),
"brand": text_of(page, '[itemprop="brand"]'),
"availability": text_of(page, '[data-automation-id="fulfillment-section"]'),
}
# 在第2步的同一个 `with sync_playwright() as p:` 会话中:
products = extract_products(page)
if products and products[0]["link"]:
detail = fetch_detail(page, products[0]["link"])
print(detail)
将搜索过程和详情过程保留在一个会话内可以保持行为的一致性:详情页看到的是与渲染搜索网格相同的受信任的cookies和指纹,从而以相同方式被填充。详情页还展示了丰富的字段 — 品牌、完整规格、卖家、交付选项 — 这些在搜索卡片中没有。
您将获得的内容
抓取浏览器返回一个实时渲染的DOM;模式是提取器读取出的内容。对于第3步的搜索网格提取器,记录看起来像这样:
json
// 模式准确反映第3步提取器发出的内容。
// 字段值为示例数据,并非今天的任何产品的快照。
{
"query": "https://www.walmart.com/search?q=laptop",
"resultCount": 60,
"products": [
{
"itemId": "5689219329",
"title": "示例15.6英寸笔记本电脑,16GB RAM,512GB SSD",
"price": 499.0,
"currency": "USD",
"link": "https://www.walmart.com/ip/Example-Laptop-15-6-in/5689219329"
},
{
"itemId": "7741203355",
"title": "示例2合1触摸屏笔记本电脑,8GB RAM,256GB SSD",
"price": 379.0,
"currency": "USD",
"link": "https://www.walmart.com/ip/Example-2-in-1-Laptop/7741203355"
}
]
}
一些关于此输出的诚实观察,在大规模运行之前值得了解:
- **水合时间。**沃尔玛的搜索网格首先挂载骨架,然后填充卡片。在提取之前导航后稍等片刻可以确保获得完整网格,而不是部分网格。如果一次请求返回的卡片非常少,那么网格尚未完成水合 — 请在收紧选择器之前再次读取渲染的HTML。
- **确认200是真实的。**产品标题(
laptop - Walmart.com)的存在和填充的a[link-identifier]锚点数量是信号,表明响应是真实页面。一个空网格或缺失的标题意味着主体无论状态行如何都是一个挑战或外壳。 - **条件字段。**并非每个卡片都有可见价格(缺货或赞助位置会有所不同),而且详情页会暴露出搜索卡片所没有的字段。将缺失的字段视为
null,而不是删除键,以确保下游消费者保持稳定。 - 选择器稳定性。
a[link-identifier]、[data-item-id]和[data-automation-id="product-price"]是持续的锚点。哈希类名在不同版本之间会变化;请依赖语义data-*属性。 - **区域差异。**价格、可用性和结果集本身因地区而异。稳定地锁定
proxyCountry以便价格历史系列进行比较。
结论:扩展您的沃尔玛产品管道
可靠地抓取沃尔玛归结为一个原则:状态码不是成功的信号 — 渲染的产品网格才是。通用代理从美国IP转发字节,仅此而已,这就是为什么公共基准将通用代理有效提取率低于40%,最大失败桶是以200状态提供的机器人页面。解决办法不是更好的代理,而是一个具有住宅出口和一致会话行为的真实渲染浏览器。
Scrapeless抓取浏览器提供了这一切:创建一个美国住宅会话,通过CDP连接,渲染搜索URL,确认产品网格存在,提取记录,并在同一会话内跳转到产品详情页。锁定美国出口,将搜索和详情过程保留在同一会话内,确认响应包含产品标题和网格锚点才能信任它,并将缺失的字段视为可空字段。
对于其他零售和上市网站的相同方法,请参阅兄弟指南 2026年最佳Zillow抓取工具 和 2026年最佳亚马逊抓取工具。
准备好构建您的AI驱动的数据管道了吗?
加入我们的社区以获得免费计划,并与构建零售数据管道的开发者建立联系: Discord · Telegram。
在 app.scrapeless.com 注册,获取免费的抓取浏览器运行时,并将上述模式调整为管道所需的沃尔玛查询、类别和地区。在 定价页面 查看当前计划。
常见问题解答
问1:为什么美国代理在沃尔玛仍然会被封锁?
因为沃尔玛评估的不仅仅是IP所解析的国家。它会检查IP声誉、行为一致性和地区流量集中度。一个国家级的美国代理只能满足国家检查;它不能运行JavaScript或保持会话状态。在实践中,大多数普通代理在沃尔玛的响应并不是可用的产品数据。
问2:仅有住宅代理是否足够?
不够。住宅出站流量比数据中心范围更有信任度,但一个附加在普通HTTP客户端上的住宅IP仍然无法渲染页面或保持一致的浏览器指纹。可靠的路径是将住宅出站流量与真正渲染的浏览器和持久的会话状态配对,这就是Scrapeless抓取浏览器在一个会话中所结合的。
问3:我如何确认200响应是真实的,而不是一个CAPTCHA页面?
检查负载,而不是状态行。在真正的沃尔玛搜索渲染中,页面标题是 laptop - Walmart.com,DOM中有产品锚点(a[link-identifier])和[data-item-id]节点。如果标题缺失且网格为空,则正文是一个挑战或未填充的外壳,无论200状态如何。
问4:我可以并行运行多少请求?
保持适度的并发——每个主机大约三名工作者——并在每个会话中固定美国出站流量。对于更高的并发,跨主机进行分割,而不是在单台主机上提高并发,以便流量保持自然分布。
问5:沃尔玛更改了其DOM,我的选择器坏了。现在怎么办?
重新查看实时渲染的HTML,识别当前稳定的锚点(a[link-identifier]、[data-item-id]、data-automation-id属性),并根据页面当前发送的内容收紧提取器。锚定于语义data-*属性,而不是轮换的哈希类名。
问6:这可以在没有AI代理的情况下运行吗?
可以。步骤1-4中的Python独立端到端运行——创建会话,通过CDP连接、渲染和提取。通过AI代理驱动它只是一个便利层,而不是必需。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



