如果你照著某篇 Amazon 爬蟲教學一路做到底,最後卻只換來一堆 CAPTCHA、503 錯誤,或是整頁空白——別懷疑,你不是唯一。網路上大多數 Python Amazon 爬取教學,其實都還停在 2022 或 2023 年,裡面用的選擇器和技巧,早就被 Amazon 修掉了。
我在 Thunderbit 做資料擷取工具已經很多年了,實戰經驗告訴我一件事:Amazon 是最難穩定爬取的網站之一。它會一直改 HTML 結構、部署六層級的反機器人防禦,甚至還會透過 A/B 測試,讓不同使用者看到不同版面。在這篇指南裡,我會帶你一步一步做出一個在 2025 年真的還能用的 Python Amazon 爬蟲——包含驗證過的 CSS 選擇器、多層防封鎖策略,以及大多數教學都完全沒提到的排程與匯出方法。至於那些只想拿到資料、不想跟 Python 硬碰硬的人,我也會示範如何用 大概兩下就完成同樣的工作。
什麼是 Amazon 商品爬取?
Amazon 商品爬取,指的是透過程式自動擷取 Amazon 商品頁與搜尋結果頁上的公開資料——像是商品名稱、價格、評分、評論數、圖片、庫存狀態等等。你不用再手動從成百上千筆商品列表裡複製資訊,只要讓爬蟲逐頁讀取 HTML,再把你指定的資料整理成 CSV、Excel 或資料庫等結構化格式。
你可以把它想成,請了一位永遠不會累的實習生,在你喝完一杯早咖啡的時間內,就能跑完一千個商品頁。差別是,這位實習生不會拼錯字,也不需要休息吃午餐。
為什麼要用 Python 抓 Amazon 商品?
Amazon 在 30 多個類別裡,擁有約 ,背後由大約 驅動。第三方賣家如今已佔總商品交易額的 69%。要人工追蹤哪怕只是其中一小部分,都幾乎不可能。以下就是團隊為什麼會去抓 Amazon:
| 使用情境 | 受益對象 | 擷取內容 |
|---|---|---|
| 價格監控與動態調價 | 電商營運、平台賣家 | 價格、庫存狀態、賣家資訊 |
| 競品分析 | 產品經理、品牌團隊 | 商品特色、評分、評論數 |
| 市場研究 | 分析師、新品團隊 | 類別趨勢、價格分布 |
| 開發名單蒐集 | 業務團隊 | 賣家名稱、品牌資訊、聯絡資料 |
| 聯盟行銷 | 內容創作者、優惠網站 | 價格、促銷、商品細節 |
| 庫存追蹤 | 供應鏈、採購團隊 | 庫存狀態、預計到貨時間 |
光是 Amazon 的價格變動量,就足以說明自動化有多重要:Amazon 每天會變價 ,平均每個商品大約每 10 分鐘就會更新一次價格。相較之下,像 Best Buy 和 Walmart 每個月大約只變價 5 萬次左右。靠人力根本追不上。

Python 讓你能完全掌控爬蟲流程——你可以決定要抓什麼、錯誤怎麼處理、資料存哪裡。但同時也代表,你得自己負責維護、反封鎖,以及跟上 Amazon 頻繁的 HTML 改版。
能從 Amazon 抓哪些資料,哪些不要碰?
從公開可存取的商品頁面,通常可以擷取:
- 商品標題(名稱、品牌)
- 價格(目前價、原價、促銷價)
- 評分(星等平均)
- 評論數
- 商品圖片(主圖網址)
- 庫存 / 上架狀態
- ASIN(Amazon Standard Identification Number)
- 商品描述與重點條列
- 賣家資訊
- 商品變體(尺寸、顏色等)
以下資料則建議避開:
- 登入後才能看到的資料:延伸評論頁、個人帳戶資料、訂單紀錄
- 個資:買家姓名、地址、付款資訊
- 受版權保護、用於再發佈的內容:商品描述與圖片可用於分析,但不要拿來當成你自己的內容重新發布
Amazon 的 封鎖了 50 多個已命名的 bot(包含 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 商品頁上了。
先來看哪些選擇器已經壞掉、哪些在 2025 年還能用:
| 資料點 | 失效選擇器(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 商品頁,複製網址。我們先從最基本的 requests.get() 開始:
1import requests
2url = "https://www.amazon.com/dp/B0DGNFM9YJ"
3response = requests.get(url)
4print(response.status_code)
5print(response.text[:500])
執行後,你幾乎一定會拿到 503 狀態碼,或是 HTML 裡出現「To discuss automated access to Amazon data please contact…」這類字樣。這代表 Amazon 的 WAF(Web Application Firewall)已經把你的 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# 主圖網址
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 都能對應到乾淨的商品網址:https://www.amazon.com/dp/{ASIN}。這比直接使用完整搜尋結果網址更穩定,因為搜尋網址常帶有與 session 有關的參數。
第 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、標題、價格、評分、評論、庫存狀態、圖片網址和商品網址。多數教學到這裡就結束了——但如果你要做的是正式工作流程,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)
Proxy 輪換
如果你要爬的不只是幾頁而已,就需要代理輪換。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 秒……),但不會超過合理上限。隨機抖動則能避免重試節奏被辨識出來。
當 JS 動態渲染內容時,改用 Selenium 或 Playwright
有些 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% 成功率) | 幾乎沒有 |
| Proxy 輪換 | 中 | 高 | 頂多簡單提一下 |
| 限流 + 指數退避 | 容易 | 中 | 沒有 |
| Selenium / Playwright 備援 | 中 | 高(處理 JS 內容時) | 有提,但很少示範 |
不只 CSV:把 Amazon 資料匯出到 Google Sheets、Airtable 等工具
我看過的每篇教學都只講到 CSV 匯出。但真正的商業流程,往往需要把資料送進 Google Sheets、資料庫,或 Airtable、Notion 這類工具。
用 gspread 匯出到 Google Sheets
先建立 Google Service Account(一次性設定):
- 前往 → APIs & Services → Credentials
- 建立 service account 並下載 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 Sheet,能即時分享,也方便做儀表板。
存進 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 的匯出腳本, 可免費匯出到 Google Sheets、Airtable、Notion、Excel、CSV 和 JSON,甚至包含可直接在 Airtable 和 Notion 顯示的圖片欄位。你不需要設定 gspread、不需要 API 憑證,也不用寫任何程式碼。對於需要把資料導入既有工具的團隊來說,這能省下非常多時間。
自動排程 Amazon 爬取:很多教學都沒寫到的章節
價格監控和庫存追蹤需要的是定期爬取,不是一跑就結束的單次任務。但我幾乎找不到任何競品文章有完整講到排程。下面就是如何把你的 Python 爬蟲自動化。
Cron Job(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
接著打開 Task Scheduler → Create Basic Task → 設定排程(Daily、Hourly)→ Action 選「Start a program」→ 指向 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 的排程爬蟲
如果你的團隊不想研究 cron 語法或雲端基礎設施,Thunderbit 內建的 就很好用。你只要用白話輸入排程需求(例如「每天早上 8 點」或「每週一」),再加入 Amazon URL,按下「排程」即可。沒有終端機、沒有 YAML、也不用部署流程。對需要持續監控價格或庫存的電商團隊來說,特別方便。
Python 自架、爬蟲 API、免寫程式:到底該選哪個?
這是我在論壇上很常看到的問題,但幾乎沒有任何排名前段的文章有條理地回答。所以我直接給你最誠實的看法:
| 評估項目 | Python + BS4/curl_cffi | 爬蟲 API(ScraperAPI、Oxylabs) | 免寫程式(Thunderbit) |
|---|---|---|---|
| 建置時間 | 30–60 分鐘 | 10–20 分鐘 | 約 2 分鐘 |
| 需要寫程式嗎 | 需要(Python) | 需要(API 呼叫) | 不需要 |
| 內建防封鎖 | 沒有(自己做) | 有 | 有 |
| 支援 JS 渲染 | 只有搭配 Selenium / Playwright | 視供應商而定 | 有(Browser 或 Cloud 模式) |
| 排程 | 自行處理(cron / 雲端) | 部分服務有 | 內建 |
| 成本 | 免費(另加代理成本) | 每月 $30–100+ | 有免費方案 |
| 維護成本 | 高(選擇器容易失效) | 低 | 幾乎沒有(AI 會自動調整) |
| 最適合 | 想完全掌控的開發者 | 追求規模與穩定性 | 追求速度、非工程人員、商務使用者 |
如果你想學習、需要高度客製化,而且不介意後續維護,Python 是正確選擇。爬蟲 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% 以下時,就設個提醒(哪怕只是 email)。
- 保留原始 HTML。 把完整 HTML 和解析後資料一起存起來。之後選擇器改了,還能直接重解析歷史資料,不必重爬。
- 頻繁輪換代理與 User-Agent。 靜態指紋在大規模運作下,幾小時內就可能被標記。
- 使用指數退避。 遇到封鎖後不要立刻重試。
- 用 Docker 容器化。 把爬蟲包進 Docker,部署與移轉都更方便。
- 加入資料驗證。 確認價格是數字、評分介於 1–5、標題不是空值。某團隊在加上驗證層之後,下游錯誤減少了 。
如果以上這些聽起來比你原本預期還麻煩,那也可以想想,像 Thunderbit 這類免寫程式工具是否更適合你的情境。選快一點的路徑沒有什麼好丟臉的——我修過太多爬蟲,太清楚有時候最好的程式,就是你根本不用寫的程式。
抓 Amazon 時的法律與道德注意事項
這個話題在每次談 Amazon 爬取時都會出現,所以這裡快速說明一下法律背景:
- 在美國,抓取公開資料通常是合法的。 具有里程碑意義的 判決(2022)確立了存取公開資料不違反 CFAA。近期的 (2024)與 (2024)也強化了這個原則。
- Amazon 的服務條款禁止自動化存取。 這屬於民事層面的契約違約,不是刑事問題。法院通常也會把兩者區分開來。
- Amazon v. Perplexity(2025) 是一個涉及 AI 抓取 Amazon 頁面的進行中案件。法院在 2026 年 3 月曾核發初步禁制令。這件事值得持續關注。
- 只抓公開頁面。 不要抓有登入保護的內容、個資,或任何需要驗證才能看到的東西。
- 尊重速率限制。 不要把 Amazon 的伺服器打爆。每次請求間隔 2–5 秒是合理的。
- 負責任地使用資料。 只用於分析,不要把受版權保護的內容直接再發佈。
- 大規模商業使用前請諮詢法律顧問,尤其是你在歐盟時(涉及 GDPR 時,個資規範更要注意)。
如果你想深入了解,可以參考我們的 。
總結
現在你已經擁有一個能運作的 Python Amazon 爬蟲,包含 2025 年驗證過的選擇器、遠超「只加個 User-Agent」的多層防封鎖策略、實用的排程方式,以及能把資料匯出到 Google Sheets、資料庫或團隊常用工具的方法。
重點整理:
- Python + curl_cffi + BeautifulSoup 能讓你完全掌控流程,搭配 TLS 指紋模擬後成功率可達約 94%
- 反封鎖需要多層防護:標頭輪換、TLS 指紋模擬、Proxy 輪換、限流與指數退避缺一不可
- 排程 能把一次性腳本變成持續監控管線(cron、GitHub Actions,或 Thunderbit 內建排程器)
- 不只匯出 CSV,Google Sheets、SQLite、Airtable、Notion 才是真正有商業價值的落點
- Thunderbit 提供了兩下完成的替代方案,特別適合非開發者,或是寧可把時間花在分析資料,而不是除錯選擇器的人
如果你想直接動手試程式,這篇指南裡的內容都已經可以複製就跑。若你想完全跳過寫程式, 也能讓你馬上在 Amazon 上體驗免寫程式的做法。
更多相關內容,請參考我們的指南:、、 以及 。你也可以到 看逐步教學影片。
祝你爬得順利——也希望你的選擇器能撐到下一次 Amazon 更新。
常見問題
1. 為什麼我的 Python Amazon 爬蟲跑幾次後就被擋?
Amazon 採用六層防禦系統:IP 信譽分析、TLS 指紋辨識(JA3/JA4)、瀏覽器環境偵測、行為生物特徵、CAPTCHA 驗證,以及機器學習驅動的異常偵測。只靠一個 User-Agent 的基本 requests 腳本,成功率大約只有 。你需要 TLS 模擬(curl_cffi)、完整標頭輪換、Proxy 輪換,以及帶隨機抖動的限流,才能穩定存取。
2. 2025 年抓 Amazon 商品最推薦哪些 Python 套件?
curl_cffi 用來發送帶 TLS 模擬的 HTTP 請求(這是單一提升幅度最大的工具)、BeautifulSoup4 搭配 lxml 做 HTML 解析、pandas 負責資料整理與匯出,另外遇到 JavaScript 渲染內容時,可用 Selenium 或 Playwright 當備援。Python 也是 的爬蟲開發者使用的語言。
3. 抓 Amazon 商品資料合法嗎?
在美國,抓取公開可存取的資料通常是合法的,像 hiQ v. LinkedIn 與 Meta v. Bright Data 這類判決都支持這個方向。Amazon 的服務條款雖然禁止自動化存取,但法院通常會把 ToS 違規視為民事問題,而非刑事問題。請務必避免登入保護內容、遵守速率限制,若是大規模商業用途,最好諮詢法律顧問。
4. 可以完全不寫程式就抓 Amazon 嗎?
可以。像 這類工具,只要用 Chrome 擴充功能兩下就能抓 Amazon 商品。它的 AI 欄位辨識會自動把資料整理成結構化表格,而且可以免費匯出到 Excel、Google Sheets、Airtable 或 Notion。當 Amazon HTML 改版時,Thunderbit 的 AI 會自動適應,不需要手動更新。
5. Amazon 的 HTML 選擇器多久會變一次?我該怎麼維護爬蟲?
很頻繁,而且常常不會先通知。爬蟲社群回報,大約有 的爬蟲每週都得修補,原因就是 DOM 變動。要跟上變化,請持續監控成功率、保留原始 HTML 方便重新解析,並定期用實際頁面檢查選擇器。或者,你也可以直接改用像 Thunderbit 這類 AI 工具,讓它自動適應,省下這些維護工作。
延伸閱讀