プロキシを使ったAmazon商品データのスクレイピング方法

住宅用プロキシを使用して価格、レビュー、およびランキングを含むAmazon製品データをスクレイピングする方法を学びます。 Python と Node.js のコード例を反検出戦略で完了します.

プロキシを使ったAmazon商品データのスクレイピング方法

なぜAmazon製品データをScrapeするのですか?

アマゾンは、世界中の数十万のマーケットプレイスで350万以上の製品をホストしています。 eコマース企業にとって、このデータは有能です。競合価格、製品説明、顧客レビュー、ベストセラーランク、在庫シグナルはすべてスマートな決定を促すことができます。 あなたが構築しているかどうか 価格監視ツール市場調査、AIモデルのトレーニング、Amazon製品データは、Web上で最も価値の高いターゲットの1つです。

課題は、アマゾンが反ボット防衛に大きく投資していることです。 適切なプロキシ戦略がなければ、スクレーパーは、CAPTCHA、IPブロック、および不正な応答を数分でヒットします。 このガイドでは、Amazonをスケールで確実にスクレイピングするために必要なアーキテクチャ、コード、プロキシ構成を説明します。

Amazonのアンチボット保護

単一行のコードを書く前に、相手が何をしているかを理解する必要があります。 Amazonは、あらゆる着信リクエストを分析するレイヤード検出システムを採用しています。

指紋の要求

Amazon は HTTP ヘッダ、TLS の指紋、および注文を要求します。 標準ブラウザのヘッダを欠落させたり、既知のボットシグネチャを使用していたい場合はすぐにフラグが付けられます。 ザ・オブ・ザ・ Accept-Language, Accept-EncodingUser-Agent ヘッダは一貫して現実的でなければなりません。

行動分析

ヒトが達成できず、予測可能なパターン(例、シーケンシャル ASIN)をフォローし、トリガーレート制限を要求します。 Amazonは複数のリクエストでセッションの動作を追跡します。そのため、各IPは本物の買い物客のように動作する必要があります。

CAPTCHAチャレンジ

Amazon が自動トラフィックを疑うと、製品データではなく CAPTCHA のページが機能します。 住宅IPは、同じIPプールを実際のAmazonの買い物客と共有しているため、データセンターIPよりもはるかに少ないCAPTCHAsを受け取ります。 より深い検出方法を見るには、ガイドを参照してください アンチボットシステムがプロキシを検出する方法. .

キーテイクアウト: 適切な回転を持つ住宅のプロキシは、持続可能なアマゾンスクレイピングのために不可欠です。 データセンターのプロキシは時間内にブロックされます。

Amazonから抽出できるデータ

Amazonから抽出できるデータ
データポイントソースページユースケース
商品名、画像、説明製品詳細ページカタログ作成、コンテンツ解析
現在の価格, 取引価格, リスト価格プロダクト細部/提供のリスト価格の監視、補充
顧客レビューと評価レビューページセンティメント分析、製品研究
ベストセラーズランク(BSR)製品詳細ページ市場需要推定
購入ボックス販売者、配送情報製品詳細ページ競争の追跡
結果ランキングの検索検索結果ページSEOと広告の最適化
カテゴリ階層ノードを参照課税マッピング

プロキシの設定

ProxyHatの住宅プロキシゲートウェイは、Amazonスクレイピングに必要なIPダイバーシティとジオターゲティングを提供します。 ゲートウェイを介して接続し、IP をリクエストごとに自動回転したり、必要に応じて粘液セッションを維持したりします。

基本接続

# HTTP proxy
http://USERNAME:PASSWORD@gate.proxyhat.com:8080
# With geo-targeting (US Amazon)
http://USERNAME-country-US:PASSWORD@gate.proxyhat.com:8080
# With sticky session (maintain same IP for a browsing session)
http://USERNAME-session-amz001:PASSWORD@gate.proxyhat.com:8080

Amazonのスクレイピングには、スクレイピングしている市場に合った国をターゲットにすることをお勧めします。 scraping amazon.de? ドイツのIPを使用してください。 scraping amazon.co.jp? 日本語のIPを使用してください。 チェックイン 利用可能な場所 完全なリストのために。

Pythonの実装

ここでは、Amazon製品データの完全なPythonスクレーパーです。 ProxyHatのPython SDK リクエストとBeautifulSoupと一緒に。

基本的なプロダクト スクレーパー

import requests
from bs4 import BeautifulSoup
import random
import time
import json
PROXY_URL = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
USER_AGENTS = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0",
]
def get_amazon_product(asin, marketplace="com"):
    """Scrape product data from Amazon by ASIN."""
    url = f"https://www.amazon.{marketplace}/dp/{asin}"
    headers = {
        "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",
        "Connection": "keep-alive",
    }
    proxies = {
        "http": PROXY_URL,
        "https": PROXY_URL,
    }
    response = requests.get(url, headers=headers, proxies=proxies, timeout=30)
    if response.status_code != 200:
        return None
    soup = BeautifulSoup(response.text, "html.parser")
    product = {
        "asin": asin,
        "title": extract_title(soup),
        "price": extract_price(soup),
        "rating": extract_rating(soup),
        "review_count": extract_review_count(soup),
        "bsr": extract_bsr(soup),
        "availability": extract_availability(soup),
    }
    return product
def extract_title(soup):
    el = soup.find("span", {"id": "productTitle"})
    return el.get_text(strip=True) if el else None
def extract_price(soup):
    el = soup.find("span", {"class": "a-price-whole"})
    if el:
        fraction = soup.find("span", {"class": "a-price-fraction"})
        price = el.get_text(strip=True).rstrip(".")
        if fraction:
            price += "." + fraction.get_text(strip=True)
        return price
    return None
def extract_rating(soup):
    el = soup.find("span", {"class": "a-icon-alt"})
    if el and "out of" in el.get_text():
        return el.get_text(strip=True).split(" ")[0]
    return None
def extract_review_count(soup):
    el = soup.find("span", {"id": "acrCustomerReviewCount"})
    return el.get_text(strip=True) if el else None
def extract_bsr(soup):
    el = soup.find("th", string=lambda t: t and "Best Sellers Rank" in t)
    if el:
        return el.find_next("td").get_text(strip=True)
    return None
def extract_availability(soup):
    el = soup.find("div", {"id": "availability"})
    return el.get_text(strip=True) if el else None
# Example usage
if __name__ == "__main__":
    asins = ["B0CHX3QBCH", "B0D5BKRY4R", "B0CRMZHDG7"]
    for asin in asins:
        product = get_amazon_product(asin)
        if product:
            print(json.dumps(product, indent=2))
        time.sleep(random.uniform(2, 5))  # Random delay between requests

検索結果の移行

def scrape_search_results(keyword, max_pages=5):
    """Scrape Amazon search results with pagination."""
    results = []
    for page in range(1, max_pages + 1):
        url = f"https://www.amazon.com/s?k={keyword}&page={page}"
        headers = {
            "User-Agent": random.choice(USER_AGENTS),
            "Accept-Language": "en-US,en;q=0.9",
        }
        proxies = {"http": PROXY_URL, "https": PROXY_URL}
        response = requests.get(url, headers=headers, proxies=proxies, timeout=30)
        if response.status_code != 200:
            print(f"Page {page}: status {response.status_code}")
            break
        soup = BeautifulSoup(response.text, "html.parser")
        items = soup.find_all("div", {"data-component-type": "s-search-result"})
        for item in items:
            asin = item.get("data-asin", "")
            title_el = item.find("h2")
            price_el = item.find("span", {"class": "a-price-whole"})
            results.append({
                "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,
                "page": page,
            })
        time.sleep(random.uniform(3, 7))
    return results

Node.js 実装

Node.js プロジェクトでは、 ProxyHat ノード SDK パッシングのためのcheerioを使って。

const axios = require("axios");
const cheerio = require("cheerio");
const { HttpsProxyAgent } = require("https-proxy-agent");
const PROXY_URL = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080";
const agent = new HttpsProxyAgent(PROXY_URL);
const USER_AGENTS = [
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36",
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36",
];
async function scrapeProduct(asin, marketplace = "com") {
  const url = `https://www.amazon.${marketplace}/dp/${asin}`;
  const { data } = await axios.get(url, {
    httpsAgent: agent,
    headers: {
      "User-Agent": USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)],
      "Accept-Language": "en-US,en;q=0.9",
      Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    },
    timeout: 30000,
  });
  const $ = cheerio.load(data);
  return {
    asin,
    title: $("#productTitle").text().trim() || null,
    price: $(".a-price-whole").first().text().trim() || null,
    rating: $(".a-icon-alt").first().text().trim().split(" ")[0] || null,
    reviewCount: $("#acrCustomerReviewCount").text().trim() || null,
    availability: $("#availability").text().trim() || null,
  };
}
async function scrapeMultiple(asins) {
  const results = [];
  for (const asin of asins) {
    try {
      const product = await scrapeProduct(asin);
      results.push(product);
      console.log(`Scraped: ${product.title}`);
    } catch (err) {
      console.error(`Failed ${asin}: ${err.message}`);
    }
    // Random delay 2-5 seconds
    await new Promise((r) => setTimeout(r, 2000 + Math.random() * 3000));
  }
  return results;
}
// Usage
scrapeMultiple(["B0CHX3QBCH", "B0D5BKRY4R"]).then((results) => {
  console.log(JSON.stringify(results, null, 2));
});

Amazon用のプロキシローテーション戦略

Amazonの検出は、複数のリクエストが単一のIPから来るほど攻撃的になります。 ここが一番うまくいく回転戦略です。

リクエスト回転

各要求が独立したバルク プロダクト一見のために、あらゆる要求にIPsを回して下さい。 これは、ProxyHatのゲートウェイでデフォルトの動作です。各新しい接続は新しい住宅IPを取得します。

セッションベースの回転

複数のページで検索結果をスクレイピングするときは、セッション全体に同じIPを保持します。 IP のミッドペジネーションを切り替えると、Amazon に疑わしいようです。 ProxyHat のスティッキーセッションを使用する:

# Maintain same IP for up to 10 minutes
http://USERNAME-session-search001:PASSWORD@gate.proxyhat.com:8080

ジオターゲット回転

プロキシの場所をAmazonマーケットプレイスに合わせます。 US IP から amazon.de にアクセスすると、フラグが上がります。 ターゲット特定の国:

# German IPs for amazon.de
http://USERNAME-country-DE:PASSWORD@gate.proxyhat.com:8080
# Japanese IPs for amazon.co.jp
http://USERNAME-country-JP:PASSWORD@gate.proxyhat.com:8080
# UK IPs for amazon.co.uk
http://USERNAME-country-GB:PASSWORD@gate.proxyhat.com:8080

回転技術の詳細については、詳細なガイドをご覧ください 2026年にWebスクレイピングに最適なプロキシ. .

Amazonスクレイピングのベストプラクティス

  • 遅延をランダム化: リクエスト間で2-7秒のランダムな間隔を使用します。 固定レートでスクレイピングしないでください。
  • ユーザーエージェントを回転させる: 少なくとも10の現実的なブラウザのユーザーエージェント文字列のプールを維持し、それらを回転させます。
  • ハンドル CAPTCHAs gracefully: CAPTCHAの応答を受信したら、30〜60秒間戻って、新しいIPで再試行してください。
  • Robots.txt の尊重: ほとんどの管轄区域で合法的に結合しない間、robots.txt命令に続くことはよい信仰を示します。
  • 住宅のプロキシを使用して下さい: データセンターIPは、Amazonで簡単に識別され、ブロックされます。 住宅用プロキシ 同じIP範囲を実際の買い物客と共有します。
  • モニターの成功率: HTTP 200 レートを追跡します。 90%以下にドロップすると、通貨を削減したり、回転戦略を調整したりできます。
  • キャッシュレスポンス: データが変更されていない場合は、同じURLを2回スクレイピングしないでください。 製品のデータをキャッシュし、価格変更の頻度に基づいてリフレッシュ間隔を設定します。

Amazonスクレーパーのスケーリング

数百~数百万もの製品に移行するとき、建築問題。

キューベースアーキテクチャ

メッセージキュー(Redis、RabbitMQ、SQS)を使用して、ASINリストを管理します。 ワーカープロセスは、キューから ASIN をプルし、それらをスクレイピングし、結果をデータストアにプッシュします。 スクレーピングからスケジューリングし、労働者を独立してスケールアップさせます。

並列制御

5-10同時リクエストで開始し、成功率を監視しながら徐々に増加します。 ProxyHatの住宅プールでは、問題なく20-50の同時セッションを実行できます。 お問い合わせ ウェブスクレイピングユースケースページ 推奨設定のため。

データパイプライン

PostgreSQL またはデータウェアハウス内のデータを再処理するためのオブジェクトストア(S3)で未加工 HTML を保存します。 この分離では、再スクレイピングなしでバグを解析することができます。

プロのヒント:アマゾンの製品ページは頻繁に構造を変えます。 生のHTMLを保存して、セレクターが変更したときにデータを再抽出することができます。Amazonを再度ヒットすることなく。

法的および倫理的考慮事項

Webスクレイピングは、一般に利用可能なデータのためのほとんどの管轄区域で合法であるが、責任ある慣行の問題である。 公開されているデータを収集するだけ。 認証されたページ、販売者アカウント、またはプライベートデータにアクセスしようとしないでください。 Amazonのサービスを他のユーザーに劣化させないようにリクエストを率制限します。 必要なデータのみを保存し、該当するプライバシー法を遵守して取り扱います。

キーテイクアウト

  • Amazonのアンチボットシステムは、ターゲット市場に合わせてジオターゲティングを備えた住宅用プロキシを必要とします。
  • バルクルックアップのためのリクエストごとにIPを回転させる。 コピーされたブラウジングのためにスティッキーセッションを使用してください。
  • 遅延、ユーザーエージェント、および要求パターンをランダム化して検出を回避します。
  • 数千もの製品を超えてスケーリングするためのキューベースのアーキテクチャを構築します。
  • セレクターの変更に対するレジリエンスのために生のHTMLを保存します。
  • 使用条件 ProxyHatの住宅用プロキシ すべてのAmazonマーケットプレイス全体で高い成功率のために。

Amazonデータをスクレイピングする準備はできましたか? 私たちについて eコマースデータスクレイピングガイド 完全な戦略をカバーし、 ProxyHat のプロキシインフラストラクチャを弊社で探索できます。 プライシングページ. .

始める準備はできましたか?

AIフィルタリングで148か国以上、5,000万以上のレジデンシャルIPにアクセス。

料金を見るレジデンシャルプロキシ
← ブログに戻る