PythonでAmazon商品をスクレイピングする方法を学ぶ

最終更新日 April 16, 2026

Amazonのスクレイピング解説を見て試したのに、CAPTCHAや503エラー、あるいは何も取れない空振り結果にぶつかったことはありませんか? そんな経験があるなら、あなたももう“あるある”側です。ネット上にあるPythonでのAmazonスクレイピング記事の多くは2022年か2023年に書かれたもので、Amazon側ですでに対策済みのセレクターや手法を使っています。

Thunderbitでデータ抽出ツールを長年作ってきた立場から、現場で断言できることがあります。Amazonは、安定してスクレイピングするのが最も難しいサイトのひとつです。HTML構造はしょっちゅう変わり、6層のボット対策を備え、A/Bテストによってユーザーごとに別レイアウトを出し分けることもあります。このガイドでは、2025年でも実際に動くPython版Amazonスクレイパーを、検証済みのCSSセレクター、段階的なブロック回避戦略、そして多くの解説記事が省いているスケジューリングやエクスポート方法まで含めて紹介します。さらに、Pythonをいじらずにデータだけ欲しい人向けに、でほぼ2クリックで同じことを実現する方法もお見せします。

Amazonの商品スクレイピングとは?

Amazonの商品スクレイピングとは、商品名、価格、評価、レビュー数、画像、在庫状況など、公開されている情報をプログラムで抽出することです。対象はAmazonの商品ページや検索結果ページです。何百件もの一覧を手作業でコピペする代わりに、スクレイパーが各ページを巡回し、HTMLを読み取り、指定したデータをCSV、Excel、データベースのような構造化形式で取り出します。

イメージとしては、朝のコーヒーを飲み終える間に1,000商品ページを見て回ってくれる、疲れ知らずのインターンを雇うようなものです。しかも誤字はゼロ、昼休憩も不要です。

なぜPythonでAmazon商品をスクレイピングするのか?

Amazonには30以上のカテゴリにまたがる約があり、約によって支えられています。現在、総GMVの69%はサードパーティ販売者が占めています。そんな膨大なカタログを人力で少しでも継続監視するのは不可能です。チームがAmazonをスクレイピングする理由は以下の通りです。

ユースケース恩恵を受ける人抽出する情報
価格監視・価格改定EC運用担当、マーケットプレイス出品者価格、在庫、販売者情報
競合分析プロダクトマネージャー、ブランド担当商品機能、評価、レビュー数
市場調査アナリスト、新商品企画チームカテゴリ動向、価格分布
リード獲得営業チーム販売者名、ブランド情報、連絡先データ
アフィリエイト運用コンテンツ制作者、特価情報サイト価格、セール情報、商品詳細
在庫追跡サプライチェーン、購買担当在庫状況、配送見込み

Amazonの価格変動の激しさだけでも自動化は必須です。Amazonは1日にしており、平均すると商品価格は約10分ごとに更新されています。一方、Best BuyやWalmartの価格変更は月あたり約5万回程度です。人の手では到底追いつきません。

amazon-product-price-monitor-dashboard.webp

Pythonなら、何を抽出するか、エラー時にどう処理するか、どこに保存するかをすべて自分で決められます。ただしそのぶん、保守、ブロック対策、頻繁に変わるAmazonのHTMLへの追従も自分の責任になります。

Amazonから何をスクレイピングできて、何を避けるべきか

公開されている商品ページからは、通常次の情報を取得できます。

  • 商品タイトル(商品名、ブランド)
  • 価格(現在価格、元値、セール価格)
  • 評価(星の平均)
  • レビュー数
  • 商品画像(メイン画像URL)
  • 在庫状況
  • ASIN(Amazon Standard Identification Number)
  • 商品説明・箇条書き
  • 販売者情報
  • バリエーション(サイズ、色など)

避けるべきものは以下です。

  • ログインの裏側にあるデータ: 詳細レビュー、個人アカウント情報、注文履歴
  • 個人情報: 購入者名、住所、支払い情報
  • 再配布前提の著作物: 商品説明や画像は分析用途なら問題ありませんが、自分のコンテンツとして再掲載しないでください

Amazonのは、GPTBot、Scrapy、ClaudeBotを含む50以上の既知ボットをブロックし、アカウント、カート、ほしい物リストなどのパスも禁止しています。商品詳細ページ自体は明示的に禁止されていませんが、Amazonの利用規約では自動アクセスが禁じられています。裁判所は一般に、利用規約違反(民事)とCFAA違反(刑事)を区別しています。合法性については、このガイドの最後でもう少し詳しく触れます。

必要なツールとライブラリ

このチュートリアルで使うPythonスタックは以下です。

ライブラリ用途採用理由
requestsHTTPリクエストシンプルで広く使われている
beautifulsoup4HTML解析CSSセレクターで抽出しやすい
lxml高速HTMLパーサーBeautifulSoupのパーサーバックエンドとして使用
curl_cffiTLSフィンガープリントの偽装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!」と表示されれば準備完了です。

laptop-coding-workspace.webp

なぜ多くのAmazonスクレイピング解説は壊れるのか(そしてこのガイドが違う理由)

ここは多くのガイドが飛ばす部分で、たぶんあなたがこの記事を読んでいる理由そのものです。

AmazonはHTML構造、クラス名、要素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ページで検証済みです。2022年のコピペではなく、実際に期待できる出力と一緒に、使うべきCSSセレクターを示します。

始める前に

  • 難易度: 中級(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ステータスコード か、「Amazonデータへの自動アクセスについては…」というメッセージが入ったページが返ってきます。これは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が取得できたので、検証済みの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は、https://www.amazon.com/dp/{ASIN} というきれいな商品URLに対応します。セッション固有のパラメータが入りやすい検索結果URLより、こちらのほうが安定です。

ステップ5: ページ送りに対応して大量スクレイピングする

では、検索収集と商品詳細ページのスクレイピングを1本のパイプラインにまとめましょう。

1import pandas as pd
2def scrape_product(asin):
3    """Amazonの商品詳細ページを1件スクレイピングする。"""
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")

これで、ASIN、タイトル、価格、評価、レビュー、在庫状況、画像URL、商品URLを含むきれいなCSVができるはずです。多くのチュートリアルはここで終わりますが、実務で使うならCSVは始まりにすぎません。

ブロック回避の深掘り: スクレイパーを止めずに動かす方法

Amazonの商品スクレイピングに挑戦する人にとって、ブロックはです。Amazonの6層防御には、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    """失敗時に指数バックオフで再取得する。"""
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秒… と伸びますが、上限を超えません。ランダムジッターは、再試行パターンを機械的に見せないために必要です。

JavaScript描画コンテンツ向けに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

これは遅く、curl_cffi なら1秒未満のところが、1ページあたり3〜5秒かかります。必要なときだけ使ってください。

私の経験では、curl_cffi だけでAmazonの商品ページの90%以上はブラウザなしで処理できます。

ブロック対策まとめ

手法難易度効果多くのチュートリアルで触れられているか
カスタム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の出力スクリプトを保守したくないなら、はGoogle Sheets、Airtable、Notion、Excel、CSV、JSONへの無料出力に対応しています。AirtableやNotionでそのまま表示できる画像フィールドも含められます。gspread の初期設定も、API認証情報も、コードも不要です。既存ツールへそのまま流し込みたいチームにとっては、大きな時短になります。

Amazonの自動スクレイピングをスケジュール実行する — 抜けている章

価格監視や在庫追跡には、1回きりではなく定期的なスクレイピングが必要です。ところが、スケジューリングまで扱っている競合記事はひとつも見つかりませんでした。ここでは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 Task Scheduler

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:00
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を追加して「Schedule」を押すだけです。ターミナルも、YAMLファイルも、デプロイ作業も不要です。継続的な価格監視や在庫監視を行うECチームには特に便利です。

Python自作 vs スクレイパーAPI vs ノーコード: どれを選ぶべき?

これはフォーラムで何度も見かける質問ですが、上位記事の多くは体系立てた答えを出していません。そこで率直に整理します。

比較項目Python + BS4/curl_cffiスクレイパーAPI(ScraperAPI, Oxylabs)ノーコード(Thunderbit)
準備時間30〜60分10〜20分約2分
コーディングの必要性あり(Python)あり(API呼び出し)なし
ブロック対策内蔵なし(自前対応)ありあり
JS描画対応Selenium/Playwrightが必要提供元によるあり(ブラウザまたはクラウドモード)
スケジューリング自前(cron/クラウド)一部提供標準搭載
コスト無料 + プロキシ費用月30〜100ドル以上無料枠あり
保守高い(セレクターが壊れる)低いほぼ不要(AIが適応)
向いている人フルコントロールしたい開発者大量処理の拡張性と安定性が必要な人速度重視、非開発者、ビジネスユーザー

Pythonは、学びたい、自分で細かく調整したい、継続保守も苦にならない人に向いています。スクレイパーAPIはブロック対策を肩代わりしてくれますが、それでもコードは必要です。Thunderbitは、営業、EC運用、あるいはデータが欲しいだけの人にとって最速の方法です。セレクターも、コードも、AmazonのHTML変更に伴う保守もいりません。

ThunderbitがAmazon商品を2クリックでスクレイピングする方法

もちろん少し贔屓目はあります。私たちのチームがこれを作ったからです。でも、実際の流れは本当にシンプルです。

  1. をインストール
  2. Amazonの検索結果ページまたは商品ページを開く
  3. 「AIで項目を提案」 をクリック(または即時Amazonスクレイパーテンプレートを使う)
  4. 「スクレイプ」 をクリック

ThunderbitのAIがページを読み取り、データ構造を判別し、きれいな表に整えます。Excel、Google Sheets、Airtable、Notionへは無料でエクスポートできます。大きな利点は、来週AmazonのHTMLが変わっても(たいてい変わりますが)、ThunderbitのAIが自動で対応することです。壊れたスクリプトも、セレクター更新も不要です。

商品リストに詳細ページの情報を追加したい場合、Thunderbitのサブページスクレイピング機能を使えば、商品ページへのリンクを自動で辿り、画像、説明文、バリエーションなどを追加取得できます。これは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の利用規約は自動アクセスを禁じています。 これは民事上の契約違反であり、刑事事件ではありません。裁判所は一般にこの2つを区別しています。
  • Amazon v. Perplexity(2025年) は、AmazonページのAIスクレイピングをめぐる進行中の案件です。2026年3月には仮差止命令が出されました。今後の動きに注目です。
  • 公開ページに限定する。 ログイン保護されたコンテンツ、個人データ、認証の裏側にある情報はスクレイピングしないでください。
  • レート制限を守る。 Amazonのサーバーに負荷をかけすぎないように。リクエスト間を2〜5秒空けるのは妥当です。
  • データは責任を持って使う。 著作物の再配布ではなく、分析目的で利用してください。
  • 大規模な商用利用では法務に相談する。 特にEUではGDPRが個人データに適用されます。

より詳しくは、 のガイドをご覧ください。

まとめ

これで、2025年版の検証済みセレクター、User-Agent を足すだけでは終わらない多層的なブロック対策、継続監視のための実用的なスケジューリング、そしてGoogle Sheets、データベース、普段使っているツールへデータを流し込むエクスポート方法まで備えた、動作するPython版Amazonスクレイパーが手に入りました。

要点をまとめると:

  • Python + curl_cffi + BeautifulSoup なら、TLS偽装と組み合わせて約94%の成功率を狙えます
  • ブロック対策は多層で考える: ヘッダーローテーション、TLS偽装、プロキシローテーション、レート制限、指数バックオフが必要です
  • スケジューリング によって、単発スクリプトを継続監視パイプラインへ変えられます(cron、GitHub Actions、Thunderbit内蔵スケジューラなど)
  • CSVの先へ出力する — Google Sheets、SQLite、Airtable、Notion — そこにこそ本当の業務価値があります
  • Thunderbit は、開発者でない人や、セレクターのデバッグより分析に時間を使いたい人向けの2クリック代替手段です

このままコードを試したいなら、このガイドの内容はすべてコピペで実行できる状態です。もしコードを一切書かずに済ませたいなら、で、Amazonに対するノーコード手法をすぐ試せます。

さらに詳しく知りたい方は、 もご覧ください。 では、手順を追った解説動画も公開しています。

Happy scraping — そして、次回のAmazonアップデートまでセレクターが生き残りますように。

よくある質問

1. なぜPythonのAmazonスクレイパーは、数回のリクエストでブロックされるのですか?

Amazonは6層の防御を使っています。IPレピュテーション分析、TLSフィンガープリント(JA3/JA4)、ブラウザ環境の検知、行動バイオメトリクス、CAPTCHAチャレンジ、機械学習による異常検知です。User-Agentヘッダーだけの基本的な requests スクリプトでは、成功率は にとどまります。安定してアクセスするには、TLS偽装(curl_cffi)、フルヘッダーローテーション、プロキシローテーション、ランダムなジッター付きのレート制限が必要です。

2. 2025年にAmazon商品をスクレイピングするのに最適なPythonライブラリは何ですか?

最大の改善効果があるのは、TLS偽装付きHTTPリクエストの curl_cffi、HTML解析の BeautifulSoup4 + lxml、データ整形と出力の pandas、そしてJavaScript描画コンテンツのフォールバックとしての Selenium または Playwright です。スクレイピング開発者の がPythonを使っています。

3. Amazonの商品データをスクレイピングするのは合法ですか?

公開データのスクレイピングは、hiQ v. LinkedIn や Meta v. Bright Data のような判例を踏まえると、米国では一般に合法です。Amazonの利用規約は自動アクセスを禁じていますが、裁判所は利用規約違反(民事)と刑事違反を区別しています。ログイン保護された内容は避け、レート制限を守り、大規模な商用利用では法務に相談してください。

4. コードを書かずにAmazonをスクレイピングできますか?

はい。 のようなツールを使えば、Chrome拡張機能でAmazon商品を2クリックでスクレイピングできます。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