我如何用 Python 抓取 Amazon 評論(突破登入牆)

最後更新於 April 16, 2026

我的 Amazon 評論爬蟲連續跑了六週都沒問題——直到某天早上,它回傳了 200 OK,但頁面卻空空如也。沒有錯誤、沒有 CAPTCHA,只有原本該有數百則評論的位置,變成了一片空白的 HTML。

如果你也遇過這種情況,你不是孤單的。到了 2025 年底,Amazon 開始把完整評論頁面擋在登入牆後面,導致大量 Python 爬蟲腳本一夜之間失效。過去幾個月,我在 一邊打造我們的 AI 爬蟲,一邊維護自己的 Python 評論抓取流程,算是從兩個角度一路踩坑、一路修正,所以我想把當初最希望有人寫給我的那份指南整理出來。這篇文章會完整介紹可行做法:以 cookie 為基礎的驗證、能撐過 Amazon CSS 混淆的穩定選擇器、突破 10 頁分頁上限的替代方案、反機器人防護,以及最後的加碼——把原始評論文字轉成真正商業洞察的情緒分析。若你看到一半就想:「我其實不想維護這麼多程式碼」,我也會示範 如何用大約兩分鐘、完全不寫 Python 就做完同樣的事。

什麼是 Amazon 評論抓取?為什麼它很重要?

Amazon 評論抓取,是指用程式化方式擷取 Amazon 商品頁上的顧客評論資料——像是星等、評論內容、作者名稱、日期、是否為已驗證購買等。由於 Amazon ,而且後來也沒有再開放,因此網頁爬蟲幾乎是取得這些資料的唯一程式化途徑。

數據也支持這一點。,而且 。商品頁只展示 5 則評論,就可能讓 。而那些系統化分析評論情緒的公司,客戶留存率可 。這不只是抽象的資料科學,而是競品情報、產品改善訊號與行銷語言,全都明明白白躺在 Amazon 伺服器上的文字裡。

為什麼要用 Python 抓 Amazon 評論

Python 仍然是這類工作的首選語言。它在 ,而且它的生態系——requests、BeautifulSoup、pandas、Scrapy——讓即使不是全職工程師的人,也能比較容易上手網頁爬蟲。

不同團隊會以不同方式運用這些資料:

團隊使用情境擷取內容
產品/研發找出重複抱怨、排序修正優先級1–2 星評論文字、關鍵字出現頻率
業務監測競品商品情緒評分、評論量趨勢
行銷擷取顧客語言作為廣告文案素材正向評論句子、功能提及
電商營運長期追蹤自家商品口碑變化星等分布、已驗證購買比例
市場研究比較不同類別領先商品的功能表現多 ASIN 評論資料集

某廚具品牌 ,重新調整配方後,在 60 天內拿回了類別第一名的暢銷排行。另一家健身追蹤器公司 ,追查後確認是乳膠過敏問題,隨即推出低敏版本,退貨率因此下降 40%。這正是讓工程投入值得的 ROI。

登入牆:為什麼你的 Amazon 評論爬蟲突然失效

2024 年 11 月 14 日,Amazon 。這項變更也在 上獲得確認。當你在無痕視窗中開啟 /product-reviews/{ASIN}/,看到的會是登入頁,而不是評論資料。

python-web-scraping-diagram.webp

症狀其實很隱晦:你的腳本拿到的是 200 OK,但 HTML 內容裡出現的是登入表單(例如 name="email"id="ap_password"),而不是評論。沒有錯誤碼,也沒有 CAPTCHA,只有……毫無用處的內容。

Amazon 這麼做是基於反機器人與區域合規的考量。實際執行並不完全一致——有時候一個剛開的瀏覽器視窗在登入牆生效前,還是會先載入少量評論,尤其是第一頁——但只要是要大規模抓取,就應該預設登入牆永遠存在。

不同的 Amazon 國家站(.de.co.uk.co.jp)會各自獨立執行這項限制。正如某位論壇使用者所說:「每個國家都需要各自登入。」你的 .com cookies 不會在 .co.uk 上通用。

精選評論 vs. 完整評論:不登入還能看到什麼

Amazon 商品頁(/dp/{ASIN}/)在未驗證狀態下,仍會顯示大約 。這些是 Amazon 演算法挑選出來的內容,適合快速看一下整體口碑,但不能排序、篩選,也不能分頁。

而完整評論頁(/product-reviews/{ASIN}/)——可依最新排序、依星等篩選,並可翻閱數百則評論——則需要登入。

如果你只是想快速抓幾則評論做初步判斷,商品頁就夠了;如果你要幾百、幾千則,就得處理驗證。

開始前你需要準備什麼:Python 環境與函式庫

在寫任何程式之前,先準備以下環境:

  • 難度: 中階(熟悉 Python、具備基本 HTML 知識)
  • 所需時間: 完整流程約 45 分鐘;基本抓取約 10 分鐘
  • 你需要: Python 3.8+、Chrome 瀏覽器、有效的 Amazon 帳號

安裝核心套件:

1pip install requests beautifulsoup4 lxml pandas textblob

選用套件(進階情緒分析用):

1pip install transformers torch

ASIN 是什麼? 它是 Amazon 的 10 碼商品識別碼。你可以在任何商品網址中找到它——例如 amazon.com/dp/B0BCNKKZ91,其中的 ASIN 就是 B0BCNKKZ91。這就是你要放進評論網址的關鍵值。

最穩定的方法,是先在瀏覽器登入 Amazon,再把你的 session cookies 複製出來,注入到 Python 的 requests.Session() 中。這樣可以避開 Selenium 式登入自動化常見的 CAPTCHA 與簡訊 2FA 問題。

你需要這 7 個 cookies:

Cookie 名稱用途
session-id會輪替的 session 識別碼
session-id-timesession 時間戳
session-token會輪替的 session token
ubid-main使用者瀏覽識別碼
at-main主要驗證 token
sess-at-main以 session 為範圍的驗證
x-main與使用者 email 綁定的識別碼

如何從 Chrome DevTools 匯出 cookies

  1. 在 Chrome 中登入 amazon.com
  2. 開啟 DevTools(F12 或右鍵 → 檢查)
  3. 前往 ApplicationStorageCookieshttps://www.amazon.com
  4. 在表格中找到每個 cookie 名稱,複製它的值
  5. 把它們整理成以分號分隔的字串,供 Python 使用

像這樣建立 session:

1import requests
2session = requests.Session()
3# 把你的 cookie 值貼在這裡
4cookies = {
5    "session-id": "YOUR_SESSION_ID",
6    "session-id-time": "YOUR_SESSION_ID_TIME",
7    "session-token": "YOUR_SESSION_TOKEN",
8    "ubid-main": "YOUR_UBID_MAIN",
9    "at-main": "YOUR_AT_MAIN",
10    "sess-at-main": "YOUR_SESS_AT_MAIN",
11    "x-main": "YOUR_X_MAIN",
12}
13headers = {
14    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36",
15    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
16    "Accept-Language": "en-US,en;q=0.5",
17}
18session.cookies.update(cookies)
19session.headers.update(headers)

重要: 所有請求都要共用同一個 session 物件。這能保持 cookie 一致,並模擬真實瀏覽器的瀏覽狀態。cookies 通常可以維持數天到數週,但如果你又開始遇到登入跳轉,就要從瀏覽器重新更新一次。

至於非 .com 的站點,cookie 名稱會有些微差異——amazon.de 會用 at-acbde 取代 at-main,amazon.co.uk 則會用 at-acbuk,依此類推。每個站點都需要各自獨立的 session。

步驟 2:建立請求,並用 BeautifulSoup 解析評論 HTML

Amazon 評論網址格式如下:

1https://www.amazon.com/product-reviews/{ASIN}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber=1

核心函式如下:

1from bs4 import BeautifulSoup
2import time, random
3def get_soup(session, url):
4    time.sleep(random.uniform(2, 5))  # 禮貌性延遲
5    response = session.get(url, timeout=15)
6    # 偵測登入牆
7    if "ap_email" in response.text or "Amazon Sign-In" in response.text:
8        raise Exception("偵測到登入牆 — 請更新你的 cookies")
9    if response.status_code != 200:
10        raise Exception(f"HTTP {response.status_code}")
11    return BeautifulSoup(response.text, "lxml")

還有一個小技巧很有用:在打開評論頁之前,先拜訪商品頁。這會讓你的 session 更像一般自然瀏覽。

1# 先拜訪商品頁(模擬真實瀏覽)
2product_url = f"https://www.amazon.com/dp/{asin}"
3session.get(product_url, timeout=15)
4time.sleep(random.uniform(1, 3))
5# 再進評論頁
6reviews_url = f"https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber=1"
7soup = get_soup(session, reviews_url)

步驟 3:用穩定選擇器擷取評論資料(別再依賴 CSS class)

這是大多數 2022–2023 教學會失敗的地方。Amazon 會混淆 CSS class 名稱——它們會週期性變動,正如某位在論壇上抱怨的開發者所說:「它們根本沒有一個穩定規律可循,連 span 標籤的 class 名稱都沒有一致模式。」

解法是:Amazon 在評論元素上使用 data-hook 屬性,而這些屬性相當穩定。它們是語意化識別碼,也是 Amazon 前端程式碼所依賴的,因此不會被隨意隨機化。

評論欄位穩定選擇器(data-hook脆弱選擇器(class)
評論內容[data-hook="review-body"].review-text-content(會變)
星等[data-hook="review-star-rating"].a-icon-alt(容易混淆)
評論標題[data-hook="review-title"].review-title(有時可用)
作者名稱span.a-profile-name相對穩定
評論日期[data-hook="review-date"].review-date(依地區而異)
已驗證購買[data-hook="avp-badge"]span.a-size-mini

以下是使用 data-hook 選擇器的擷取程式:

1import re
2def extract_reviews(soup):
3    reviews = []
4    review_divs = soup.select('[data-hook="review"]')
5    for div in review_divs:
6        # 星等
7        rating_el = div.select_one('[data-hook="review-star-rating"]')
8        rating = None
9        if rating_el:
10            rating_text = rating_el.get_text(strip=True)
11            match = re.search(r'(\d\.?\d?)', rating_text)
12            if match:
13                rating = float(match.group(1))
14        # 標題
15        title_el = div.select_one('[data-hook="review-title"]')
16        title = title_el.get_text(strip=True) if title_el else ""
17        # 內容
18        body_el = div.select_one('[data-hook="review-body"]')
19        body = body_el.get_text(strip=True) if body_el else ""
20        # 作者
21        author_el = div.select_one('span.a-profile-name')
22        author = author_el.get_text(strip=True) if author_el else ""
23        # 日期與國家
24        date_el = div.select_one('[data-hook="review-date"]')
25        date_text = date_el.get_text(strip=True) if date_el else ""
26        # 格式:"Reviewed in the United States on January 15, 2025"
27        country_match = re.search(r'Reviewed in (.+?) on', date_text)
28        date_match = re.search(r'on (.+)$', date_text)
29        country = country_match.group(1) if country_match else ""
30        date = date_match.group(1) if date_match else ""
31        # 已驗證購買
32        verified_el = div.select_one('[data-hook="avp-badge"]')
33        verified = bool(verified_el)
34        reviews.append({
35            "author": author,
36            "rating": rating,
37            "title": title,
38            "content": body,
39            "date": date,
40            "country": country,
41            "verified": verified,
42        })
43    return reviews

我已經把這組選擇器拿去對多個 ASIN 連續跑了好幾個月,data-hook 屬性一次都沒變過。反觀 CSS class,在同一段時間內至少輪替了兩次。

步驟 4:處理分頁與 Amazon 的 10 頁上限

Amazon 會把 pageNumber 參數限制在 10 頁、每頁 10 則評論——也就是每種篩選組合最多約 100 則評論。當你翻到第 10 頁後,「下一頁」按鈕就會直接消失。

基本分頁迴圈:

1all_reviews = []
2for page in range(1, 11):
3    url = f"https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber={page}"
4    soup = get_soup(session, url)
5    page_reviews = extract_reviews(soup)
6    if not page_reviews:
7        break  # 這一頁已經沒有更多評論
8    all_reviews.extend(page_reviews)
9    print(f"第 {page} 頁:{len(page_reviews)} 則評論")

如何抓到超過 10 頁的 Amazon 評論

解法是分組切桶。每一組 filterByStarsortBy 的組合,都有自己獨立的 10 頁視窗。

星等篩選值: one_startwo_starthree_starfour_starfive_star
排序值: recenthelpful(預設)

把 5 種星等篩選 × 2 種排序全部組合起來,你最多可以接觸到 100 頁、每個商品 1,000 則評論——而且對於星等分布不平均的商品,通常還能接近完整評論集合。

1star_filters = ["one_star", "two_star", "three_star", "four_star", "five_star"]
2sort_orders = ["recent", "helpful"]
3all_reviews = []
4seen_titles = set()  # 簡單去重
5for star in star_filters:
6    for sort in sort_orders:
7        for page in range(1, 11):
8            url = (
9                f"https://www.amazon.com/product-reviews/{asin}"
10                f"?filterByStar={star}&sortBy={sort}&pageNumber={page}"
11            )
12            soup = get_soup(session, url)
13            page_reviews = extract_reviews(soup)
14            if not page_reviews:
15                break
16            for review in page_reviews:
17                # 以標題 + 作者作為去重鍵
18                key = (review["title"], review["author"])
19                if key not in seen_titles:
20                    seen_titles.add(key)
21                    all_reviews.append(review)
22            print(f"[{star}/{sort}] 第 {page} 頁:{len(page_reviews)} 則評論")
23print(f"總共唯一評論數:{len(all_reviews)}")

不同桶之間會有重疊,所以去重很重要。我會用評論標題 + 作者名稱組合成一個快速鍵值——雖然不是完美,但足以抓出大多數重複資料。

步驟 5:閃避反機器人防禦(輪替、限速、重試)

Amazon 使用 AWS WAF Bot Control,而且近年明顯更積極了。只靠單一層防護(例如只換 User-Agent、只加延遲)已經不夠。

技術實作方式
輪替 User-Agent從 10+ 種真實瀏覽器字串中隨機選擇
指數退避遇到 503 時,重試間隔為 2s → 4s → 8s
請求限速每頁之間加入 random.uniform(2, 5) 秒延遲
代理輪替透過住宅代理循環切換
Session 指紋每個 session 維持一致的 cookies + headers
TLS 仿真生產環境建議改用 curl_cffi,不要只用原生 requests

適合正式環境的重試包裝器:

1import time, random
2USER_AGENTS = [
3    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.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/147.0.0.0 Safari/537.36",
5    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0",
6    "Mozilla/5.0 (Macintosh; Intel Mac OS X 15_7_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15",
7    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
8]
9def scrape_with_retries(session, url, max_retries=3):
10    for attempt in range(max_retries):
11        try:
12            session.headers["User-Agent"] = random.choice(USER_AGENTS)
13            time.sleep(random.uniform(2, 5))
14            response = session.get(url, timeout=15)
15            # 偵測封鎖
16            if "validateCaptcha" in response.url or "Robot Check" in response.text:
17                wait = (2 ** attempt) * 5
18                print(f"偵測到 CAPTCHA。等待 {wait} 秒...")
19                time.sleep(wait)
20                continue
21            if response.status_code in (429, 503):
22                wait = (2 ** attempt) * 2
23                print(f"觸發速率限制({response.status_code})。等待 {wait} 秒...")
24                time.sleep(wait)
25                continue
26            if "ap_email" in response.text:
27                raise Exception("登入牆 — cookies 已失效")
28            return BeautifulSoup(response.text, "lxml")
29        except Exception as e:
30            if attempt == max_retries - 1:
31                raise
32            print(f"第 {attempt + 1} 次嘗試失敗:{e}")
33    return None

關於代理:Amazon (像是 AWS、GCP、Azure、DigitalOcean)。如果你要抓超過幾百頁,住宅代理幾乎是必需的——費用大概每月 50–200 美元以上,視流量而定。若只是小型專案(每天少於 100 次請求),從家用 IP 謹慎限速通常就夠用。

Amazon 也會檢查 TLS 指紋。Python 原生 requests 套件有一個 。若是正式爬蟲,建議考慮 curl_cffi,它可以模擬真實瀏覽器的 TLS 堆疊。若只是教學規模(幾百頁),requests 搭配良好 headers 通常就能完成任務。

步驟 6:把抓到的 Amazon 評論匯出成 CSV 或 Excel

當你收集完評論後,用 pandas 匯出成可使用格式其實很簡單:

1import pandas as pd
2df = pd.DataFrame(all_reviews)
3df.to_csv("amazon_reviews.csv", index=False)
4print(f"已匯出 {len(df)} 則評論到 amazon_reviews.csv")

範例輸出:

authorratingtitlecontentdatecountryverified
Sarah M.5.0今年最值得的購買電池可以撐整天,螢幕非常漂亮...January 15, 2025the United StatesTrue
Mike T.2.0兩週後就失望了充電孔壞掉了...February 3, 2025the United StatesTrue
Priya K.4.0以這個價格來說很划算我需要的功能它都有,重度使用時會稍微卡一下...March 10, 2025the United StatesFalse

若要匯出 Excel:df.to_excel("amazon_reviews.xlsx", index=False)(需要 openpyxl)。

若要匯入 Google Sheets,gspread 雖然可行,但需要 ——建立專案、啟用兩個 API、產生服務帳戶憑證、分享試算表。如果你覺得這些設定比實際抓資料還多,那你沒有看錯。(這也是像 這類可一鍵匯出到 Google Sheets 的工具,開始讓人覺得很香的原因之一。)

加碼:用 5 行 Python 為評論加入情緒分析

多數爬蟲教學只做到 CSV 匯出就結束了。但真正能把原始資料變成商業決策的,是情緒分數。

最快的基礎做法是用 TextBlob:

1from textblob import TextBlob
2df["sentiment"] = df["content"].apply(lambda x: TextBlob(str(x)).sentiment.polarity)

這會替每則評論產生 -1.0(非常負面)到 +1.0(非常正面)的極性分數。範例輸出:

content(截斷)ratingsentiment
"電池可以撐整天,螢幕非常漂亮..."5.00.65
"充電孔壞掉了..."2.0-0.40
"我需要的功能它都有,重度使用時..."4.00.25
"爛透了,立刻退貨。"1.0-0.75
"還可以,沒什麼特別但能用。"3.00.10

最值得注意的是那些不一致的資料列——例如 3 星評論卻是正向措辭,或 5 星評論卻帶有負面語氣。這些落差往往能揭露星等分數看不出來的細膩顧客觀點。

ai-review-analysis.webp

若要達到可用於正式環境的準確度,建議使用 Hugging Face Transformers。,而且 ,明顯優於傳統詞典式工具。nlptown/bert-base-multilingual-uncased-sentiment 模型甚至可以直接預測 1–5 星評分:

1from transformers import pipeline
2clf = pipeline("sentiment-analysis",
3               model="nlptown/bert-base-multilingual-uncased-sentiment")
4df["predicted_stars"] = df["content"].apply(
5    lambda x: int(clf(str(x)[:512])[0]["label"][0])
6)

Amazon 評論呈現 ——5 星會出現明顯高峰,1 星也會有一個較小高峰,中間則是低谷。這代表平均星等往往不是判斷實際產品品質的好指標。把 1 星群組拆出來,去找重複主題——通常那裡藏著一個可修正的單一缺陷。

誠實的取捨:DIY Python vs. 付費爬蟲 API vs. Thunderbit

我長期維護過 Amazon 的 Python 爬蟲,所以老實說:它們會壞。選擇器會變、cookies 會過期、Amazon 會推出新的反機器人防護層,然後你的星期六早上就變成在修爬蟲,而不是分析資料。論壇上的使用者也常抱怨同樣的事——那些「上個月還能跑」的 DIY 腳本,現在卻需要不停補丁。

以下是三種主要方式的比較:

比較項目DIY Python(BS4/Selenium)付費爬蟲 APIThunderbit(無程式碼)
設定時間1–3 小時30 分鐘(API 金鑰)2 分鐘
成本免費(+ 代理成本)每月 50–200 美元以上有免費方案
登入牆處理手動管理 cookies通常已處理自動處理
維護成本高(選擇器易壞)低(由供應商維護)幾乎零維護(AI 自適應)
分頁處理需自行撰寫程式內建內建
多國站支援每個網域各自 session通常支援基於瀏覽器=依你的地區
情緒分析需自行加程式有時內建匯出到 Sheets,任你分析
最適合學習、完全掌控大規模/正式流程快速拉資料、非工程團隊

Python 給你完整掌控,而且確實是理解網頁爬蟲底層運作的最佳方式。但如果你的需求是「週五前我要把競品評論資料放進試算表」,而不是「我要打造一條正式資料管線」,那維護自製爬蟲的成本可能就不太划算。

能在幾次點擊內處理驗證、選擇器、分頁與匯出——你可以試試 ,看看是否符合你的工作流程。隨著 Amazon 持續加強反機器人措施,能即時調整的 AI 工具,會越來越從「加分項」變成「必需品」。

你也可以瀏覽我們的 ,觀看各種爬取流程的影片教學。

常見問題

1. 不登入也能抓 Amazon 評論嗎?

可以,但只能抓到商品詳情頁(/dp/{ASIN}/)上顯示的約 8 則「精選評論」。完整評論頁的排序、篩選與分頁功能,自 2024 年底起都需要驗證。對大多數商業應用來說,你還是得處理登入牆。

2. 抓 Amazon 評論合法嗎?

Amazon 的服務條款禁止自動化抓取。不過,近年的美國判例(Meta v. Bright Data,2024;hiQ v. LinkedIn)支持抓取公開可見資料。若是登入後才看得到的內容,法律風險會更高,因為你已經同意了 Amazon 的條款。商業用途請諮詢法律顧問。

3. 每個商品最多能抓多少則 Amazon 評論?

Amazon 將每個排序與星等篩選組合的評論頁限制為 10 頁。若使用 5 種星等篩選 × 2 種排序,最多可接觸到 100 頁(約 1,000 則評論)/ 每個商品。若再加上關鍵字篩選,理論上上限更高,但重複資料會明顯增加。

4. 抓 Amazon 評論最好的 Python 函式庫是什麼?

requests + BeautifulSoup 是最常見也最穩定的組合,適合解析靜態 HTML。若需要 JavaScript 渲染,Selenium 會更有用。若想要免寫程式、又能自動處理登入牆與分頁,可以試試

5. 抓 Amazon 時怎麼避免被封鎖?

從 10+ 種真實瀏覽器的 User-Agent 字串中輪替、每次請求之間加入 2–5 秒隨機延遲、在 503/429 錯誤時使用指數退避、規模化時改用住宅代理(資料中心 IP 通常會先被封)、並在各次請求中維持一致的 session cookies。若想完全免維護,Thunderbit 會透過你的瀏覽器 session 自動處理反機器人防護。

延伸閱讀

Fawad Khan
Fawad Khan
Fawad writes for a living, and honestly, he kind of loves it. He's spent years figuring out what makes a line of copy stick — and what makes readers scroll past. Ask him about marketing, and he'll talk for hours. Ask him about carbonara, and he'll talk longer.
目錄

試試 Thunderbit

只要 2 次點擊,就能抓取潛在客戶與其他資料。AI 驅動。

取得 Thunderbit 免費使用
用 AI 擷取資料
輕鬆將資料轉移到 Google Sheets、Airtable 或 Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week