用 Python 学会抓取 Amazon 商品数据

最后更新于 April 16, 2026

如果你照着某篇 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 万次。任何人工团队都不可能跟得上这种节奏。

amazon-product-price-monitor-dashboard.webp

Python 让你对爬取过程拥有完全控制权——你可以决定提取什么、如何处理错误、以及把数据存到哪里。但这也意味着,你需要自己负责维护、反封锁,以及跟上 Amazon 频繁的 HTML 变化。

你能从 Amazon 抓到什么,不能抓到什么?

从公开可访问的商品页里,通常可以提取以下内容:

  • 商品标题(名称、品牌)
  • 价格(当前价、原价、促销价)
  • 评分(星级平均分)
  • 评论数
  • 商品图片(主图 URL)
  • 可用性 / 库存状态
  • ASIN(Amazon 标准识别码)
  • 商品描述和要点
  • 卖家信息
  • 商品变体(尺寸、颜色等)

以下内容则应当避免:

  • 登录后才能看到的数据:扩展评论页、个人账户信息、订单历史
  • 个人隐私信息:买家姓名、地址、支付信息
  • 用于二次发布的受版权保护内容:商品描述和图片可以用于分析,但不要当成你自己的内容再发布

Amazon 的 屏蔽了 50 多个已知机器人(包括 GPTBot、Scrapy 和 ClaudeBot),并禁止访问用户账户、购物车和愿望清单等路径。商品详情页本身没有被明确禁止,但 Amazon 的服务条款确实不允许自动化访问。法院通常会区分 ToS 违规(民事问题)和 CFAA 下的刑事违规——关于合法性的问题,我们会在本文结尾再详细说明。

你需要哪些工具和库?

下面是这篇教程要用到的 Python 技术栈:

用途为什么选它
requestsHTTP 请求简单、支持广泛
beautifulsoup4HTML 解析便于用 CSS 选择器提取数据
lxml高速 HTML 解析器作为 BeautifulSoup 的解析后端
curl_cffiTLS 指纹伪装绕过 Amazon 检测的关键
pandas数据整理与导出DataFrame、CSV/Excel 导出

可选项(用于 JavaScript 渲染内容):

  • seleniumplaywright —— 无头浏览器自动化

配置你的 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!”,就可以继续了。

laptop-coding-workspace.webp

为什么大多数 Amazon 爬取教程都失效了(以及这篇为什么不一样)

这正是很多教程都会跳过的部分,也是你大概率正在读这篇文章的原因。

Amazon 会频繁更新 HTML 结构、class 名和元素 ID。爬虫社区报告称,因 DOM 变化和指纹识别调整,约有 。最著名的“翻车案例”之一,就是 #priceblock_ourprice 这个选择器,它曾出现在 2018–2023 年的大量教程里,但现在在 Amazon 商品页上已经不存在了。

下面是已失效与当前可用选择器的快速对比:

数据项失效选择器(2024 年前)2025 可用选择器
价格#priceblock_ourpricediv#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen
标题#productTitlespan#productTitle(仍然可用)
评分span.a-icon-alt(有时上下文不对)#acrPopover span.a-icon-alt
评论数#acrCustomerReviewCountspan#acrCustomerReviewText
库存状态#availability spandiv#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 服务账号(只需一次):

  1. 打开 → APIs & Services → Credentials
  2. 创建服务账号并下载 JSON 密钥文件
  3. 保存到 ~/.config/gspread/service_account.json
  4. 用 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_cffiScraper 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 商品

当然我有点偏袒自己的产品——毕竟这是我团队做的。但这个流程真的就是这么简单:

  1. 安装
  2. 打开 Amazon 搜索结果页或商品页
  3. 点击 “AI Suggest Fields”(或者直接用 Amazon 即时爬虫模板)
  4. 点击 “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 用于数据整理和导出,而 SeleniumPlaywright 则可作为 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 工具,系统会自动适配,从而免去维护负担。

了解更多

Shuai Guan
Shuai Guan
Co-founder/CEO @ Thunderbit. Passionate about cross section of AI and Automation. He's a big advocate of automation and loves making it more accessible to everyone. Beyond tech, he channels his creativity through a passion for photography, capturing stories one picture at a time.
目录

试试 Thunderbit

只需 2 次点击即可抓取线索和其他数据。AI 驱动。

获取 Thunderbit 免费使用
使用 AI 提取数据
轻松将数据传输到 Google Sheets、Airtable 或 Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week