如果你照着某篇 Amazon 爬取教程一路操作,结果却只碰上 CAPTCHA、503 错误,或者抓到一堆空白结果——欢迎加入这个“踩坑俱乐部”。网上流传的大多数 Python Amazon 爬取指南,很多都是 2022 或 2023 年写的,里面用到的选择器和技巧早就被 Amazon 修补掉了。
我在 Thunderbit 做数据提取工具已经很多年了,想跟你分享一个一线经验:Amazon 是最难稳定爬取的网站之一。它的 HTML 结构一直在变,还部署了六层反爬防线,甚至会通过 A/B 测试给不同用户展示不同页面布局。在这篇指南里,我会带你一步步搭建一个在 2025 年仍然能用的 Python Amazon 爬虫——包含经过验证的 CSS 选择器、多层反封锁策略,以及很多教程都会直接跳过的定时与导出方案。至于那些只想拿到数据、懒得跟 Python 斗智斗勇的人,我也会顺带告诉你,Thunderbit 如何用大概两次点击完成同样的事。
什么是 Amazon 商品抓取?
Amazon 商品抓取,指的是通过程序从 Amazon 的商品页和搜索结果页中,提取公开可访问的数据——比如商品名称、价格、评分、评论数、图片、库存状态等等。你不需要手动从几百个商品列表里逐个复制信息,而是让爬虫访问每个页面,读取 HTML,再把你需要的数据整理成 CSV、Excel 或数据库这类结构化格式。
你可以把它理解成雇了一个永远不喊累的实习生:他能在你喝完一杯咖啡的时间里浏览上千个商品页面。只不过这个实习生不会拼错单词,也不需要午休。
为什么要用 Python 抓取 Amazon 商品?
Amazon 在 30 多个品类中大约拥有 ,背后由约 支撑。第三方卖家如今贡献了总 GMV 的 69%。靠人工去监控哪怕其中一小部分商品,也几乎不可能。下面这些场景都很适合抓取 Amazon 数据:
| 使用场景 | 受益对象 | 提取内容 |
|---|---|---|
| 价格监控与重新定价 | 电商运营、平台招商卖家 | 价格、库存状态、卖家信息 |
| 竞品分析 | 产品经理、品牌团队 | 商品功能、评分、评论数 |
| 市场研究 | 分析师、新品团队 | 类目趋势、价格分布 |
| 线索获取 | 销售团队 | 卖家名称、品牌信息、联系方式 |
| 联盟营销 | 内容创作者、优惠站 | 价格、促销信息、商品详情 |
| 库存追踪 | 供应链、采购团队 | 库存状态、送达预估 |
仅仅是 Amazon 的价格波动,就足以说明自动化有多重要:Amazon 每天会改价 ,平均每个商品的价格大约每 10 分钟更新一次。相比之下,Best Buy 和 Walmart 每个月的改价次数只有约 5 万次。任何人工团队都不可能跟得上这种节奏。

Python 让你对爬取过程拥有完全控制权——你可以决定提取什么、如何处理错误、以及把数据存到哪里。但这也意味着,你需要自己负责维护、反封锁,以及跟上 Amazon 频繁的 HTML 变化。
你能从 Amazon 抓到什么,不能抓到什么?
从公开可访问的商品页里,通常可以提取以下内容:
- 商品标题(名称、品牌)
- 价格(当前价、原价、促销价)
- 评分(星级平均分)
- 评论数
- 商品图片(主图 URL)
- 可用性 / 库存状态
- ASIN(Amazon 标准识别码)
- 商品描述和要点
- 卖家信息
- 商品变体(尺寸、颜色等)
以下内容则应当避免:
- 登录后才能看到的数据:扩展评论页、个人账户信息、订单历史
- 个人隐私信息:买家姓名、地址、支付信息
- 用于二次发布的受版权保护内容:商品描述和图片可以用于分析,但不要当成你自己的内容再发布
Amazon 的 屏蔽了 50 多个已知机器人(包括 GPTBot、Scrapy 和 ClaudeBot),并禁止访问用户账户、购物车和愿望清单等路径。商品详情页本身没有被明确禁止,但 Amazon 的服务条款确实不允许自动化访问。法院通常会区分 ToS 违规(民事问题)和 CFAA 下的刑事违规——关于合法性的问题,我们会在本文结尾再详细说明。
你需要哪些工具和库?
下面是这篇教程要用到的 Python 技术栈:
| 库 | 用途 | 为什么选它 |
|---|---|---|
requests | HTTP 请求 | 简单、支持广泛 |
beautifulsoup4 | HTML 解析 | 便于用 CSS 选择器提取数据 |
lxml | 高速 HTML 解析器 | 作为 BeautifulSoup 的解析后端 |
curl_cffi | TLS 指纹伪装 | 绕过 Amazon 检测的关键 |
pandas | 数据整理与导出 | DataFrame、CSV/Excel 导出 |
可选项(用于 JavaScript 渲染内容):
selenium或playwright—— 无头浏览器自动化
配置你的 Python 环境
打开终端,执行:
1mkdir amazon-scraper && cd amazon-scraper
2python -m venv venv
3source venv/bin/activate # Windows 上:venv\Scripts\activate
4pip install requests beautifulsoup4 lxml curl_cffi pandas
检查是否安装成功:
1import requests, bs4, curl_cffi, pandas
2print("All good!")
如果没有报错并看到 “All good!”,就可以继续了。

为什么大多数 Amazon 爬取教程都失效了(以及这篇为什么不一样)
这正是很多教程都会跳过的部分,也是你大概率正在读这篇文章的原因。
Amazon 会频繁更新 HTML 结构、class 名和元素 ID。爬虫社区报告称,因 DOM 变化和指纹识别调整,约有 。最著名的“翻车案例”之一,就是 #priceblock_ourprice 这个选择器,它曾出现在 2018–2023 年的大量教程里,但现在在 Amazon 商品页上已经不存在了。
下面是已失效与当前可用选择器的快速对比:
| 数据项 | 失效选择器(2024 年前) | 2025 可用选择器 |
|---|---|---|
| 价格 | #priceblock_ourprice | div#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen |
| 标题 | #productTitle | span#productTitle(仍然可用) |
| 评分 | span.a-icon-alt(有时上下文不对) | #acrPopover span.a-icon-alt |
| 评论数 | #acrCustomerReviewCount | span#acrCustomerReviewText |
| 库存状态 | #availability span | div#availability span.a-size-medium |
这篇文章里的每段代码都已经在 2025 年的真实 Amazon 页面上测试过。我会把实际可用的 CSS 选择器和预期输出一并给你——不再是照搬 2022 年的旧代码。
开始前你需要知道的事
- 难度: 中级(默认你已经会一点 Python)
- 所需时间: 完整教程约 30–45 分钟;基础爬虫约 10 分钟
- 你需要准备: Python 3.9+、Chrome 浏览器(用于检查 Amazon 页面)、终端;如果你想对比无代码方案,还可以准备
第 1 步:向 Amazon 发送第一条请求
在浏览器中打开任意 Amazon 商品页,并复制它的 URL。我们先从一个简单的 requests.get() 开始:
1import requests
2url = "https://www.amazon.com/dp/B0DGNFM9YJ"
3response = requests.get(url)
4print(response.status_code)
5print(response.text[:500])
运行后,你几乎肯定会得到 503 状态码,或者页面里显示 “To discuss automated access to Amazon data please contact…”。这说明 Amazon 的 WAF(Web Application Firewall,Web 应用防火墙)识别出了你的 Python 脚本。仅靠没有合适请求头的 requests.get(),在 Amazon 上的成功率大约只有 。
你应该会看到类似 503 的结果,以及 HTML 里的拦截页。这是正常的——下一步我们会解决它。
第 2 步:设置自定义请求头和 TLS 指纹伪装
现在只加一个 User-Agent 已经不够了。Amazon 会把你的 HTTP 请求头和 TLS 指纹做比对。如果你声称自己是 Chrome 120,但 TLS 握手却暴露出 Python 的 requests 库,就会 。
在 2025 年,最稳妥的方式是使用带浏览器伪装的 curl_cffi:
1from curl_cffi import requests as cfreq
2headers = {
3 "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
4 "Accept-Language": "en-US,en;q=0.9",
5 "Accept-Encoding": "gzip, deflate, br",
6 "Referer": "https://www.google.com/",
7 "DNT": "1",
8 "Connection": "keep-alive",
9 "Upgrade-Insecure-Requests": "1",
10}
11url = "https://www.amazon.com/dp/B0DGNFM9YJ"
12response = cfreq.get(url, headers=headers, impersonate="chrome124")
13print(response.status_code)
14print(len(response.text))
当 curl_cffi 伪装成 Chrome 124 后,成功率会提升到大约 ——比普通 requests 高出 47 倍。此时你应该能看到 200 状态码,以及更长的 HTML 响应(10 万字符以上)。
如果你仍然收到 503,可以尝试换一个 impersonate 值(例如 "chrome131"),或者在重试前稍微等几秒。
第 3 步:解析 HTML 并提取商品数据
现在我们已经拿到了完整 HTML,接下来用 BeautifulSoup 和经过 2025 年验证的选择器提取数据:
1from bs4 import BeautifulSoup
2soup = BeautifulSoup(response.text, "lxml")
3# 商品标题
4title_el = soup.select_one("span#productTitle")
5title = title_el.get_text(strip=True) if title_el else None
6# 价格
7price_el = soup.select_one(
8 "div#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen"
9)
10if not price_el:
11 price_el = soup.select_one("span.priceToPay .a-offscreen")
12if not price_el:
13 price_el = soup.select_one(".apexPriceToPay .a-offscreen")
14price = price_el.get_text(strip=True) if price_el else None
15# 评分
16rating_el = soup.select_one("#acrPopover span.a-icon-alt")
17rating = rating_el.get_text(strip=True) if rating_el else None
18# 评论数
19reviews_el = soup.select_one("span#acrCustomerReviewText")
20reviews = reviews_el.get_text(strip=True) if reviews_el else None
21# 库存状态
22avail_el = soup.select_one("div#availability span")
23availability = avail_el.get_text(strip=True) if avail_el else None
24# 主图 URL
25img_el = soup.select_one("#landingImage")
26image_url = img_el.get("src") if img_el else None
27print(f"Title: {title}")
28print(f"Price: {price}")
29print(f"Rating: {rating}")
30print(f"Reviews: {reviews}")
31print(f"Availability: {availability}")
32print(f"Image: {image_url}")
预期输出示例:
1Title: Apple AirPods Pro (2nd Generation) with USB-C
2Price: $189.99
3Rating: 4.7 out of 5 stars
4Reviews: 98,432 ratings
5Availability: In Stock
6Image: https://m.media-amazon.com/images/I/61SUj2...
注意价格字段这里用了多个兜底选择器——Amazon 会根据商品类型、促销状态以及 A/B 测试版本,切换不同的容器。每次提取前加上条件判断,可以避免某个选择器失效时整个爬虫直接崩掉。
第 4 步:从搜索结果页批量抓取多个商品
如果你想建立真正可用的数据集,通常要先从 Amazon 搜索结果页开始,收集 ASIN,再逐个抓取商品详情页。
1import time
2import random
3def get_search_asins(keyword, max_pages=1):
4 """从 Amazon 搜索结果中收集 ASIN。"""
5 asins = []
6 for page in range(1, max_pages + 1):
7 search_url = f"https://www.amazon.com/s?k={keyword}&page={page}"
8 resp = cfreq.get(search_url, headers=headers, impersonate="chrome124")
9 if resp.status_code != 200:
10 print(f"Search page {page} returned {resp.status_code}")
11 break
12 search_soup = BeautifulSoup(resp.text, "lxml")
13 results = search_soup.select('div[data-component-type="s-search-result"]')
14 for r in results:
15 asin = r.get("data-asin")
16 if asin:
17 asins.append(asin)
18 print(f"Page {page}: found {len(results)} products")
19 time.sleep(random.uniform(2, 5)) # 礼貌性延迟
20 return asins
21asins = get_search_asins("wireless+earbuds", max_pages=2)
22print(f"Collected {len(asins)} ASINs")
每个 ASIN 都能对应到一个干净的商品 URL:https://www.amazon.com/dp/{ASIN}。这比直接使用搜索结果页的完整 URL 更稳定,因为后者往往会带有会话相关参数。
第 5 步:处理分页并批量爬取
现在我们把搜索结果采集和详情页抓取组合成一个完整流程:
1import pandas as pd
2def scrape_product(asin):
3 """抓取单个 Amazon 商品详情页。"""
4 url = f"https://www.amazon.com/dp/{asin}"
5 try:
6 resp = cfreq.get(url, headers=headers, impersonate="chrome124")
7 if resp.status_code != 200:
8 return None
9 soup = BeautifulSoup(resp.text, "lxml")
10 title_el = soup.select_one("span#productTitle")
11 price_el = (
12 soup.select_one("div#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen")
13 or soup.select_one("span.priceToPay .a-offscreen")
14 or soup.select_one(".apexPriceToPay .a-offscreen")
15 )
16 rating_el = soup.select_one("#acrPopover span.a-icon-alt")
17 reviews_el = soup.select_one("span#acrCustomerReviewText")
18 avail_el = soup.select_one("div#availability span")
19 img_el = soup.select_one("#landingImage")
20 return {
21 "asin": asin,
22 "title": title_el.get_text(strip=True) if title_el else None,
23 "price": price_el.get_text(strip=True) if price_el else None,
24 "rating": rating_el.get_text(strip=True) if rating_el else None,
25 "reviews": reviews_el.get_text(strip=True) if reviews_el else None,
26 "availability": avail_el.get_text(strip=True) if avail_el else None,
27 "image_url": img_el.get("src") if img_el else None,
28 "url": url,
29 }
30 except Exception as e:
31 print(f"Error scraping {asin}: {e}")
32 return None
33# 抓取所有已收集的 ASIN
34products = []
35for i, asin in enumerate(asins):
36 print(f"Scraping {i+1}/{len(asins)}: {asin}")
37 product = scrape_product(asin)
38 if product:
39 products.append(product)
40 time.sleep(random.uniform(2, 5)) # 每次请求之间随机延迟
41df = pd.DataFrame(products)
42print(f"\nScraped {len(df)} products successfully")
43print(df.head())
2 到 5 秒的随机延迟非常关键。完全固定的节奏(比如每次都正好 3 秒)会让 Amazon 的行为分析系统觉得很可疑。随机间隔更像真人浏览。
第 6 步:把 Amazon 数据保存为 CSV
1df.to_csv("amazon_products.csv", index=False, encoding="utf-8-sig")
2print("Saved to amazon_products.csv")
现在你应该已经有了一个干净的 CSV,里面包含 ASIN、标题、价格、评分、评论、库存状态、图片 URL 和商品链接等字段。很多教程到这里就结束了——但如果你真正在做业务流程,CSV 其实只是起点。
反封锁进阶:如何让你的爬虫持续运行
对任何想用 Python 抓 Amazon 商品的人来说,被封几乎都是 。Amazon 的六层防御包括 IP 声誉分析、TLS 指纹识别、浏览器环境检查、行为生物识别、CAPTCHA,以及基于机器学习的异常检测。下面我会用分层策略来应对这些问题。
轮换 User-Agent 和完整请求头
单一静态 User-Agent 很快就会被识别出来。最好在一组新的浏览器标识字符串之间轮换:
1import random
2USER_AGENTS = [
3 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
4 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
5 "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
6 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15",
7]
8def get_headers():
9 return {
10 "User-Agent": random.choice(USER_AGENTS),
11 "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
12 "Accept-Language": "en-US,en;q=0.9",
13 "Accept-Encoding": "gzip, deflate, br",
14 "Referer": "https://www.google.com/",
15 "DNT": "1",
16 "Connection": "keep-alive",
17 }
有一个很容易踩坑的细节:你的 Accept-Language 必须和 IP 所暗示的地理位置一致。如果你从德国 IP 发出请求,却带着 Accept-Language: en-US,这就很容易触发风控。
使用 curl_cffi 进行 TLS 指纹伪装
我们在第 2 步已经提过,但这里值得再强调一次:这项技术对成功率的提升最大。标准 Python requests 对 Amazon 的成功率只有约 2%。而用了 curl_cffi 的浏览器伪装后,成功率能到大约 94%。这就是“能跑”与“完全报废”之间的差别。
1from curl_cffi import requests as cfreq
2# 浏览器伪装目标也可以轮换
3BROWSERS = ["chrome120", "chrome124", "chrome131"]
4response = cfreq.get(
5 url,
6 headers=get_headers(),
7 impersonate=random.choice(BROWSERS),
8)
代理轮换
如果你要抓的不只是几页内容,就需要做代理轮换。Amazon 会追踪 IP 地址,并封掉同一个 IP 发送过多请求的行为。
1PROXIES = [
2 "http://user:pass@proxy1.example.com:8080",
3 "http://user:pass@proxy2.example.com:8080",
4 "http://user:pass@proxy3.example.com:8080",
5]
6proxy = random.choice(PROXIES)
7response = cfreq.get(
8 url,
9 headers=get_headers(),
10 impersonate="chrome124",
11 proxies={"http": proxy, "https": proxy},
12)
住宅代理通常比数据中心代理更有效(Amazon 会主动封锁数据中心 IP 段),但价格也更高。小型项目可以先从 入手,再按需扩展。
限速与指数退避
我看过的竞品文章里,几乎没人讲这一点,但它非常重要。一旦遇到 503 或 CAPTCHA 响应,不要马上重试——那样很容易把自己送进永久封禁的快车道。
1import time
2import random
3def fetch_with_backoff(url, max_retries=3):
4 """失败时使用指数退避重新请求 URL。"""
5 for attempt in range(max_retries):
6 response = cfreq.get(
7 url,
8 headers=get_headers(),
9 impersonate=random.choice(BROWSERS),
10 )
11 if response.status_code == 200:
12 return response
13 # 带抖动的指数退避
14 wait = min(2 ** attempt + random.uniform(0, 1), 30)
15 print(f"Attempt {attempt+1} failed ({response.status_code}). Waiting {wait:.1f}s...")
16 time.sleep(wait)
17 return None # 重试次数耗尽
公式 wait = min(2^attempt + jitter, max_delay) 可以保证等待时间逐步增长(2 秒、4 秒、8 秒……),但不会无限拉长。随机抖动还能防止你的重试节奏被识别成固定模式。
用 Selenium 或 Playwright 兜底处理 JS 渲染内容
有些 Amazon 页面(尤其是动态价格组件或变体选择器)需要 JavaScript 才能完整渲染。如果 curl_cffi 返回的 HTML 不完整,那就要让无头浏览器接手:
1from playwright.sync_api import sync_playwright
2def scrape_with_browser(url):
3 with sync_playwright() as p:
4 browser = p.chromium.launch(headless=True)
5 page = browser.new_page()
6 page.goto(url, wait_until="domcontentloaded")
7 page.wait_for_timeout(3000) # 等待 JS 渲染
8 html = page.content()
9 browser.close()
10 return html
这个方案会慢很多——每页 3 到 5 秒,而 curl_cffi 通常不到 1 秒。只在必要时使用它。
按我的经验,curl_cffi 可以处理 90% 以上的 Amazon 商品页,而无需浏览器介入。
反封锁策略总结
| 技术 | 难度 | 效果 | 大多数教程是否讲到? |
|---|---|---|---|
| 自定义 User-Agent | 简单 | 低(Amazon 能识别模式) | 是 |
| 完整请求头轮换 | 简单 | 中等 | 很少 |
| TLS 伪装(curl_cffi) | 中等 | 高(约 94% 成功率) | 几乎从不 |
| 代理轮换 | 中等 | 高 | 只会稍微提到 |
| 限速 + 指数退避 | 简单 | 中等 | 否 |
| Selenium/Playwright 兜底 | 中等 | 高(适用于 JS 内容) | 会提,但不会演示 |
不止 CSV:将 Amazon 数据导出到 Google Sheets、Airtable 等工具
我看过的每篇教程几乎都止步于 CSV 导出。但真实业务流程需要把数据送进 Google Sheets、数据库,或者 Airtable 和 Notion 这类工具里。
使用 gspread 导出到 Google Sheets
先配置 Google 服务账号(只需一次):
- 打开 → APIs & Services → Credentials
- 创建服务账号并下载 JSON 密钥文件
- 保存到
~/.config/gspread/service_account.json - 用 JSON 文件中的
client_email共享你的目标表格
然后执行:
1import gspread
2from gspread_dataframe import set_with_dataframe
3gc = gspread.service_account()
4sh = gc.open("Amazon Scrape Data")
5worksheet = sh.sheet1
6set_with_dataframe(worksheet, df)
7print("Data exported to Google Sheets!")
这会把整个 DataFrame 直接写入 Google 表格——实时、可共享,也适合做仪表盘。
存储到 SQLite 方便本地分析
如果数据量更大,或者你想做历史追踪,SQLite 非常合适——无需服务器,只要一个文件:
1import sqlite3
2conn = sqlite3.connect("amazon_products.db")
3df.to_sql("products", conn, if_exists="append", index=False)
4print(f"Stored {len(df)} products in SQLite")
5# 后续查询:
6historical = pd.read_sql_query(
7 "SELECT * FROM products WHERE price IS NOT NULL ORDER BY rowid DESC LIMIT 100",
8 conn,
9)
无代码替代方案
如果你不想维护 Python 导出脚本,Thunderbit 提供免费导出到 Google Sheets、Airtable、Notion、Excel、CSV 和 JSON 的功能——包括可以直接在 Airtable 和 Notion 中显示的图片字段。无需配置 gspread,无需 API 凭证,也完全不用写代码。对于需要把数据流入现有工具链的团队来说,这能节省大量时间。
自动化 Amazon 定时抓取:缺失的一章
价格监控和库存追踪不是一次性任务,而是需要周期性执行的。但我没在任何竞品文章里看到对“定时执行”的完整介绍。下面就来讲讲如何自动化你的 Python 爬虫。
Cron 定时任务(Linux/macOS)
打开 crontab:
1crontab -e
添加一行,让爬虫每天早上 6 点运行:
10 6 * * * cd /path/to/amazon-scraper && /path/to/venv/bin/python scraper.py >> ~/scraper.log 2>&1
或者每 6 小时执行一次:
10 */6 * * * cd /path/to/amazon-scraper && /path/to/venv/bin/python scraper.py >> ~/scraper.log 2>&1
Windows 任务计划程序
先创建一个批处理文件 run_scraper.bat:
1@echo off
2cd /d "C:\path\to\amazon-scraper"
3call venv\Scripts\activate
4python scraper.py
5deactivate
然后打开“任务计划程序”→“创建基本任务”→设置触发条件(每天、每小时)→ 操作为“启动程序”→ 选择 run_scraper.bat。
GitHub Actions(免费额度)
如果你想用云端定时,且不想维护任何基础设施,可以这样配置:
1name: Amazon Scraper
2on:
3 schedule:
4 - cron: "0 6 * * *" # 每天 UTC 6 点运行
5 workflow_dispatch: # 手动触发
6jobs:
7 scrape:
8 runs-on: ubuntu-latest
9 steps:
10 - uses: actions/checkout@v3
11 - name: Set up Python
12 uses: actions/setup-python@v4
13 with:
14 python-version: "3.11"
15 - name: Install dependencies
16 run: pip install -r requirements.txt
17 - name: Run scraper
18 run: python scraper.py
19 - name: Commit results
20 run: |
21 git config user.name 'GitHub Actions'
22 git config user.email 'actions@github.com'
23 git add data/
24 git diff --staged --quiet || git commit -m "Update scraped data"
25 git push
把代理凭证存进 GitHub Secrets,就能搭出一个免费的自动化抓取流水线。
无代码替代方案:Thunderbit 的 Scheduled Scraper
如果你的团队不想研究 cron 语法或云端部署,Thunderbit 提供了内置的 。你只需要用自然语言描述时间安排(例如“每天早上 8 点”或“每周一”),添加 Amazon URL,然后点击“Schedule”即可。无需终端、无需 YAML 文件、也不用部署流程。对于需要持续监控价格或库存的电商团队来说,这尤其方便。
Python 自己写 vs. Scraper API vs. 无代码:该选哪种?
这是我在论坛里经常看到的问题,但几乎没有高排名文章能给出结构化答案。那我就说说我的真实看法:
| 对比维度 | Python + BS4/curl_cffi | Scraper API(ScraperAPI、Oxylabs) | 无代码(Thunderbit) |
|---|---|---|---|
| 配置时间 | 30–60 分钟 | 10–20 分钟 | 约 2 分钟 |
| 需要写代码吗 | 是(Python) | 是(API 调用) | 否 |
| 内置反封锁 | 否(自己做) | 是 | 是 |
| 支持 JS 渲染 | 仅在 Selenium/Playwright 下可行 | 因供应商而异 | 是(浏览器或云模式) |
| 定时功能 | 自己做(cron/云端) | 部分提供 | 内置 |
| 成本 | 免费(+ 代理费用) | 每月 $30–100+ | 有免费套餐 |
| 维护成本 | 高(选择器容易失效) | 低 | 无(AI 自动适配) |
| 适合谁 | 想要完全控制权的开发者 | 需要大规模稳定性的人 | 追求速度、非开发者、业务用户 |
如果你想学习、想把每个细节都调到自己满意,并且不介意持续维护,那 Python 是合适的。Scraper API 能帮你处理反封锁,但你还是得写代码。而 Thunderbit 则是销售团队、电商运营,或者任何只想尽快拿到数据的人的最快路径——不需要选择器,不需要代码,Amazon 一改 HTML 也不用你手动维护。
Thunderbit 如何用 2 次点击抓取 Amazon 商品
当然我有点偏袒自己的产品——毕竟这是我团队做的。但这个流程真的就是这么简单:
- 安装
- 打开 Amazon 搜索结果页或商品页
- 点击 “AI Suggest Fields”(或者直接用 Amazon 即时爬虫模板)
- 点击 “Scrape”
Thunderbit 的 AI 会读取页面、识别数据结构,并把所有内容提取成干净的表格。你可以免费导出到 Excel、Google Sheets、Airtable 或 Notion。真正的价值在于:如果 Amazon 下周又改了 HTML(而且它很可能会改),Thunderbit 的 AI 会自动适配。没有坏掉的脚本,也不用更新选择器。
如果你要给商品列表补充详情页数据,Thunderbit 的 Subpage Scraping 功能可以自动跟进商品链接,抓取图片、描述、变体等额外字段——这在 Python 里通常要多写不少代码。
让你的 Python Amazon 爬虫长期稳定运行的技巧
如果你决定走 Python 路线,下面这些做法能帮你尽量减少维护麻烦:
- 定期检查选择器。 Amazon 很常改。建议收藏这篇文章——我会随着变化更新选择器表。
- 监控成功率。 跟踪 200 响应和 503/CAPTCHA 的比例。当成功率低于 80% 时,设置提醒(哪怕只是邮件提醒)。
- 保存原始 HTML。 把完整 HTML 响应和解析结果一起存下来。以后如果选择器变了,你可以重新解析历史数据,而不用重新抓取。
- 频繁轮换代理和 User-Agent。 大规模抓取时,静态指纹会在几小时内被盯上。
- 使用指数退避。 被封后千万别立刻重试。
- 用 Docker 容器化。 把爬虫封装到 Docker 里,方便部署和迁移。
- 增加数据校验。 检查价格是否为数字、评分是否在 1–5 之间、标题是否为空。有团队在加入校验层后,。
如果这些听起来比你预想的还要费事,那就可以认真考虑:像 Thunderbit 这样的无代码工具,是否更适合你的场景。选择更快的路径并不丢人——我这些年修爬虫修得足够多了,深知有时候最好的代码,就是你根本不用写的代码。
抓取 Amazon 时的法律与伦理考量
因为每次谈到 Amazon 爬取,这个问题都会被提起,所以这里简单说一下法律层面:
- 在美国,公开可访问数据的抓取通常是合法的。 具有里程碑意义的 判决(2022)确认,访问公开数据并不违反 CFAA。随后 (2024)和 (2024)进一步强化了这一原则。
- Amazon 的服务条款禁止自动化访问。 这属于民事范畴(违约),不是刑事问题。法院通常会将二者区分开来。
- Amazon v. Perplexity(2025) 是一宗正在进行中的案件,涉及对 Amazon 页面进行 AI 抓取。2026 年 3 月已发出初步禁令。这件事值得持续关注。
- 只抓取公开页面。 不要抓取登录保护内容、个人数据或任何需要身份验证才能访问的内容。
- 遵守访问频率。 不要猛攻 Amazon 服务器。每次请求间隔 2–5 秒是比较合理的。
- 负责任地使用数据。 抓取是为了分析,不是为了重新发布受版权保护的内容。
- 大规模商业使用前请咨询律师。 尤其是在欧盟,GDPR 也适用于个人数据。
如果你想深入了解,可以查看我们的指南:。
总结
现在,你已经拥有一个可运行的 Python Amazon 爬虫,使用了经过验证的 2025 年选择器;一个远不止“加个 User-Agent”那么简单的多层反封锁策略;适合持续监控的定时方案;以及能把数据送进 Google Sheets、数据库或团队常用工具的导出方式。
快速总结一下:
- Python + curl_cffi + BeautifulSoup 让你拥有完全控制权,并在结合 TLS 伪装后获得约 94% 的成功率
- 反封锁需要多层协作:请求头轮换、TLS 伪装、代理轮换、限速和指数退避
- 定时任务 能把一次性脚本变成持续监控流水线(cron、GitHub Actions,或 Thunderbit 内置调度器)
- 不止 CSV 的导出——Google Sheets、SQLite、Airtable、Notion——才是业务价值真正落地的地方
- Thunderbit 为非开发者,或任何更愿意把时间花在分析数据而不是修选择器上的人,提供了 2 次点击的替代方案
如果你想亲自试试这份代码,本文里的内容都可以直接复制运行。要是你更想完全跳过编码, 也能让你马上在 Amazon 上体验无代码方案。
更多内容可以查看这些指南:、、以及。你也可以在 看逐步演示。
祝你抓取顺利——愿你的选择器能撑到下一次 Amazon 更新。
常见问题
1. 为什么我的 Python Amazon 爬虫在运行几次后就被封了?
Amazon 使用六层防御系统:IP 声誉分析、TLS 指纹识别(JA3/JA4)、浏览器环境检测、行为生物识别、CAPTCHA 挑战,以及基于机器学习的异常检测。只加一个 User-Agent 的基础 requests 脚本,成功率只有大约 。你需要 TLS 伪装(curl_cffi)、完整请求头轮换、代理轮换,以及带随机抖动的限速,才能保持稳定访问。
2. 2025 年抓取 Amazon 商品最好的 Python 库有哪些?
curl_cffi 负责带 TLS 伪装的 HTTP 请求(单项提升最大),BeautifulSoup4 配合 lxml 用于 HTML 解析,pandas 用于数据整理和导出,而 Selenium 或 Playwright 则可作为 JavaScript 渲染内容的备用方案。Python 目前占据了 的爬虫开发者使用率。
3. 抓取 Amazon 商品数据合法吗?
在美国,抓取公开可访问的数据通常是合法的,hiQ v. LinkedIn 和 Meta v. Bright Data 等判例都支持这一点。Amazon 的服务条款禁止自动化访问,但法院通常会区分 ToS 违规(民事)和刑事违规。一定要避免抓取需要登录的内容,遵守访问频率,大规模商业使用前咨询律师。
4. 不写代码可以抓取 Amazon 吗?
可以。像 这样的工具,允许你通过 Chrome 扩展用 2 次点击抓取 Amazon 商品。它的 AI 字段识别会自动把数据整理成结构化表格,并可免费导出到 Excel、Google Sheets、Airtable 或 Notion。当 Amazon 改变 HTML 时,Thunderbit 的 AI 会自动适配,不需要你手动更新。
5. Amazon 的 HTML 选择器多久会变一次?我该怎么保持爬虫更新?
变化频繁,而且通常不会提前通知。爬虫社区报告称,由于 DOM 变化,大约 的爬虫需要每周修复。要提前应对,最好的办法是监控成功率、保存原始 HTML 以便重解析,并定期在真实页面上检查选择器。或者,使用 Thunderbit 这类 AI 工具,系统会自动适配,从而免去维护负担。
了解更多