ネットで見つけた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万回程度。この差を人の手で追いかけるのは、はなから無理筋なんです。

Pythonの強みは、自由度の高さにあります。何を抜き出し、エラーをどう処理し、どこへ保存するか——その一つひとつを自分の判断で決められる。ただしその裏返しとして、保守も、ブロック対策も、しょっちゅう変わるAmazonのHTMLへの追従も、すべて自分の責任になります。
Amazonから何が取れて、何を避けるべきか
公開された商品ページから、通常取得できるのは以下のような情報です。
- 商品タイトル(商品名、ブランド)
- 価格(現在価格、元値、セール価格)
- 評価(星の平均)
- レビュー数
- 商品画像(メイン画像URL)
- 在庫状況
- ASIN(Amazon Standard Identification Number)
- 商品説明・箇条書き
- 販売者情報
- バリエーション(サイズ、色など)
反対に、手を出すべきでないものはこちらです。
- ログインの裏側にあるデータ: 詳細レビュー、個人アカウント情報、注文履歴
- 個人情報: 購入者名、住所、支払い情報
- 再配布前提の著作物: 商品説明や画像は分析用途なら問題ありませんが、自分のコンテンツとして再掲載しないでください
ちなみにAmazonのrobots.txtは、GPTBot、Scrapy、ClaudeBotを含む50を超える既知ボットを締め出し、アカウントやカート、ほしい物リストといったパスも禁じています。商品詳細ページそのものは明示的に禁止されてはいないものの、Amazonの利用規約は自動アクセスを認めていません。なお、裁判所は一般に利用規約違反(民事)とCFAA違反(刑事)を別物として扱います。合法性の話は、ガイドの終盤でもう少し掘り下げます。
必要なツールとライブラリ
このチュートリアルが土台にするPythonスタックは、次のとおりです。
| ライブラリ | 用途 | 採用理由 |
|---|---|---|
requests | HTTPリクエスト | シンプルで広く使われている |
beautifulsoup4 | HTML解析 | CSSセレクターで抽出しやすい |
lxml | 高速HTMLパーサー | BeautifulSoupのパーサーバックエンドとして使用 |
curl_cffi | TLSフィンガープリントの偽装 | 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!」と表示されれば、下準備は完了です。

なぜ多くのAmazonスクレイピング解説は壊れるのか(そしてこのガイドが違う理由)
多くのガイドが避けて通る部分であり、おそらくあなたがこの記事までたどり着いた理由そのものが、ここにあります。
AmazonはHTML構造もクラス名も要素IDも、しょっちゅう手を入れます。スクレイピング業界の報告では、DOMの変更や指紋対策の更新を受けて、毎週10〜15%のクローラーが修正を迫られているとされます。語り草になっている犠牲者が#priceblock_ourprice。2018年〜2023年のチュートリアルにこれでもかと顔を出したセレクターですが、今のAmazon商品ページからはきれいに消え去りました。
壊れたものと、今動くものを突き合わせると、こうなります。
| データ項目 | 壊れているセレクター(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ページで動作確認済みです。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のサービスアカウントを仕込んでおきます(初回限りの作業です)。
- Google Cloud Console → APIs & Services → Credentials に移動
- サービスアカウントを作成し、JSON鍵ファイルをダウンロード
~/.config/gspread/service_account.jsonに保存- 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クリックでスクレイピングする方法
むろん、身びいきも多少はあります。何しろ私たちのチームが作ったものですから。それでも、実際の手順は拍子抜けするほど単純です。
- Thunderbit Chrome拡張機能をインストール
- Amazonの検索結果ページまたは商品ページを開く
- 「AIで項目を提案」 をクリック(または即時Amazonスクレイパーテンプレートを使う)
- 「スクレイプ」 をクリック
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搭載ツールなら自動適応するので、保守負担をなくせます。
もっと知る


