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

最終更新日 June 3, 2026
PythonでAmazon商品をスクレイピングする方法を学ぶ

ネットで見つけたAmazonスクレイピングの手順を、その通りに動かしてみる。返ってきたのはCAPTCHA、503エラー、あるいは中身が空っぽの結果——。もし身に覚えがあるなら、あなたは決して特別ではありません。Python版のAmazonスクレイピング記事は2022年や2023年に書かれたものが大半で、そこで使われているセレクターや手口は、Amazonがとうに塞いでしまったものばかりだからです。

長年Thunderbitでデータ抽出ツールを開発してきて、現場の実感として言い切れることがあります。Amazonは、安定スクレイピングの難易度がトップクラスのサイトだ、ということです。HTML構造はころころ姿を変え、ボット対策は6層構え。さらにA/Bテストで、ユーザーごとに別レイアウトを出し分けてくることさえあります。本ガイドが扱うのは、2025年の今でも実際に動くPython版Amazonスクレイパーです。検証済みのCSSセレクター、段階を踏んだブロック回避戦略、そして多くの解説がなぜか素通りするスケジューリングやエクスポートまで、ひと通り押さえます。加えて、Pythonには触れずデータだけ欲しいという人のために、Thunderbitで同じことをほぼ2クリックで片付ける道もお見せします。

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

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

イメージしやすく言えば、朝のコーヒーを飲み干すあいだに1,000ページ分の商品を見て回ってくれる、疲れを知らないインターンを雇うようなもの。しかもタイプミスはゼロ、昼休みも要りません。

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

Amazonのカタログは、30を超えるカテゴリにまたがる約3.5億〜6億件の商品で構成され、それを約970万の販売者アカウントが下支えしています。総GMVに占めるサードパーティ販売者の割合は、いまや69%。これほどの規模を、ほんの一部であれ人力で追い続けるのは、現実的に不可能です。チームがAmazonをスクレイピングする動機は、たとえば次のとおりです。

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

そもそも価格の動きの激しさだけで、自動化は避けられません。Amazonの価格更新は1日に250万回超、平均すれば1商品あたり約10分に1回というペースで書き換わっている計算です。対するBest BuyやWalmartは、月あたり約5万回程度。この差を人の手で追いかけるのは、はなから無理筋なんです。

amazon-product-price-monitor-dashboard.webp

Pythonの強みは、自由度の高さにあります。何を抜き出し、エラーをどう処理し、どこへ保存するか——その一つひとつを自分の判断で決められる。ただしその裏返しとして、保守も、ブロック対策も、しょっちゅう変わるAmazonのHTMLへの追従も、すべて自分の責任になります。

Amazonから何が取れて、何を避けるべきか

公開された商品ページから、通常取得できるのは以下のような情報です。

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

反対に、手を出すべきでないものはこちらです。

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

ちなみにAmazonのrobots.txtは、GPTBot、Scrapy、ClaudeBotを含む50を超える既知ボットを締め出し、アカウントやカート、ほしい物リストといったパスも禁じています。商品詳細ページそのものは明示的に禁止されてはいないものの、Amazonの利用規約は自動アクセスを認めていません。なお、裁判所は一般に利用規約違反(民事)とCFAA違反(刑事)を別物として扱います。合法性の話は、ガイドの終盤でもう少し掘り下げます。

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

このチュートリアルが土台にするPythonスタックは、次のとおりです。

ライブラリ用途採用理由
requestsHTTPリクエストシンプルで広く使われている
beautifulsoup4HTML解析CSSセレクターで抽出しやすい
lxml高速HTMLパーサーBeautifulSoupのパーサーバックエンドとして使用
curl_cffiTLSフィンガープリントの偽装Amazonの検知回避に重要
pandasデータ整形・出力DataFrame、CSV/Excel出力

任意(JavaScriptで描画されるコンテンツ向け):

  • selenium または playwright — ヘッドレスブラウザ自動化

Python環境の準備

ターミナルを立ち上げ、次を順に流します。

mkdir amazon-scraper && cd amazon-scraper
python -m venv venv
source venv/bin/activate  # Windowsでは: venv\Scripts\activate
pip install requests beautifulsoup4 lxml curl_cffi pandas

ちゃんと入ったかどうか、ここで確かめておきましょう。

import requests, bs4, curl_cffi, pandas
print("All good!")

エラーを吐かずに「All good!」と表示されれば、下準備は完了です。

laptop-coding-workspace.webp

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

多くのガイドが避けて通る部分であり、おそらくあなたがこの記事までたどり着いた理由そのものが、ここにあります。

AmazonはHTML構造もクラス名も要素IDも、しょっちゅう手を入れます。スクレイピング業界の報告では、DOMの変更や指紋対策の更新を受けて、毎週10〜15%のクローラーが修正を迫られているとされます。語り草になっている犠牲者が#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ページの確認用)、ターミナル、そしてノーコード手法と比較したい場合はThunderbit Chrome拡張機能

ステップ1: Amazonに最初のリクエストを送る

ブラウザで適当なAmazon商品ページを開き、そのURLを控えておきます。出発点は、いちばん素朴なrequests.get()です。

import requests

url = "https://www.amazon.com/dp/B0DGNFM9YJ"
response = requests.get(url)
print(response.status_code)
print(response.text[:500])

これを走らせると、まず間違いなく 503ステータスコード が返ってくるか、「Amazonデータへの自動アクセスについては…」という一文の入ったページが表示されます。理由は、AmazonのWAF(Web Application Firewall)がPythonスクリプトの気配を察知しているから。適切なヘッダーを欠いた素のrequests.get()では、Amazon相手の成功率はたった約2%にとどまります。

503とブロックページのHTMLが返るはずですが、これは想定どおりの展開。手当ては次のステップで打ちます。

ステップ2: カスタムヘッダーとTLS偽装を設定する

User-Agentを一つ足すだけでは、もはや歯が立ちません。AmazonはHTTPヘッダーとTLSフィンガープリントを照合してくるからです。いくらChrome 120を名乗ったところで、TLSハンドシェイクの段階でPythonのrequestsが顔を出した瞬間、即座に正体を見破られます

2025年の今、もっとも信頼に足るのは、ブラウザ偽装つきのcurl_cffiを使う方法です。

from curl_cffi import requests as cfreq

headers = {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Referer": "https://www.google.com/",
    "DNT": "1",
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1",
}

url = "https://www.amazon.com/dp/B0DGNFM9YJ"
response = cfreq.get(url, headers=headers, impersonate="chrome124")
print(response.status_code)
print(len(response.text))

curl_cffiでChrome 124になりすますと、成功率は約94%まで跳ね上がります。素のrequestsと比べれば、実に47倍の改善。これで200ステータスコードと、相応に長いHTMLレスポンス(10万文字超)が手に入るはずです。

それでも503が出続けるなら、impersonateの値を差し替える("chrome131"など)か、少し時間を置いてから再挑戦してみてください。

ステップ3: HTMLを解析して商品情報を抽出する

HTMLさえ手元に届けば、あとは検証済みの2025年版セレクターでデータを抜き出すだけです。

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, "lxml")

# 商品タイトル
title_el = soup.select_one("span#productTitle")
title = title_el.get_text(strip=True) if title_el else None

# 価格
price_el = soup.select_one(
    "div#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen"
)
if not price_el:
    price_el = soup.select_one("span.priceToPay .a-offscreen")
if not price_el:
    price_el = soup.select_one(".apexPriceToPay .a-offscreen")
price = price_el.get_text(strip=True) if price_el else None

# 評価
rating_el = soup.select_one("#acrPopover span.a-icon-alt")
rating = rating_el.get_text(strip=True) if rating_el else None

# レビュー数
reviews_el = soup.select_one("span#acrCustomerReviewText")
reviews = reviews_el.get_text(strip=True) if reviews_el else None

# 在庫状況
avail_el = soup.select_one("div#availability span")
availability = avail_el.get_text(strip=True) if avail_el else None

# メイン画像URL
img_el = soup.select_one("#landingImage")
image_url = img_el.get("src") if img_el else None

print(f"Title: {title}")
print(f"Price: {price}")
print(f"Rating: {rating}")
print(f"Reviews: {reviews}")
print(f"Availability: {availability}")
print(f"Image: {image_url}")

出力例:

Title: Apple AirPods Pro (2nd Generation) with USB-C
Price: $189.99
Rating: 4.7 out of 5 stars
Reviews: 98,432 ratings
Availability: In Stock
Image: https://m.media-amazon.com/images/I/61SUj2...

価格に複数のフォールバックセレクターを当てている点は、ぜひ覚えておいてください。Amazonは商品タイプ、セール状況、A/Bテストの違いに応じてコンテナを取り替えます。抽出を一つひとつ条件分岐で包んでおけば、セレクターが空振りしたときにスクレイパーごと落ちる事態を防げるんです。

ステップ4: 検索結果から複数商品をスクレイピングする

実用に耐えるデータセットを組むなら、まずAmazonの検索結果ページでASINを集め、続いて各商品の詳細ページを当たっていく——この二段構えになります。

import time
import random

def get_search_asins(keyword, max_pages=1):
    """Amazon検索結果からASINを収集する。"""
    asins = []
    for page in range(1, max_pages + 1):
        search_url = f"https://www.amazon.com/s?k={keyword}&page={page}"
        resp = cfreq.get(search_url, headers=headers, impersonate="chrome124")
        if resp.status_code != 200:
            print(f"Search page {page} returned {resp.status_code}")
            break

        search_soup = BeautifulSoup(resp.text, "lxml")
        results = search_soup.select('div[data-component-type="s-search-result"]')

        for r in results:
            asin = r.get("data-asin")
            if asin:
                asins.append(asin)

        print(f"Page {page}: found {len(results)} products")
        time.sleep(random.uniform(2, 5))  # 丁寧な間隔

    return asins

asins = get_search_asins("wireless+earbuds", max_pages=2)
print(f"Collected {len(asins)} ASINs")

各ASINは、https://www.amazon.com/dp/{ASIN}という素直な商品URLに対応します。セッション固有のパラメータが紛れ込みがちな検索結果URLより、こちらのほうが断然安定します。

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

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

import pandas as pd

def scrape_product(asin):
    """Amazonの商品詳細ページを1件スクレイピングする。"""
    url = f"https://www.amazon.com/dp/{asin}"
    try:
        resp = cfreq.get(url, headers=headers, impersonate="chrome124")
        if resp.status_code != 200:
            return None

        soup = BeautifulSoup(resp.text, "lxml")

        title_el = soup.select_one("span#productTitle")
        price_el = (
            soup.select_one("div#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen")
            or soup.select_one("span.priceToPay .a-offscreen")
            or soup.select_one(".apexPriceToPay .a-offscreen")
        )
        rating_el = soup.select_one("#acrPopover span.a-icon-alt")
        reviews_el = soup.select_one("span#acrCustomerReviewText")
        avail_el = soup.select_one("div#availability span")
        img_el = soup.select_one("#landingImage")

        return {
            "asin": asin,
            "title": title_el.get_text(strip=True) if title_el else None,
            "price": price_el.get_text(strip=True) if price_el else None,
            "rating": rating_el.get_text(strip=True) if rating_el else None,
            "reviews": reviews_el.get_text(strip=True) if reviews_el else None,
            "availability": avail_el.get_text(strip=True) if avail_el else None,
            "image_url": img_el.get("src") if img_el else None,
            "url": url,
        }
    except Exception as e:
        print(f"Error scraping {asin}: {e}")
        return None

# 収集したASINをすべてスクレイプ
products = []
for i, asin in enumerate(asins):
    print(f"Scraping {i+1}/{len(asins)}: {asin}")
    product = scrape_product(asin)
    if product:
        products.append(product)
    time.sleep(random.uniform(2, 5))  # リクエスト間にランダムな待機

df = pd.DataFrame(products)
print(f"\nScraped {len(df)} products successfully")
print(df.head())

2〜5秒のランダム遅延は、おろそかにできません。毎回きっかり3秒、といった機械じみた等間隔は、Amazonの行動分析にかかればすぐ怪しまれます。間隔をばらつかせることで、生身の人間がページを眺めているような動きを演出できるわけです。

ステップ6: スクレイピングしたAmazonデータをCSVに保存する

df.to_csv("amazon_products.csv", index=False, encoding="utf-8-sig")
print("Saved to amazon_products.csv")

これで、ASIN、タイトル、価格、評価、レビュー、在庫状況、画像URL、商品URLが揃ったきれいなCSVができあがります。多くのチュートリアルはここで筆を置きますが、実務に持ち込むなら、CSVはむしろスタートラインにすぎません。

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

Amazonの商品スクレイピングに挑む人にとって、最大の頭痛の種はやはりブロックです。Amazonの6層防御を構成するのは、IPレピュテーション分析、TLSフィンガープリント、ブラウザ環境チェック、行動バイオメトリクス、CAPTCHA、そして機械学習ベースの異常検知。それぞれに手を打つための段階的な戦略を、以下に並べていきます。

User-Agentと各種ヘッダーをローテーションする

固定のUser-Agentは、あっという間に底が割れます。最新のブラウザ文字列をいくつか用意して、回しながら使いましょう。

import random

USER_AGENTS = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
    "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",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
    "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",
]

def get_headers():
    return {
        "User-Agent": random.choice(USER_AGENTS),
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.9",
        "Accept-Encoding": "gzip, deflate, br",
        "Referer": "https://www.google.com/",
        "DNT": "1",
        "Connection": "keep-alive",
    }

つい抜けがちなのが、Accept-LanguageをIPアドレスの示す地域と揃える、というポイント。ドイツのIPからAccept-Language: en-USを送るのは、どう見ても不自然ですよね。

curl_cffiでTLSフィンガープリントを偽装する

ステップ2で一度触れましたが、ここが何より肝心。成功率をいちばん大きく引き上げてくれるのが、この手法だからです。通常のPython requestsではAmazon相手の成功率が約2%なのに対し、curl_cffiの偽装を噛ませれば約94%まで届く。動くスクレイパーと壊れたスクレイパーの分かれ目は、まさにこの一点にあります。

from curl_cffi import requests as cfreq

# 偽装先もローテーションする
BROWSERS = ["chrome120", "chrome124", "chrome131"]

response = cfreq.get(
    url,
    headers=get_headers(),
    impersonate=random.choice(BROWSERS),
)

プロキシをローテーションする

数ページを超えてスクレイピングするなら、プロキシのローテーションは避けて通れません。AmazonはIPアドレスを逐一追っていて、リクエストが集中しすぎた単一IPはブロックしてくるからです。

PROXIES = [
    "http://user:pass@proxy1.example.com:8080",
    "http://user:pass@proxy2.example.com:8080",
    "http://user:pass@proxy3.example.com:8080",
]

proxy = random.choice(PROXIES)
response = cfreq.get(
    url,
    headers=get_headers(),
    impersonate="chrome124",
    proxies={"http": proxy, "https": proxy},
)

効き目という点では、データセンター系よりも住宅回線プロキシに軍配が上がります(AmazonはデータセンターIP帯を先回りして潰しにかかることが多いため)。難点はコストが高めなこと。小さな案件なら、まずは有料プロキシサービスを足がかりにして、必要が出てきたら広げていく形がよいでしょう。

レート制限と指数バックオフ

これをきちんと掘り下げている競合記事には、ついぞ出会いませんでした。しかし重要度はかなり高い。503やCAPTCHAが返ってきたら、間髪入れずに再試行——これは恒久ブロックへの最短ルートです。

import time
import random

def fetch_with_backoff(url, max_retries=3):
    """失敗時に指数バックオフで再取得する。"""
    for attempt in range(max_retries):
        response = cfreq.get(
            url,
            headers=get_headers(),
            impersonate=random.choice(BROWSERS),
        )
        if response.status_code == 200:
            return response

        # ジッター付き指数バックオフ
        wait = min(2 ** attempt + random.uniform(0, 1), 30)
        print(f"Attempt {attempt+1} failed ({response.status_code}). Waiting {wait:.1f}s...")
        time.sleep(wait)

    return None  # 全リトライ失敗

wait = min(2^attempt + jitter, max_delay)という式なら、待機は2秒、4秒、8秒…と段階的に伸びつつ、上限を踏み越えることはありません。ランダムジッターを噛ませるのは、再試行のパターンが機械的に見えないようにするため。これは外せない仕掛けです。

JavaScript描画コンテンツ向けにSeleniumまたはPlaywrightを使う

Amazonの一部のページ、とりわけ動的な価格ウィジェットやバリエーション選択を抱えるページでは、JavaScriptの実行そのものが必要になります。curl_cffiで取れるHTMLが欠けているときは、ヘッドレスブラウザを次の一手に据えます。

from playwright.sync_api import sync_playwright

def scrape_with_browser(url):
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        page = browser.new_page()
        page.goto(url, wait_until="domcontentloaded")
        page.wait_for_timeout(3000)  # JSの描画を待つ
        html = page.content()
        browser.close()
        return html

これは遅さがネックで、curl_cffiなら1秒もかからないところを、1ページあたり3〜5秒費やします。出番は本当に必要なときだけに絞ってください。

私の経験則では、Amazonの商品ページの9割以上は、curl_cffi単体でブラウザを起動せずにさばけます。

ブロック対策まとめ

手法難易度効果多くのチュートリアルで触れられているか
カスタム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. Google Cloud Console → APIs & Services → Credentials に移動
  2. サービスアカウントを作成し、JSON鍵ファイルをダウンロード
  3. ~/.config/gspread/service_account.json に保存
  4. JSONファイル内の client_email と対象スプレッドシートを共有

準備が整ったら、次を実行します。

import gspread
from gspread_dataframe import set_with_dataframe

gc = gspread.service_account()
sh = gc.open("Amazon Scrape Data")
worksheet = sh.sheet1

set_with_dataframe(worksheet, df)
print("Data exported to Google Sheets!")

これでDataFrameをまるごとGoogleシートへ直書きできます。リアルタイムでの共有もダッシュボード化も思いのままです。

SQLiteに保存してローカル分析する

扱うデータ量が多い場合や、履歴を残しておきたい場合には、SQLiteがうってつけ。サーバーを立てる必要もなく、単一ファイルだけで運用できます。

import sqlite3

conn = sqlite3.connect("amazon_products.db")
df.to_sql("products", conn, if_exists="append", index=False)
print(f"Stored {len(df)} products in SQLite")

# 後でクエリする:
historical = pd.read_sql_query(
    "SELECT * FROM products WHERE price IS NOT NULL ORDER BY rowid DESC LIMIT 100",
    conn,
)

ノーコードという選択肢

出力スクリプトの面倒まで抱えたくないなら、ThunderbitはGoogle Sheets、Airtable、Notion、Excel、CSV、JSONへの無料出力にひと通り対応しています。AirtableやNotionでそのまま表示できる画像フィールドも盛り込めます。gspreadの初期設定も、API認証情報も、コードすらも不要。手元のツールへ即座に流し込みたいチームには、相当な時短になるはずです。

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

価格監視や在庫追跡に求められるのは、1回限りではなく繰り返しのスクレイピングです。にもかかわらず、スケジューリングまで踏み込んだ競合記事は、ひとつとして見当たりませんでした。ここでは、Pythonスクレイパーを自動で回す方法を取り上げます。

Cronジョブ(Linux/macOS)

crontabを開きます。

crontab -e

毎日午前6時に動かすなら、次の一行を加えます。

0 6 * * * cd /path/to/amazon-scraper && /path/to/venv/bin/python scraper.py >> ~/scraper.log 2>&1

6時間おきにしたいなら、こうです。

0 */6 * * * cd /path/to/amazon-scraper && /path/to/venv/bin/python scraper.py >> ~/scraper.log 2>&1

Windows Task Scheduler

run_scraper.batを作ります。

@echo off
cd /d "C:\path\to\amazon-scraper"
call venv\Scripts\activate
python scraper.py
deactivate

あとはタスク スケジューラを開いて「基本タスクの作成」→ トリガー(毎日、毎時など)を設定 → 操作は「プログラムの開始」→ run_scraper.bat を指定、という流れです。

GitHub Actions(無料枠)

インフラを一切持たずにクラウドで走らせたいなら、こんな手があります。

name: Amazon Scraper

on:
  schedule:
    - cron: "0 6 * * *"  # 毎日UTC 6:00
  workflow_dispatch:       # 手動実行

jobs:
  scrape:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.11"
      - name: Install dependencies
        run: pip install -r requirements.txt
      - name: Run scraper
        run: python scraper.py
      - name: Commit results
        run: |
          git config user.name 'GitHub Actions'
          git config user.email 'actions@github.com'
          git add data/
          git diff --staged --quiet || git commit -m "Update scraped data"
          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はブロック対策を肩代わりしてくれる反面、コードを書く手間はやはり残ります。営業やEC運用、あるいは「とにかくデータが欲しいだけ」という人にとって最速なのはThunderbit。セレクターも、コードも、AmazonのHTML変更にともなう保守も、一切ついて回りません。

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

むろん、身びいきも多少はあります。何しろ私たちのチームが作ったものですから。それでも、実際の手順は拍子抜けするほど単純です。

  1. Thunderbit Chrome拡張機能をインストール
  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の範囲か、タイトルが空でないかをチェックしてください。あるチームは検証レイヤーを追加したことで、下流エラーを21%減らしたと報告しています。

それとも、ここまでの一切合切が思いのほか骨の折れる作業だ、と感じたなら、Thunderbitのようなノーコードツールのほうが性に合うのかもしれません。ラクな道を選ぶことに、恥じる必要などまったくありません。何年もスクレイパーをデバッグしてきた身として断言しますが、最良のコードとは、書かずに済むコードでもあるのです。

Amazonをスクレイピングする際の法的・倫理的な注意点

この話題はAmazonスクレイピングのたびに必ず付いて回るので、法的な全体像をかいつまんで整理しておきます。

  • 公開データのスクレイピングは、米国では一般に合法とされています。 画期的なhiQ Labs v. LinkedIn判決(2022年)は、公開データへのアクセスはCFAA違反ではないと示しました。さらに最近のMeta v. Bright Data(2024年)やX v. Bright Data(2024年)も、この考え方を後押ししています。
  • Amazonの利用規約は自動アクセスを禁じています。 これは民事上の契約違反であり、刑事事件ではありません。裁判所は一般にこの2つを区別しています。
  • Amazon v. Perplexity(2025年) は、AmazonページのAIスクレイピングをめぐる進行中の案件です。2026年3月には仮差止命令が出されました。今後の動きに注目です。
  • 公開ページに限定する。 ログイン保護されたコンテンツ、個人データ、認証の裏側にある情報はスクレイピングしないでください。
  • レート制限を守る。 Amazonのサーバーに負荷をかけすぎないように。リクエスト間を2〜5秒空けるのは妥当です。
  • データは責任を持って使う。 著作物の再配布ではなく、分析目的で利用してください。
  • 大規模な商用利用では法務に相談する。 特にEUではGDPRが個人データに適用されます。

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

まとめ

これで手元には、ちゃんと動く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クリック代替手段です

コードをそのまま動かしてみたいなら、本ガイドの内容はどれもコピペで実行できる状態にしてあります。逆に、コードには一切手を触れたくないなら、Thunderbitの無料枠で、Amazon相手のノーコード手法をすぐに体験できます。

さらに踏み込みたい方は、PythonでAmazon商品とレビューをスクレイピングする方法おすすめのPythonウェブスクレイピングツールAmazon価格のスクレイピング もどうぞ。 ThunderbitのYouTubeチャンネル では、手順を追った解説動画も公開しています。

Happy scraping — そして、次のAmazonアップデートを、あなたのセレクターが無事に生き延びますように。

よくある質問

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

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

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

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

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

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

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

はい。Thunderbit のようなツールを使えば、Chrome拡張機能でAmazon商品を2クリックでスクレイピングできます。AIによる項目検出でデータが自動整形され、Excel、Google Sheets、Airtable、Notionへ無料で出力できます。AmazonのHTMLが変わっても、ThunderbitのAIが手動更新なしで適応します。

5. AmazonのHTMLセレクターはどのくらいの頻度で変わり、どうやって更新し続ければいいですか?

かなり頻繁で、予告なく変わります。スクレイピング業界では、DOM変更のために10〜15% のクローラーが毎週修正を必要としていると報告されています。先回りするには、成功率の監視、生HTMLの保存、ライブページでのセレクター確認を定期的に行ってください。あるいは、ThunderbitのようなAI搭載ツールなら自動適応するので、保守負担をなくせます。

もっと知る

Shuai Guan
Shuai Guan
Thunderbit の CEO | AIデータ自動化のエキスパート Shuai Guan は Thunderbit の CEO であり、ミシガン大学工学部の卒業生です。テクノロジーと SaaS アーキテクチャの分野で約10年にわたる経験をもとに、複雑な AI モデルを、実務で使えるノーコードのデータ抽出ツールへと落とし込むことを得意としています。このブログでは、ウェブスクレイピングや自動化戦略について、実践で磨かれた率直な知見を共有し、より賢くデータ主導のワークフローを構築できるよう支援しています。データワークフローの最適化から離れているときは、同じこだわりと観察眼を写真への情熱にも注いでいます。
目次

ただ伝えるだけで、Webページをスクレイピング

必要なことをそのまま英語で伝えるだけ。いや、何も言わなくてもOKです。

Thunderbitを試す 無料
AIでデータを抽出
Google Sheets、Airtable、Notionへ簡単にデータを移行できます
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week