FlashProxy Logo

FlashProxy

教程指南代理

用Python构建亚马逊价格追踪器(诚实的方式)

用Python构建亚马逊价格追踪器(诚实的方式)

用Python和Selenium构建一个真正有效的价格追踪器,通过实际测试了解什么会导致被封禁。

F
FlashProxy 团队
2026年6月21日
1 分钟阅读

关键要点

  • 产品页面很少封禁爬虫;在测试中,150个请求全部通过,零次封禁。
  • 亚马逊搜索页面在第一个请求就封禁,即使使用代理也是如此。
  • 封禁更多关乎不是真实浏览器,而不是你的IP地址。
  • 需要定向到特定国家的代理才能获取正确的本地价格,而不仅仅是为了避免封禁。

我以为我找到了网上最便宜的PlayStation 5。

我的价格追踪器在PS5旁边显示了$74.00,但网上如果听起来好得不像真的,通常就不是真的。那$74不是主机。是爬虫抓错了元素,这正是大多数「亚马逊价格追踪器」教程悄悄失效的那种无声bug。

所以与其像几乎每本指南那样只发布五十行Python代码就完事,我对它进行了恰当的测试。我以大量请求对亚马逊进行了测试,精确测量了什么会被封禁、什么不会,并修复了教程从不提及的bug。结果令人惊讶:一个最基础的爬虫对同一个产品页面发起了150次请求,没有被封禁一次,但向搜索页面发出的第一个请求就被拒绝了。

这个指南包含了可用的追踪器以及测试发现的所有内容,还有一个值得了解的Selenium技巧,即使你已经构建过爬虫:它会驱动一个真实的Chrome窗口,你可以实时看到页面加载和爬取的过程。

亚马逊真的会封禁你吗?

每个教程都警告说亚马逊会立即封禁你的爬虫。所以我测试了,结果真的让我困惑。

我用一个最基础、毫无花样的爬虫指向PlayStation 5产品页面,就让它一直发起请求。一个请求、两个、十个、五十个,我一直在等待封禁。它从未出现。这个爬虫对同一页面发送了150个请求,每一个都返回了「ok」。我简直不敢相信防守这么松散。

确实松散。产品页面事实上几乎不在意。然后我把同一个爬虫指向搜索结果页面,它在第一个请求上就挂了。不是第十个,不是第五十个。就是第一个。立即返回503。

大规模数据采集发生在搜索结果上,所以亚马逊把防御资源花在那里。单个产品页面?大门敞开。

这是我尝试的内容及结果:

  • 产品页面、基础爬虫:150个请求,零次封禁

  • 搜索页面、基础爬虫:第1个请求就被封禁(503)

  • 搜索页面、更好的请求头:仍在第1个请求被封禁

  • 搜索页面、请求头+住宅代理:仍在第1个请求被封禁

  • 搜索页面、真实浏览器:成功,16个结果

  • 搜索页面、浏览器+美国代理:成功,22个结果

最令我惊讶的部分:对搜索页面使用住宅代理完全没有帮助。仍然被封禁,第一个请求。封禁从来不是关于我的IP地址,而是关于我不是真实浏览器这一事实。当我在真实浏览器中加载相同的搜索页面而不是用原始脚本时,它就成功了:


构建追踪器

让我们来构建这个工具。整个追踪器大约50行Python代码。你需要安装Python 3和谷歌Chrome,然后运行一条命令安装所需库:

pip install selenium requests matplotlib

将其指向一个产品

每个亚马逊产品都有一个称为ASIN的ID,是URL中/dp/之后的10位字符代码。例如,在amazon.com/dp/B0F1J12R6N中,ASIN是B0F1J12R6N。这是追踪器找到产品所需的全部内容。

为什么requests还不够

抓取页面最显而易见的方法是Python的requests库:一行代码,获取HTML,完成。对于产品页面,它甚至会返回200 OK。但这是我踩到的陷阱:200不代表你得到了数据。亚马逊用JavaScript将价格渲染到页面中,而requests不执行JavaScript。所以你拿到了页面,但价格不在里面。

这就是为什么这个追踪器改用Selenium。Selenium驱动一个真实的Chrome浏览器:它真正打开页面、执行JavaScript,让你读取完整渲染后的结果。你第一次运行它时,Chrome会自行打开,并显示一条横幅:「Chrome正被自动化测试软件控制」,你可以实时看着它工作。

爬取价格(以及所有人都会犯的bug)

这是大多数教程悄悄出错的地方。常见做法是抓取.a-price元素并读取其文本。问题在于:亚马逊在该元素中放了两份价格,一份可见,一份供屏幕阅读器使用,所以你得到的是混乱的$449.00$449.00,而不是一个干净的数字。

解决方案是针对购买框内那份干净的、唯一的价格,并仔细读取,先检查主购买框价格,这样就不会意外抓到配件的价格——这正是我最后得到那个「$74 PS5」的原因。确切的选择器在GitHub上的代码中。

一旦指向正确的元素,价格就会干净地返回:

存储历史记录和绘制图表

价格追踪器只有能记住数据才有意义。脚本将每次读取保存到文件中,按产品建立索引,将价格存储为实际数字加货币单位,而不是「$54.00」这样的字符串。这很重要:数字可以绘图、比较、找最低值;字符串不行。默认情况下,脚本检查一次就停止;添加循环选项后,它会按计划定期重新检查,随时间积累历史数据,另一个小脚本再将其转化为价格随时间变化的图表。

几乎让我付出代价的bug:你可能在爬取错误国家的数据

还记得那个$74的PlayStation吗?那是第一个出问题的迹象。第二个更糟,因为更难发现。

当我第一次不使用代理运行追踪器时,亚马逊不仅给了我奇怪的价格,对某些产品,它甚至根本没有给出真实价格,只是一条「此商品无法配送到你所在地点」的通知。追踪器没有任何有用的内容可以记录。

所以我通过代理路由请求,让它看起来像美国购物者。价格却以欧元返回。起初我以为代理根本没有生效。然后我注意到页面显示「配送至爱尔兰」,我恍然大悟:代理工作正常,只是把我落到了一个爱尔兰IP上。方向对了,国家错了。

解决方案是使用固定到你真正关心的国家的住宅代理。一旦我把代理锁定到美国,追踪器每次都能拉取到正确的价格:$54.00,以美元计价。

而固定国家不只是锦上添花,它是整件事的核心意义所在。假设你正在追踪竞争对手的价格,以决定在特定市场收取多少费用。这些数字只有在它们是该市场实际看到的价格时才有意义。同一个产品在美国可能是$449,在爱尔兰是€499。如果你的爬虫悄悄返回爱尔兰的价格,你就在用另一个市场的数据为这个市场做决策,而且因为数据看起来有效,没人会发现。

所以这里使用代理不是为了悄悄绕过封禁——我的测试表明产品页面几乎不封禁。而是为了确保你收集的数据是正确的数据。

如果你想获取固定到特定国家的价格数据,FlashProxy的住宅代理支持定位到任意地区,让你始终收集到该市场实际看到的价格。

那么……这应该有这么难吗?

这是我的真实感受:如果你曾经需要从网页上爬取价格,你不必读一百篇博客、看一堆YouTube视频,或者不断催AI直到它终于做对。你完全可以自己动手。这极其简单,说实话,简单得几乎令人担忧。

开始之前,我以为这会很难。运行早期测试时没有连接代理,我真的很紧张,以为会被永久封禁,或被限速到完全无法使用。我预期会有后果。

什么都没发生。真的什么都没有。150个请求打到一个产品页面,没有代理,没有封禁,没有禁令,没有愤怒的邮件。我以为会遇到的那堵墙基本上不存在,而唯一存在的地方(搜索页面),一个真实的浏览器直接就穿过去了。

所以如果唯一阻止你构建这个东西的,是觉得它很难或有风险的假设:它并不难。去构建它。只要保持合理,追踪公开价格,不要狂轰滥炸网站,尊重他们的条款。但那种恐惧?大多是你自己脑补的,就像我当时一样。

完整代码

完整项目——追踪器、代理辅助工具、图表绘制和测试脚本——全部开源:GitHub上的amazon-price-tracker-python。克隆后直接运行,或者仔细阅读了解它的工作原理。

Python网页爬取Amazon价格追踪代理

常见问题