如何用 Python 构建亚马逊价格追踪器

网络爬虫 可以帮助你监控 Amazon 价格,而无需每天手动查看同一个产品页面。在本教程中,你将构建一个简单的 使用 Python 构建 Amazon 价格追踪器 用于采集产品标题、价格、库存状态和页面 URL,然后将结果保存到 CSV 文件。
该示例使用 Python、Requests、BeautifulSoup 以及真实的 Amazon 商品页面结构。你还会明白为什么 Amazon 价格追踪往往需要额外的校验:价格可能因地区而异,页面可能出现 CAPTCHA,选择器也可能随商品版式的不同而变化。
对于小规模测试,一个基础脚本就足够了。对于大批量或对地理位置敏感的跟踪, 干净的住宅代理、粘性会话以及 ZIP 邮编级别的定位 可以让结果更可靠,因为 Amazon 可能会根据不同地区返回不同的价格、配送详情和库存情况。
这个 Amazon 价格追踪器将实现的功能
本指南中的追踪器将收集:
- 产品标题
- 当前显示价格
- 库存状态文本
- 产品 URL
- 时间戳
- CSV 文件中的价格历史记录
- 在终端中显示基础的降价提醒
这是一个适合初学者的抓取工具,但它遵循了在真实价格监控项目中很重要的一些习惯。它会检查预期的数据是否存在,避免将 CAPTCHA 页面保存为商品数据,并让代码易于扩展。
若想更全面地了解价格追踪工具和工作流程,NodeMaven 还提供了一份指南,介绍 价格监控工具.
开始之前:Amazon 抓取的限制
Amazon 页面比练习用的网站更复杂。一个商品页面可能会因市场站点、ZIP 邮编、收货地址、cookie、登录状态、促销状态和商品类型的不同而变化。
在大规模采集数据之前,请查阅 Amazon 的 使用条件。对于已获批准的商品数据使用场景,还请查看 Amazon 的 Product Advertising API 文档.
本教程用于学习价格追踪的工作原理。如果你打算运行生产环境的爬虫,还请阅读 NodeMaven 关于 网页抓取是否合法.
Amazon 价格跟踪通常会变得困难,原因在于:
- CAPTCHA 验证页面 而不是商品页面
- 403 或 503 错误
- 价格分散在多个 HTML 元素中
- 因地区或 ZIP 邮编而异的价格
- 不同产品布局之间选择器会发生变化
- 请求返回的内容与浏览器不同
开发者经常遇到这些问题。例如,这个关于 Amazon CAPTCHA 和价格选择器问题 说明了为什么后备选择器和响应验证很重要。
第 1 步:搭建 Python 项目
为该项目新建一个文件夹,并在你的编辑器中打开它。
如果你使用 macOS 或 Linux,请运行:
如果你使用 Windows,请运行:
现在创建一个文件,命名为:
你可以在 VS Code、PyCharm 或任何文本编辑器中创建它。请保持该文件打开,因为接下来的步骤会逐步构建这个脚本。
如果这是你的第一个爬虫,那么 Python 网页抓取 指南更详细地讲解了 Requests、BeautifulSoup、选择器以及 CSV 导出。
经过测试的配置: Python 3.12、Requests、BeautifulSoup4 和 lxml。环境准备就绪后,该脚本可在 macOS、Windows 或 Linux 上运行。
第 2 步:检查 Amazon 商品页面
打开你想要跟踪的 Amazon 产品页面。右键点击产品标题并选择 检查.

在本次测试所用的产品页面上,标题位于:
然后检查价格。Amazon 通常会将完整价格存储在一个屏幕外的元素中,但在某些页面上,可见的价格会被拆分成多个独立的部分:
这就是脚本使用后备选择器,而不是依赖单一价格元素的原因。
这些选择器仅为供测试的示例,并非适用于整个 Amazon 的通用选择器。Amazon 页面可能因市场、产品类别、促销布局和库存状态而有所不同。请务必检查你计划追踪的具体页面。
开发者经常遇到 Amazon 选择器和 CAPTCHA 问题。这个 Stack Overflow 上关于 Amazon CAPTCHA 和价格选择器问题 很好地说明了为什么抓取程序需要备用选择器和响应验证。
第 3 步:使用 Requests 获取 Amazon 页面
现在添加一个用于下载页面 HTML 的函数。
自定义请求头让请求看起来更接近普通的浏览器请求。这并不能保证访问成功,但它避免了发送 Python Requests 的默认 user agent。
CAPTCHA 检查同样重要。一个请求可能返回成功的 200 OK 响应,但仍然返回验证页面而非产品数据。 切勿将成功的状态码当作爬虫采集到正确页面的证据。
第 4 步:提取标题、价格和库存情况
接下来,添加 BeautifulSoup 和几个辅助函数。
该 first_text() 函数会尝试多个选择器,并返回它找到的第一个值。这很有用,因为 Amazon 可能会把价格放在页面的不同位置。
该 split_price_text() 函数用于处理价格以独立的符号、整数和小数元素显示的页面。例如, $23.99 在 HTML 中可能显示为 $, 23,以及 99.
该 parse_price() 函数会从可见的价格文本中提取一个数值。此版本假定价格采用美式格式,例如 $49.99。如果你跟踪的是另一个 Amazon 站点,请根据当地的货币和小数格式进行调整。
现在添加商品抓取函数:
这个函数为可靠性做了一件有用的事:当标题或价格缺失时,它会明确报错。这比保存一个空值、之后才发现 CSV 里满是损坏的行要好得多。
第 5 步:将 Amazon 价格历史保存为 CSV
当每次检查都被保存下来时,价格跟踪器会变得更加实用。添加以下 CSV 函数:
该 newline="" 设置遵循 Python 的 CSV 文档 并有助于避免在某些系统上出现额外的空行。
脚本运行后,CSV 文件将如下所示:
| 时间戳 | 标题 | price_text | 价格 | 可用性 | url |
|---|---|---|---|---|---|
| 2026-07-24T10:15:30 | Owala FreeSip 不锈钢保温水瓶 | $23.99 | 23.99 | In Stock | Amazon 商品 URL |
这个简单的历史记录文件对于第一个版本来说已经足够了。之后,你可以将数据迁移到 Google Sheets、数据库或仪表板中。
第 6 步:追踪多个 Amazon 商品
现在添加一份产品 URL 列表。用真实的 Amazon 产品页面替换示例 URL。
然后添加一个遍历每个产品的主函数。
该 sleep(10) delay 可防止脚本过快地请求页面。对于真实的追踪来说,应避免过于激进的请求频率。价格追踪器通常不需要每隔几秒就检查同一件商品。
如果你想了解更多通用的抓取示例,NodeMaven 提供了一份指南,介绍 Python 网页抓取 以及一份单独的对比 网页抓取工具.
第 7 步:添加降价提醒和定时任务
一个基本的提醒功能可以直接在终端中运行。
添加一个目标价格
将下面这段代码添加到脚本的顶部附近:
然后更新其中的循环 main():
目前它还不会发送电子邮件或 Telegram 消息,只会在价格低于你设定的目标值时打印一条消息。
为追踪器设定计划任务
对于简单的设置,你可以每天手动运行一次脚本。
在 macOS 或 Linux 上,你之后可以使用 cron。在 Windows 上,你可以使用 Task Scheduler。如果你更喜欢无代码的设置,可以先从手动运行开始,等脚本能返回干净的数据后再进行自动化。
对于真实的价格监控工作流,请存储:
- 市场
- 地区或 ZIP 邮编
- 时间戳
- 价格
- 可用性
- 产品 URL
- 错误状态,如果请求失败
这些额外的背景信息有助于解释价格为何发生变化。价格下降可能源于真实的折扣,但也可能来自不同的地区、卖家、优惠券或运费设置。
第 8 步:添加代理以获得更可靠的 Amazon 跟踪
做几次手动测试时,你或许不需要代理。但一旦追踪器运行得更频繁、检查多个商品或按地区比较价格,单一的本地 IP 就会成为薄弱环节。
Amazon 可能会根据可见的位置显示不同的商品数据。当请求模式看起来异常时,它还可能返回 CAPTCHA、不可用的页面或不一致的配送详情。
这正是 干净的住宅代理 和 粘性会话 很有帮助。它们让跟踪器保持稳定的地区,避免将每个请求都通过同一个本地 IP 发出。
具体针对 Amazon,NodeMaven 的 Amazon 代理 在以下情况下会很有用:
- 特定地区的价格
- ZIP 级别定位
- 适合重复检查的稳定会话
- IP 质量比公共代理或廉价 VPN 更纯净
- 看起来更接近正常用户流量的住宅 IP
如需更深入的代理设置,请阅读 NodeMaven 关于构建 可靠的网页抓取代理池.
为脚本添加代理
如果你想使用代理,请替换前面的 fetch_page() 在此版本下运行。
然后将代理传入 scrape_product():
不要将真实的代理凭据硬编码在共享文件或公共仓库中。如果脚本将存储在 GitHub 上或供团队使用,请使用环境变量。
选择合适的代理会话
使用 粘性住宅会话 当你希望在一次跟踪运行期间让某个产品或某个地区保持一致时。当 Amazon 存储位置设置、配送状态或 cookie 时,这一点非常有用。
仅在每个请求相互独立时才使用轮换。在同一个商品流程中随机切换 IP 可能会导致价格不匹配、额外的验证或结果不一致。
NodeMaven 的指南: 住宅、移动和数据中心代理 解释了哪种代理类型适合不同的抓取工作流程。
常见的 Amazon 价格追踪器错误及修复方法
Amazon 返回 503 或 403 错误
当 Amazon 不喜欢请求模式、IP 信誉、请求头或流量来源时,就可能拒绝该请求。开发者也在 Stack Overflow 的讨论帖中谈到这一点 使用 Requests 和 BeautifulSoup 时出现的 Amazon 503 错误.
请尝试以下方法:
- 降低请求速率。
- 检查你的请求头是否已设置。
- 保存返回的 HTML 并进行检查。
- 避免从质量差或被过度使用的 IP 反复发起请求。
- 如果追踪器以较高的量级运行,请使用干净的住宅代理。
Amazon 显示 CAPTCHA 页面
如果 Amazon 返回一个 CAPTCHA 页面,说明抓取程序收到的是验证 HTML,而不是产品 HTML。本教程中的脚本会检测常见的 CAPTCHA 文本并抛出错误。
发生这种情况时,请降低请求频率,并检查你的请求头、会话行为和代理质量是否与你正在运行的请求量相匹配。 干净的住宅代理有助于减少因 IP 信誉不佳而触发的 CAPTCHA,但它们并不能替代合理的请求时机安排或响应验证。
不要将 CAPTCHA 页面保存为产品数据。
标题缺失
如果脚本找不到标题,请再次检查商品页面。
常用的选择器是:
如果页面使用了不同的布局,请再添加一个选择器到 TITLE_SELECTORS.
同时检查返回的 HTML 是否确实是产品页面。有时脚本收到的是同意页面、跳转页面或验证页面,而不是产品页面。
价格缺失
Amazon 的价格可能出现在页面的不同部分。有些页面使用屏幕外的价格文本,而另一些页面则将可见价格拆分为符号、整数和小数部分。
这就是脚本同时使用两者的原因:
以及:
如果两者都失败,请保存 HTML 并手动检查价格部分。
价格与你浏览器中显示的不同
Amazon 的价格可能会因国家/地区、ZIP 邮编、配送地点、站点、cookie 以及登录状态而有所不同。某件商品还可能显示优惠券、限时折扣或不同的购买选项。
为了减少不匹配的情况:
- 保持地区一致。
- 将市场和地区存储在你的 CSV 中。
- 如果地点一致性很重要,请使用粘性会话。
- 在比较价格之前,先比较可见的 IP 和位置。
- 当发货位置会影响结果时,请使用 ZIP 级定位。
NodeMaven 支持精确的地理定位,包括 ZIP 级别定位,当跟踪器需要从特定的买家所在地比较 Amazon 的价格、库存和配送选项时,这一点非常有用。
如果 Requests 无法访问可见的页面内容, Selenium 爬取 可能是更好的选择,因为它会打开一个浏览器并处理已渲染的页面。
完整的 Amazon 价格追踪器代码
以下是完整的脚本。
NodeMaven 如何改进 Amazon 价格追踪
当爬虫保持稳定的连接时,Amazon 价格追踪会更加可靠 一致的地理位置、干净的 IP 信誉以及稳定的会话行为.
NodeMaven 可以解决那些通常会导致价格追踪器失效的环节:
- 住宅代理: 使用真实用户的 IP,而不是嘈杂的 VPN 或数据中心地址。
- 粘性会话: 在检查某个产品、类目或区域流程时保持同一 IP。
- ZIP 级定位: 从特定买家所在地比较价格、配送选项和库存情况。
- 干净的 IP 质量: 减少失败请求、CAPTCHA 触发以及不可靠的页面响应。
- 灵活的设置: 通过 Python、浏览器自动化工具或抓取技术栈使用 HTTP 或 SOCKS5 代理。
对于 Amazon 监控来说,这意味着更少的区域结果不匹配,以及更干净的价格历史记录。
结论
一个简单的 Amazon 价格追踪器是很好的入门抓取项目,因为它展示了完整的工作流程:抓取页面、检查选择器、提取数值、验证响应以及保存价格历史。先从一两个商品开始,然后仅在追踪器确实需要时再添加定时任务、提醒和浏览器渲染功能。对于 Amazon, 一旦你超越测试阶段,干净的代理就变得至关重要,因为价格、库存、送达日期和 CAPTCHA 出现频率都会随 IP 质量和位置而变化。NodeMaven 住宅代理通过粘性会话和 ZIP 级定位,帮助追踪会话保持更干净、更稳定。



