亚马逊拥有大量公开的商品信息,包括商品标题、价格、评分、评论数量、品牌、商品图片和销售排名等。对于跨境电商卖家、市场研究人员和数据分析团队来说,这些数据可以用于竞品监控、价格分析、选品研究和市场趋势判断。
但是,当采集任务从几个商品扩展到多个关键词、多个类目或不同国家站点时,人工整理数据的效率会迅速下降。这时,可以使用Python建立自动化的亚马逊数据抓取流程。
本文将介绍如何使用Python和Playwright采集亚马逊公开商品页面中的数据,并将结果保存为CSV文件。同时,我们还会讲解分页采集、代理IP配置和常见问题。
本文仅用于公开数据研究和技术学习。开展数据采集前,应确认目标页面的服务条款、robots.txt、数据授权范围和当地法律要求,不应采集个人敏感信息,也不应绕过登录、验证码或其他访问控制。Amazon的服务使用需要遵守其相关使用条件。
为什么要抓取亚马逊商品数据?
亚马逊商品数据通常可以应用在以下几个场景。
1. 竞争对手价格监控
卖家可以定期记录竞品价格、优惠信息和库存状态,观察竞争对手是否进行了降价、促销或产品调整。
相比每天手动打开商品页面,自动化程序可以按照固定时间采集数据,并生成价格变化记录。
2. 亚马逊选品分析
通过采集某个关键词或类目下的商品,可以获得:
- 商品标题
- 品牌名称
- 当前价格
- 用户评分
- 评论数量
- ASIN
- 商品链接
- 商品图片
将这些数据整理到Excel或数据库后,可以进一步分析产品竞争程度、价格区间和用户需求。
3. 评论与市场需求研究
商品评分和评论数量可以帮助判断产品的市场成熟度。
如果某类商品的搜索结果数量较少,但部分产品的评论增长较快,可能说明该类目正在获得更多关注。不过,评论数据只能作为参考,还需要结合销量、价格和市场趋势综合判断。
4. 多站点商品信息对比
亚马逊在美国、英国、德国、日本等地区拥有不同站点。同一商品在不同市场中的价格、排名和用户反馈可能存在明显差异。
通过采集不同国家站点的公开数据,可以进行区域价格比较和市场需求分析。
亚马逊数据采集有哪些方式?
目前常见的Amazon数据获取方式主要有三种。
方法一:使用Amazon官方API
对于符合Amazon联盟及相关业务规则的应用,优先考虑官方提供的数据接口。
需要注意的是,Amazon官方文档显示,Product Advertising API已经于2026年5月15日停止使用并迁移至Creators API,新项目不应继续按照旧版PA-API教程接入。
官方API通常具有数据结构清晰、维护成本较低的优势,但可能存在申请条件、调用额度和数据用途限制。
方法二:使用Python抓取公开网页
如果需要研究公开搜索结果页、商品列表或自有业务允许使用的数据,可以通过Python解析网页。
对于结构简单的静态页面,可以使用Requests和BeautifulSoup;对于需要运行JavaScript的动态页面,Playwright通常更加合适。
Playwright支持Chromium、Firefox和WebKit,并同时提供同步和异步Python API。
方法三:使用第三方电商数据服务
如果企业需要长期、大规模采集数据,也可以使用结构化数据API或现成数据集。
这种方式可以减少网页结构变化带来的维护成本,但需要根据更新频率、字段完整度、数据来源和预算进行选择。
使用Python抓取亚马逊需要准备什么?
本教程将使用以下工具:
- Python 3.9或更高版本
- Playwright
- Pandas
- Chromium浏览器组件
首先创建项目文件夹:
mkdir amazon-data-scraper
cd amazon-data-scraper
然后安装所需依赖:
pip install playwright pandas
playwright install chromium
Playwright除了安装Python软件包,还需要单独安装浏览器组件。其官方文档同样要求在安装软件包后执行playwright install。
使用Playwright采集亚马逊商品数据
在项目文件夹中创建一个名为amazon_scraper.py的文件,并加入以下代码:
import time
from urllib.parse import quote_plus
import pandas as pd
from playwright.sync_api import sync_playwright
KEYWORD = "wireless headphones"
MAX_PAGES = 2
def get_text(locator, default=""):
"""安全读取元素文本,元素不存在时返回默认值。"""
try:
if locator.count() > 0:
return locator.first.inner_text().strip()
except Exception:
pass
return default
def get_attribute(locator, attribute, default=""):
"""安全读取元素属性。"""
try:
if locator.count() > 0:
value = locator.first.get_attribute(attribute)
return value or default
except Exception:
pass
return default
def scrape_amazon():
results = []
with sync_playwright() as playwright:
browser = playwright.chromium.launch(headless=True)
context = browser.new_context(
locale="en-US",
viewport={"width": 1440, "height": 1000}
)
page = context.new_page()
search_url = (
"https://www.amazon.com/s?k="
+ quote_plus(KEYWORD)
)
page.goto(
search_url,
wait_until="domcontentloaded",
timeout=60000
)
for page_number in range(1, MAX_PAGES + 1):
page.wait_for_timeout(3000)
product_items = page.locator(
'div[data-component-type="s-search-result"]'
)
print(
f"正在处理第 {page_number} 页,"
f"发现 {product_items.count()} 个商品"
)
for index in range(product_items.count()):
item = product_items.nth(index)
asin = item.get_attribute("data-asin") or ""
title = get_text(
item.locator("h2 span")
)
price = get_text(
item.locator(".a-price .a-offscreen")
)
rating = get_text(
item.locator("span.a-icon-alt")
)
review_count = get_text(
item.locator(
"span.a-size-base.s-underline-text"
)
)
relative_link = get_attribute(
item.locator("h2 a"),
"href"
)
image_url = get_attribute(
item.locator("img.s-image"),
"src"
)
if relative_link.startswith("/"):
product_url = (
"https://www.amazon.com"
+ relative_link
)
else:
product_url = relative_link
if title:
results.append({
"keyword": KEYWORD,
"asin": asin,
"title": title,
"price": price,
"rating": rating,
"review_count": review_count,
"product_url": product_url,
"image_url": image_url
})
next_button = page.locator(
"a.s-pagination-next"
)
if (
page_number >= MAX_PAGES
or next_button.count() == 0
):
break
next_href = next_button.first.get_attribute("href")
if not next_href:
break
page.goto(
"https://www.amazon.com" + next_href,
wait_until="domcontentloaded",
timeout=60000
)
# 控制访问频率,避免给目标站点造成过大负担
time.sleep(5)
browser.close()
return results
if __name__ == "__main__":
product_data = scrape_amazon()
dataframe = pd.DataFrame(product_data)
dataframe.to_csv(
"amazon_products.csv",
index=False,
encoding="utf-8-sig"
)
print(
f"采集完成,共保存 {len(product_data)} 条商品数据。"
)
运行程序:
python amazon_scraper.py
采集结果会保存到:
amazon_products.csv
CSV文件中包含关键词、ASIN、商品标题、价格、评分、评论数量、商品链接和图片链接等字段。
为什么亚马逊页面适合使用Playwright?
部分电商页面会通过JavaScript加载内容。使用普通HTTP请求时,程序获得的HTML可能不完整,导致价格、评论或商品列表无法正常提取。
Playwright会启动真实浏览器环境,能够等待页面加载并读取浏览器渲染后的内容,因此更适合处理动态网页。
不过,浏览器自动化会消耗更多内存和计算资源。如果采集任务规模较大,需要控制浏览器实例数量,并避免同时开启过多页面。
如何给Playwright配置代理IP?
在多地区电商数据研究中,网络出口地区可能影响页面语言、币种、配送范围和商品展示结果。
例如,研究美国站点时,可以使用美国代理线路;研究日本站点时,则需要保持日本网络出口、语言环境和目标站点一致。

在Playwright中,可以在启动浏览器时配置代理:
browser = playwright.chromium.launch(
headless=True,
proxy={
"server": "http://gate.kookeey.info:1000",
"username": "YOUR_USERNAME",
"password": "YOUR_PASSWORD"
}
)
请将示例中的用户名和密码替换为实际的kookeey代理认证信息。
kookeey代理信息如何填写?
在Playwright中接入kookeey代理,需要将后台生成的代理地址、端口、用户名和密码填写到代理配置中。
假设kookeey后台生成的代理信息格式为:
代理地址:端口:用户名:密码
对应到Playwright代码中:
server:填写代理协议、代理地址和端口username:填写代理用户名password:填写代理密码
例如,后台生成的代理信息为:
gate.kookeey.info:1000:your_username:your_password
那么代码应填写为:
browser = playwright.chromium.launch(
headless=True,
proxy={
"server": "http://gate.kookeey.info:1000",
"username": "your_username",
"password": "your_password"
}
)
如何生成kookeey动态线路
- 进入 kookeey 后台,充值余额,后台指路:https://www.kookeey.com
现在kookey官网充值 加赠 22%,新人还可直接领取 200MB 的试用流量包:立即领取免费流量
所以先充值再购买比直接购买会更划算,充值多少我们按需求;

购买1元购大礼包
– 1元购里有10💴的无门槛券,我们购买后会叠加享受优惠价;

购买流量包提取线路
– kookeey动态产品是按流量计费,只要我们有流量就能直接提取线路;

系统会生成一组代理连接信息,通常包括:
- 代理地址
- 端口
- 用户名
- 密码
- 协议类型
用户可以将这组信息复制下来,配置到浏览器、Python 脚本、指纹浏览器或其他自动化工具中。

如何检测代理是否配置成功?
完成代理配置后,可以访问IP检测页面,查看当前浏览器使用的出口IP:
page = browser.new_page()
page.goto(
"https://lumtest.com/myip.json",
wait_until="domcontentloaded"
)
print(page.locator("body").inner_text())
如果页面返回的IP地址和代理地区与kookeey后台选择的线路一致,说明代理已经配置成功。
配置代理时,应尽量保持以下条件一致:
- 目标Amazon站点
- 代理IP所在国家
- 浏览器语言
- 页面币种
- 时区设置
- 数据采集任务的地区需求
代理IP主要用于提供稳定、匹配目标区域的网络连接,并不代表可以忽略网站规则或突破访问限制。
亚马逊数据抓取常见问题
1. 为什么抓不到商品价格?
部分商品可能存在多个规格、优惠券、会员价格或卖家报价,因此搜索结果页不一定显示统一价格。
程序应允许价格字段为空,不要因为单个字段缺失而直接删除整个商品记录。
2. 为什么商品选择器失效了?
电商网站会持续调整页面结构和CSS类名。代码运行一段时间后,如果突然无法提取数据,需要重新检查网页元素。
建议优先使用相对稳定的属性,例如:
div[data-component-type="s-search-result"]
同时,应为标题、价格和评论数设置备用选择器。
3. 为什么不同地区看到的商品不一样?
商品搜索结果可能受到站点、配送地址、币种、语言、库存和网络地区等因素影响。
因此,做多地区数据对比时,应记录采集时间、目标站点和代理地区,避免把不同环境下的数据直接混合。
4. 如何处理分页?
亚马逊搜索结果通常包含多个页面。程序可以读取“下一页”按钮的链接,并在每次采集完成后进入下一页。
需要设置最大页数,避免因为页面异常或链接循环导致程序无限运行。
5. 应该使用动态住宅代理还是静态代理?
如果任务主要是采集不同地区的公开商品结果,可以根据任务规模使用动态住宅代理。
如果需要长期保持同一网络出口,对固定地区进行连续测试或页面验证,则可以考虑静态住宅代理。
具体选择应根据任务持续时间、地区数量、请求规模和稳定性要求决定。
如何提高亚马逊数据采集质量?
一个稳定的数据采集项目不能只关注“能否打开页面”,还需要关注数据是否完整、准确和可追踪。
建议在项目中增加以下机制:
设置合理的访问频率
不要在短时间内连续请求大量页面。可以在每页任务之间设置固定间隔,并限制并发数量。
保存采集时间
为每条数据增加采集时间字段,方便后续分析价格变化。
记录失败原因
将超时、页面为空、字段缺失和状态异常分别记录,便于后续排查。
定期检查页面结构
建议定期运行小规模测试,确认商品标题、价格和评分等主要字段是否仍能正常提取。
对数据进行清洗
价格字段可能包含货币符号和千位分隔符,评论数量也可能使用“K”等缩写。进入数据库前,应统一格式并处理空值。
总结
亚马逊数据抓取可以帮助跨境电商团队完成商品监控、价格分析、选品研究和市场趋势判断。
对于符合官方接口应用条件的项目,2026年应优先评估Amazon Creators API,而不是继续按照已经停止使用的PA-API教程接入。对于公开网页研究,可以使用Python和Playwright建立小规模、低频率的数据采集流程。
当任务涉及不同国家站点时,稳定且地区匹配的代理IP能够减少网络环境差异,提高数据采集的一致性。通过kookeey动态住宅代理、静态住宅代理或数据中心代理,可以根据目标地区和任务规模配置相应的网络线路。
无论使用API、浏览器自动化还是代理IP,都应始终遵守目标网站的服务条款、数据授权范围和相关法律要求。
本文来自网络投稿,不代表kookeey立场,如有问题请联系我们