数据抓取

如何用代理抓取亚马逊商品数据(价格、评论、排名)

一份抓取亚马逊商品数据(价格、评论和排名,按站点)的实用指南,以及为什么住宅代理才是让它行得通的关键。

Chris Collins

Chris Collins

2026年7月13日 · 2 分钟阅读

亚马逊是开放网络上最大的商品数据集,而抓取它,价格、评论、排名、可得性,驱动着价格监测、数字货架分析、市场调研和竞争情报。它也是你会把抓取器指向的、防守最凶的站点之一。配置一旦弄错,你会在寥寥几次请求内就撞上”Robot Check(机器人核验)“页面、一个 503,或错误国家的数据。

这是一份把它做对的实用指南:你能从一个亚马逊商品页里拉取什么、没有正确的基础设施它为什么会坏、以及如何通过住宅代理干净地采集它。简短版:亚马逊是按站点(marketplace)做地理切分的,且对机器人很凶,所以你必须以正确国家里一个真实购物者的身份去抓取,而这正是住宅代理的用途。

你能从一个亚马逊商品页抓取什么

一个亚马逊商品列表里密布着公开、结构化的数据。团队最常采集的字段:

  • 价格与促销信息 —— 当前价、标价、折扣和优惠券。
  • 可得性与购买框(buy box) —— 是否有货,以及哪个卖家赢得购买框。
  • 畅销排名(BSR) —— 亚马逊在某个类目内的排名,是需求的代理指标。
  • 评分与评论 —— 星级评分、评论数量和评论文本。
  • 商品详情 —— 标题、要点、描述、图片、变体和规格。
  • 卖家信息 —— 该报价上的卖家和配送详情。

这一切都在公开页面上。问题在于,亚马逊会根据你看起来在哪里、以及你是否看起来像一个真实购物者,来决定给你展示哪个页面。

为什么亚马逊很难:这是一个代理问题

亚马逊的三个特性,把抓取它变成了一个落在代理层上的访问问题。

亚马逊是按站点切分、且地理个性化的。 亚马逊按国家运营各自独立的站点,amazon.comamazon.deamazon.co.ukamazon.co.jp,每一个都有不同的价格、可得性、卖家,乃至商品目录。除此之外,单个站点还会按购物者的位置来个性化价格和配送。从一个美国 IP 去抓取 amazon.de,你可能得到一次重定向、一种不同的体验,或一个德国购物者永远不会看到的可得性。要准确捕获一个站点,你必须来自那个国家,而这正是国家级和城市级定位的用途。

亚马逊对机器人严防死守。 数据中心 IP 会被很快标记,得到 CAPTCHA “Robot Check”、一个 503,或限流,于是你记录下来的是机器人版本,而不是购物者的页面。(为什么爬虫会被封讲解了其中的机制。)住宅 IP 带着真实用户的信任,所以亚马逊会把真实的列表投递给你。

覆盖既是高容量又要反复。 每天跨越各站点追踪众多 ASIN,是海量的请求。从少数几个 IP 出发,你会很快触发速率限制,得到一个片面、满是封锁的样本。是一个庞大的轮换池,才能把爬取保持完整。

这三者的解法是同一个:从与站点所在国家相匹配的住宅 IP 去抓取,并在规模上轮换。

第 1 步:经由正确国家的住宅 IP 路由

Shifter gateway 上,你通过把国家编码进代理用户名来挑选它,一个端点,没有 IP 列表。让代理国家与站点域名相匹配: amazon.com 用美国 IP,amazon.de 用德国 IP。

Terminal window
# 作为美国购物者访问 amazon.com
curl -x customer-USERNAME-country-us:PASSWORD@p.shifter.io:443 \
"https://www.amazon.com/dp/B0EXAMPLE"
# 作为德国购物者访问 amazon.de
curl -x customer-USERNAME-country-de:PASSWORD@p.shifter.io:443 \
"https://www.amazon.de/dp/B0EXAMPLE"

每个商品都有一个稳定的 ASIN/dp/ASIN URL 里的 B0... 代码),所以一旦你有了 ASIN 列表,跨站点的 URL 模式就是可预测的。

第 2 步:用代码抓取并解析

对于亚马逊商品数据,你很少需要浏览器,其中大部分都在初始 HTML 里,所以一个简单的 HTTP 客户端更快,且在带宽上便宜得多。这是 Python 里的大致写法(完整的客户端配置见用 Python 使用住宅代理):

import os, requests
from bs4 import BeautifulSoup
USER, PASS = os.environ["SHIFTER_USER"], os.environ["SHIFTER_PASS"]
GATEWAY = "p.shifter.io:443"
def proxy(country="us"):
url = f"http://{USER}-country-{country}:{PASS}@{GATEWAY}"
return {"http": url, "https": url}
def scrape_product(asin, country="us", tld="com"):
url = f"https://www.amazon.{tld}/dp/{asin}"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, br",
}
r = requests.get(url, headers=headers, proxies=proxy(country), timeout=30)
r.raise_for_status()
soup = BeautifulSoup(r.text, "html.parser")
title = soup.select_one("#productTitle")
price = soup.select_one(".a-price .a-offscreen")
rating = soup.select_one("#acrPopover")
return {
"asin": asin,
"title": title.get_text(strip=True) if title else None,
"price": price.get_text(strip=True) if price else None,
"rating": rating["title"].strip() if rating and rating.has_attr("title") else None,
}
print(scrape_product("B0EXAMPLE", country="us", tld="com"))

有两件事比选择器更重要:发送一个与你代理国家相匹配的、真实的 User-AgentAccept-Language;并预期亚马逊的标记(markup)会变动,所以把每个选择器都当作可选的,并对你提取到的东西做校验。对于评论,请求评论页并翻页;对于 BSR,它通常在”商品信息”/详情区里。

第 3 步:轮换,并在有帮助的地方保持会话

  • 每个请求轮换,用于跨众多 ASIN 的宽泛目录抓取,省去任何会话 id,让每个请求都得到一个新鲜 IP。
  • 保持一个粘性会话,当你翻阅单个商品的评论或一个多步流程时,好让这一串序列看起来像一个购物者。在用户名里加上 -sid-<id>-ttl-<秒>

因为 IP 质量决定了你有多频繁地看到真实页面、而非一次 Robot Check,理解 IP 信誉有助于你把爬取保持干净。

第 4 步:处理封锁并把带宽压低

当亚马逊投喂一个 CAPTCHA/Robot Check 或一个 503 时,别猛击,轮换到一个新鲜 IP、做退避、再重试。持续(而非偶尔)的封锁,指向的是 IP 质量或请求行为,见如何在抓取时避免被封

如果某个页面确实需要 JavaScript、你不得不动用浏览器,就拦掉图片、媒体和字体,好让你不必为你从不解析的像素按 GB 付费,技巧见如何削减代理带宽成本。对于大多数亚马逊商品字段,简单的 HTTP 就够用、也最便宜。

负责任地使用

只抓取公开的商品数据,任何购物者都能看到的列表、价格、评分和评论文本,并远离个人数据,评论者的身份以及任何附在评论上的个人信息都不是可取之物。遵守亚马逊的条款和速率限制,不要削弱站点,并知晓亚马逊的服务条款限制自动化访问,所以把采集守在公开数据上,并对任何不确定的事项获取法律意见(见网络抓取合法吗)。代理改变的是一个请求从哪个 IP 发出,而不是你是否应该发出它;我们的可接受使用政策是 Shifter 上何为允许的权威依据。

常见问题

我不用代理能抓取亚马逊吗? 在任何规模上都无法可靠地做到。亚马逊会用 CAPTCHA 和 503 很快标记数据中心和重复 IP 的流量,而且你永远只会看到一个国家的站点。住宅代理让你以每个目标国家里一个真实购物者的身份去抓取。

为什么我需要让代理国家与站点相匹配? 因为亚马逊的站点是按国家、且地理个性化的。从一个美国 IP 去抓取 amazon.de,可能触发重定向或展示一个德国购物者不会看到的数据。让 IP 国家与域名相匹配(amazon.de 用 DE IP),以获得准确的数据。

抓取亚马逊我需要无头浏览器吗? 通常不需要。大多数商品字段,价格、标题、评分、可得性,都在初始 HTML 里,所以一个简单的 HTTP 请求更快,且在带宽上便宜得多。把浏览器留给真正依赖 JavaScript 的页面。

亚马逊该用住宅代理还是数据中心代理? 住宅。亚马逊会激进地检测并封锁数据中心 IP,所以数据中心给你的是 Robot Check 和 503。住宅 IP 看到的是一个真实购物者会看到的真实、地理精准的列表。

抓取亚马逊合法吗? 公开的商品数据通常是面向公众的,只要负责任地采集,尊重条款和速率限制、回避个人数据,大体上没有问题。亚马逊的服务条款限制自动化访问,所以把它守在公开数据上,并对任何不确定的事项获取法律意见。代理不会改变底层活动的合法性。

底线

亚马逊是一座公开商品数据的金矿,但它按站点切分、地理个性化,且是不被封就最难抓取的站点之一。配方很直接:经由一个与站点所在国家相匹配的住宅 IP 路由,用一个真实的客户端抓取 HTML,做防御性解析,在规模上轮换,并靠切换 IP、而不是加大力度来处理 Robot Check。做到这些,你就能得到一个购物者所看到的真实价格、评论和排名,在你追踪的每一个站点里。

成败所系的那一环,是 IP 质量,干净的住宅 IP 意味着真实的列表、而非一次 Robot Check。一个优质的住宅代理网络就是让亚马逊抓取可靠的那一层访问,它也是价格监测数字货架分析背后的同一个根基。定价页面有按 GB 计费的套餐,可以拿它对着你在意的 ASIN 和站点试用。

准备好开始了吗?

试用 Shifter 住宅代理,205M+ 个 IP,195+ 个国家,低至 $0.75/GB。

立即开始