收集公开的非个人数据(如标价)通常与访问私人数据或需登录才能访问的数据有所不同,但法律情况因司法管辖区而异,且亚马逊的条款限制了自动化访问。请仅抓取公开页面,避免获取个人身份信息(PII),对流量进行限流,并在进行商业用途或大规模使用时寻求法律审查。
如何抓取亚马逊价格而不被封号
是的,你可以抓取亚马逊公开商品页面的价格,可靠的方法是使用买家所在国家的家庭IP发送请求,控制请求频率,并从渲染后的页面中解析出价格和“购买框”信息。 难点不在于从页面上读取数字,而在于如何避免被封禁,以便有足够的时间在接下来的上千个页面中继续读取数据。亚马逊将激进的自动化流量视为威胁,因此一个设计粗糙的爬虫在发送几百次请求后,就会遭到限流、被要求验证CAPTCHA,或者被IP封禁。
本指南将详细说明为何难以抓取亚马逊数据、一种在大规模数据处理中行之有效的方法、一段简短的代码示例,以及值得遵守的法律界限。此外,指南还介绍了在何种情况下应完全放弃抓取,转而调用亚马逊的官方 API。
要点总结
- 对于公开页面,从亚马逊抓取价格是可行的,但请求速率控制和IP质量将决定您能否避免被封禁。
- 数据中心的IP地址很快会被标记;而目标国家/地区的家庭IP地址则能看到真实的本地化价格和“购买按钮”。
- “购买框”的获胜者、价格和库存情况因地区而异,因此基于地理位置的查询对于确保准确性至关重要。
- 渲染后的(通过 JavaScript 加载的)定价元素通常需要一个无头渲染步骤,而不仅仅是解析原始 HTML。
- 对于产品目录类的需求,官方的“产品广告API”是更简洁的解决方案;而数据抓取则用于弥补该API未能覆盖的部分。
从亚马逊抓取价格是否合法且可行?
公开的产品列表页面无需登录即可访问,其中显示的价格属于公开信息。使用自动化客户端读取这些数据在技术上并不复杂。但实际操作中之所以困难,是因为亚马逊会积极防范机器人,而如今自动化流量已占各大网站总流量的绝大多数。 《2025年Imperva恶意机器人报告》(Imperva,《2025年恶意机器人报告》)发现,自动化流量十年来首次超过了人类活动,占所有网络流量的51%,其中恶意机器人占比达37%。 像亚马逊这样规模的网站投入了大量资源,致力于将这些机器人与真实购物者区分开来。
因此,问题不在于“我能否解析价格”,而在于“我能否在解析数千种商品时不被中断”。本指南的其余部分将围绕第二个问题展开。关于数据获取和解析的语言层面的机制,请参阅配套指南,了解如何使用 Python 抓取价格.
为什么亚马逊难以进行数据抓取
几道防线同时叠加起来。
速率限制。 如果从一个 IP 地址在短时间内发送过多请求,亚马逊会减慢响应速度或直接拒绝响应。该阈值并未公开,且会动态调整,因此昨天还能正常运行的爬虫,今天就可能触发该阈值。
验证码。 当流量看起来像是自动生成的,亚马逊会显示一个验证页面,而不是产品页面。此时,你的解析器读取的将是验证码,而不是价格,除非你检测到这种替换,否则它会默默地记录一堆无用数据。
来自同一IP地址的多次可疑请求也会导致该地址被直接封禁。数据中心的IP地址段很容易被识别,且通常已被预先标记,因此从云虚拟机运行的爬虫往往会在早期就失败。 实际上,在亚马逊产品页面上,数据中心IP触发验证码或直接被封禁的情况,往往比基于地理位置匹配的家庭用户会话要早得多。
地理因素又增添了一层复杂性。价格和“购买框”的获胜者并非一成不变:它们会随着买家的国家(有时甚至是城市)以及时间的变化而变化。如果请求来自错误的地理位置,返回的价格将与目标市场中的真实客户所见价格不符,这会悄无声息地污染你的数据集。
动态内容。 该页面的部分内容(包括某些价格和库存信息)是在初始 HTML 加载完成后通过 JavaScript 加载的。如果直接获取原始 HTML,返回的结果可能是一个不包含价格的空页面。
一种在规模化生产中行之有效的方法
目的是让访问行为看起来像普通购物者的浏览行为,并查看购物者实际会看到的页面内容。
请分批提交请求
请勿对网站进行密集请求。在请求之间加入延迟、随机化请求顺序,并限制并发数。保持稳定、类似人类操作的节奏,是应对速率限制和验证码的最经济有效的防御手段。如果需要大量数据,请分时段获取,而非集中请求。
通过目标国家的住宅代理服务器进行路由
这往往是大多数爬虫成败的关键所在。住宅IP属于真实的消费者连接,因此来自这些IP的请求看起来像普通购物者,而非数据中心流量。通过您所定价国家的住宅IP进行路由,还能返回正确的本地化价格、货币和“购买框”。 轮询会话将请求分散到多个地址,从而避免单个 IP 地址积累可疑的请求频率;而粘性会话则在需要保持连续性的情况下(例如,先加载商品页面,然后加载相关变体),在短暂的多步骤流程中保持同一 IP 地址。
Massive 的住宅代理网络覆盖 195 多个国家,支持通过 HTTP、HTTPS 和 SOCKS5 协议进行国家及城市级地理定位,并提供轮询或粘性会话功能,这恰好满足了以下两项需求:本地化精度和请求分散。
处理渲染后的页面
由于定价要素可通过 JavaScript 加载,因此需预留一个渲染步骤。一种方案是自行运行无头浏览器;另一种方案是使用渲染服务——该服务会加载页面并返回最终内容,理想情况下应以纯净的 Markdown 格式返回,这样您就能减少处理不稳定的 HTML 选择器所花费的时间。 Massive 的 Web Render API 包含一个 Browsing 端点,该端点会将渲染后的页面以 Markdown 格式返回,从而一步到位地省去了无头浏览器的维护工作以及 HTML 解析的开销。
如果你想让自己的 AI 代理直接从 URL 转换为 Markdown 格式,可以完全跳过解析层:直接调用 Massive 的 Web Render API,或者配置 Massive 的 MCP Server,让代理直接获取已渲染的 Markdown 格式页面,并在上下文中对价格行进行推理。
解析价格和“购买框”
无论您使用哪种数据提取方法,都应单独提取“购买框”中的价格和库存信息,而不是页面上出现的第一个美元数值。 亚马逊页面包含多种价格(标价、其他卖家的价格、相关商品价格),因此请专门针对“购买框”区域进行抓取。对每个值都要进行验证:价格为空、为零或与实际价格相差悬殊,通常表明你抓取到了验证码或空渲染结果,而非真正的价格下跌。
一段简短的代码示例
下图展示了一种礼貌型、通过代理路由的爬虫的运作模式。它通过住宅代理获取渲染后的页面,然后提取“买箱”价格。
import os, time, random, requests
from bs4 import BeautifulSoup
# Massive 住宅代理:凭据以 user:pass 的形式包含在 URL 中。
_proxy = (
f"https://{os.environ['MASSIVE_PROXY_USERNAME']}:"
f"{os.environ['MASSIVE_API_KEY']}@network.joinmassive.com:65535"
)
PROXY = {"http": _proxy, "https": _proxy}
HEADERS = {"User-Agent": "Mozilla/5.0 (...)", "Accept-Language": "en-US,en"}
def get_price(asin, country="us"):
url = f"https://www.amazon.com/dp/{asin}"
resp = requests.get(url, headers=HEADERS, proxies=PROXY, timeout=30)
if "captcha" in resp.text.lower() or resp.status_code != 200:
return None # 遇到验证码或被封锁;稍后通过新 IP 重试
soup = BeautifulSoup(resp.text, "html.parser")
el = soup.select_one("#corePrice_feature_div .a-offscreen")
if not el:
return None # 价格通过JS渲染或布局发生变化
return el.get_text(strip=True)
for asin in ["B0XXXXX1", "B0XXXXX2"]:
price = get_price(asin)
print(asin, price)
time.sleep(random.uniform(2, 6)) # 随机化,模拟人类操作节奏
此处刻意采用了极简设计。生产环境的爬虫会添加带退避机制的重试、将请求路由至新 IP 的验证码检测、针对通过 JavaScript 加载的价格的渲染步骤,以及在存储任何数据前的验证。若要将此功能转变为可定时运行且受监控的服务,请参阅如何构建一个价格监控系统.
守住底线
仅抓取公开页面。请勿登录、请勿绕过身份验证,也请勿收集个人数据。公开列表中的价格、标题和库存情况不属于个人身份信息(PII)。请遵守网站明文规定的条款及其robots.txt,请对流量进行限流,以免影响其他用户的服务质量;同时,请将数据采集范围控制在特定且有明确目的的范围内,而非抓取所有能触及的内容。 亚马逊的条款限制了自动化访问,因此请将数据抓取视为以合理频率监控公开价格的工具,而非用于批量复制产品目录。相关法律因司法管辖区而异且不断变化,因此如果您进行大规模或商业化运营,请务必请律师审查您的具体使用情况。
何时应改用官方 API
亚马逊提供了产品广告 API(PA-API)5.0,该 API 通过受支持的接口返回价格和产品数据。如果它能满足您的需求,这将是一个更简洁的选择:无需验证码、不会被封禁 IP、也不需要进行渲染维护。
关键问题在于访问权限和吞吐量。PA-API 要求拥有一个与销售业绩关联的有效联盟计划账户,且新凭证初始的配额上限较低。 亚马逊的开发者文档(亚马逊,《产品广告 API 5.0:API 速率》,2026)指出,新凭证在前 30 天内每秒仅限一次请求,每天限 8,640 次请求,且限额仅会随着您产生的推荐收入而逐步提高。 一旦超过该限额,您将收到429 请求过多 错误。
一条实用准则:
- 使用 PA-API 只要您拥有符合条件的Associates账户,您的业务量符合处理能力要求,且响应中包含您所需的字段。
- 刮 当您无法访问 API、需要 API 未公开的数据(某些“买断框”或特定地区的浏览数据),或者需要获取某国购物者所看到的完全一致的价格时。
许多团队同时采用这两种方式:API 用于处理其明确涵盖的内容,而数据抓取则用于填补空白。这种“自建还是采购”的考量逻辑同样适用于零售价格监控 以及更广泛的实践,即竞争对手价格监控.
来源
- Imperva. 《2025年恶意机器人报告》。2025年。https://www.imperva.com/resources/resource-library/reports/2025-bad-bot-report/ (检索于 2026-06-15)
- 亚马逊。“产品广告 API 5.0:API 调用配额。”2026年。https://webservices.amazon.com/paapi5/documentation/troubleshooting/api-rates.html (检索于 2026-06-15)
价格的准确性取决于能否看到真实购物者所看到的页面。Massive 的住宅代理网络 提供覆盖195多个国家的基于地理位置的住宅IP地址,支持会话轮换或固定会话,此外还提供一个Web Render API,该API会将渲染后的页面以纯Markdown格式返回,因此您可以根据具体使用场景的需求,在所需的位置和频率下监控亚马逊的价格。
常见问题解答
数据中心的IP地址范围很容易识别,且通常会被预先标记为非住宅IP,因此来自这些IP的请求看起来像是自动生成的。住宅IP则来自真实的消费者连接,与普通购物者的流量混在一起,正因如此,它们能维持更长时间,并且能返回正确的本地化价格。
有时会这样。页面中的部分内容(包括某些价格元素)是通过 JavaScript 加载的,因此直接获取原始 HTML 时,返回的结果可能不包含价格。您可以自行运行无头浏览器,或者使用渲染服务来获取渲染完成的页面(干净的 Markdown 输出可减少解析工作),而无需维护浏览器自动化脚本。
目前没有公开的具体数值,且阈值会发生变化。安全的做法是通过随机延迟来控制请求频率、限制并发量,并轮换使用家庭IP地址,以避免单个地址产生可疑的请求频率。将大型任务分散在不同时间段执行,比集中处理更有效。
