Amazonはオープンウェブ上で最大の商品データセットであり、価格、レビュー、ランキング、在庫状況をスクレイピングすることは、価格モニタリング、デジタル棚分析、市場調査、競合インテリジェンスを支えています。同時に、スクレイパーを向ける対象として最も厳重に防御されているサイトの一つでもあります。セットアップを誤れば、わずか数リクエストのうちに「Robot Check」ページ、503エラー、あるいは間違った国のデータに行き当たります。
これは正しくやるための実践的なガイドです。Amazonの商品ページから何を取得できるか、なぜ適切なインフラなしでは失敗するのか、そしてレジデンシャルプロキシを通じてどうクリーンに収集するか。要点を言えば、Amazonはマーケットプレイスごとに地理的に分かれており、ボットに対して厳しいので、正しい国の実際の買い物客として取得する必要があります。これはまさにレジデンシャルプロキシが得意とすることです。
Amazonの商品ページからスクレイピングできるもの
Amazonの商品リストには、公開された構造化データが密に詰まっています。チームが最もよく収集するフィールドは次のとおりです。
- 価格とセール情報 — 現在価格、定価、割引、クーポン。
- 在庫状況とBuy Box — 在庫の有無、そしてどの販売者がBuy Boxを獲得しているか。
- Best Sellers Rank (BSR) — カテゴリー内でのAmazonのランキング、需要の代理指標。
- 評価とレビュー — 星評価、レビュー数、レビュー本文。
- 商品詳細 — タイトル、箇条書き、説明文、画像、バリエーション、仕様。
- 販売者情報 — 出品における販売者と配送の詳細。
これらはすべて公開ページ上にあります。落とし穴は、Amazonがあなたがどこにいるように見えるか、そして本物の買い物客に見えるかどうかに基づいて、どのページを表示するかを決定することです。
Amazonが難しい理由: それはプロキシの問題である
Amazonの3つの特性が、スクレイピングをプロキシ層に関わるアクセスの問題に変えます。
Amazonはマーケットプレイスごとに分かれており、地理的にパーソナライズされている。 Amazonは国ごとに別々のマーケットプレイスを運営しています。amazon.com、amazon.de、amazon.co.uk、amazon.co.jpはそれぞれ異なる価格、在庫状況、販売者、さらにはカタログさえ持っています。さらに、単一のマーケットプレイス内でも、買い物客の場所によって価格と配送がパーソナライズされます。米国のIPからamazon.deを取得すると、リダイレクトされたり、異なる体験になったり、ドイツの買い物客が決して目にしない在庫状況が表示されたりすることがあります。マーケットプレイスを正確に捉えるには、その国から接続する必要があります。これが国およびシティレベルのターゲティングの目的です。
Amazonはボットに対して厳しく防御している。 データセンターIPは素早くフラグを立てられ、CAPTCHAの「Robot Check」、503エラー、スロットリングを受けるため、記録されるのは買い物客のページではなくボット版のページです。(スクレイパーがブロックされる理由がその仕組みを解説しています。)レジデンシャルIPは実際のユーザーとしての信頼性を持つため、Amazonは本物のリスティングを提供します。
カバー範囲は大量かつ反復的である。 毎日多数のASINを複数のマーケットプレイスで追跡することは、大量のリクエストになります。一握りのIPからでは、すぐにレート制限に引っかかり、ブロックだらけの不完全なサンプルしか得られません。クロールを完全に保つには、大規模なローテーティングプールが必要です。
これら3つすべての解決策は同じです。マーケットプレイスの国に一致するレジデンシャルIPから、大規模にローテーションしながら取得することです。
ステップ1: 正しい国のレジデンシャルIPを経由する
Shifterゲートウェイでは、プロキシのユーザー名に国をエンコードすることで国を選択できます。エンドポイントは一つ、IPリストは不要です。プロキシの国をマーケットプレイスのドメインに一致させてください。 amazon.comは米国のIPから、amazon.deはドイツのIPから。
# amazon.com as a US shoppercurl -x customer-USERNAME-country-us:PASSWORD@p.shifter.io:443 \ "https://www.amazon.com/dp/B0EXAMPLE"
# amazon.de as a German shoppercurl -x customer-USERNAME-country-de:PASSWORD@p.shifter.io:443 \ "https://www.amazon.de/dp/B0EXAMPLE"すべての商品には安定したASIN(/dp/ASINのURLにあるB0...のコード)があるため、ASINのリストさえあれば、URLのパターンは各マーケットプレイスで予測可能です。
ステップ2: コードで取得しパースする
Amazonの商品データにブラウザが必要になることはめったにありません。ほとんどのデータは最初のHTMLに含まれているため、単純なHTTPクライアントの方が高速で、帯域幅のコストもはるかに低くなります。以下はPythonでの形です(完全なクライアントの構築についてはPythonでのレジデンシャルプロキシの使い方を参照してください)。
import os, requestsfrom bs4 import BeautifulSoup
USER, PASS = os.environ["SHIFTER_USER"], os.environ["SHIFTER_PASS"]GATEWAY = "p.shifter.io:443"
def proxy(country="us"): url = f"http://{USER}-country-{country}:{PASS}@{GATEWAY}" return {"http": url, "https": url}
def scrape_product(asin, country="us", tld="com"): url = f"https://www.amazon.{tld}/dp/{asin}" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", "Accept-Language": "en-US,en;q=0.9", "Accept-Encoding": "gzip, br", } r = requests.get(url, headers=headers, proxies=proxy(country), timeout=30) r.raise_for_status() soup = BeautifulSoup(r.text, "html.parser") title = soup.select_one("#productTitle") price = soup.select_one(".a-price .a-offscreen") rating = soup.select_one("#acrPopover") return { "asin": asin, "title": title.get_text(strip=True) if title else None, "price": price.get_text(strip=True) if price else None, "rating": rating["title"].strip() if rating and rating.has_attr("title") else None, }
print(scrape_product("B0EXAMPLE", country="us", tld="com"))セレクタよりも重要なことが2つあります。プロキシの国に一致する現実的なUser-AgentとAccept-Languageを送ること、そしてAmazonのマークアップが変化することを見越して、すべてのセレクタをオプション扱いにし、抽出した結果を検証することです。レビューについては、レビューページをリクエストしてページネーションを行い、BSRについては通常「Product information」/詳細セクションに含まれています。
ステップ3: ローテーションし、有効な場合はセッションを維持する
- リクエストごとのローテーションを、多数のASINにわたる広範なカタログスクレイピングに使います。セッションIDを省略すれば、各リクエストは新しいIPを取得します。
- スティッキーセッションを、単一商品のレビューをページネーションする場合や複数ステップのフローの際に維持します。そうすることで、そのシーケンスが一人の買い物客のように見えます。ユーザー名に
-sid-<id>-ttl-<seconds>を追加してください。
IPの品質が、Robot Checkではなく本物のページを見る頻度を左右するため、IPレピュテーションを理解しておくことがクロールをクリーンに保つ助けになります。
ステップ4: ブロックに対処し、帯域幅を低く保つ
AmazonがCAPTCHA/Robot Checkや503を返した場合、押し続けるのではなく、新しいIPにローテーションし、バックオフしてリトライしてください。継続的なブロック(たまに起きるものではなく)は、IPの品質かリクエストの挙動に問題があることを示しており、これはスクレイピングでブロックされるのを避ける方法で扱われています。
ページが本当にJavaScriptを必要としてブラウザを使う場合は、画像、メディア、フォントをブロックして、パースすることのないピクセルに対してGB単位で料金を払わないようにしてください。そのテクニックはプロキシの帯域幅コストを削減する方法にあります。ほとんどのAmazon商品フィールドについては、単純なHTTPで十分であり、最も安価です。
責任を持って利用する
公開されている商品データのみをスクレイピングしてください。リスティング、価格、評価、そしてどの買い物客も見られるレビュー本文です。個人データには近づかないでください。レビュアーの身元やレビューに紐づく個人情報は対象外です。Amazonの利用規約とレート制限を尊重し、サイトを劣化させないようにし、Amazonの利用規約が自動化されたアクセスを制限していることを認識してください。収集は公開データにとどめ、不確かなことについては法的助言を得てください(ウェブスクレイピングは合法かを参照)。プロキシはリクエストがどのIPから来るかを変えるものであり、そのリクエストをすべきかどうかを変えるものではありません。当社の利用規約がShifter上で許可される事項についての正式な情報源です。
FAQ
プロキシなしでAmazonをスクレイピングできますか? どんな規模であっても確実にはできません。Amazonはデータセンターおよび繰り返しIPのトラフィックをCAPTCHAと503で素早くフラグ付けし、しかも一つの国のマーケットプレイスしか見られません。レジデンシャルプロキシを使えば、各対象国で実際の買い物客として取得できます。
なぜプロキシの国をマーケットプレイスに一致させる必要があるのですか?
Amazonのマーケットプレイスは国ごとに分かれており、地理的にパーソナライズされているためです。米国のIPからamazon.deを取得すると、リダイレクトが発生したり、ドイツの買い物客が見ないデータが表示されたりすることがあります。正確なデータを得るには、IPの国をドメインに一致させてください(amazon.deはDEのIPから)。
Amazonにはヘッドレスブラウザが必要ですか? 通常は不要です。価格、タイトル、評価、在庫状況といったほとんどの商品フィールドは最初のHTMLに含まれているため、単純なHTTPリクエストの方が高速で、帯域幅のコストもはるかに低くなります。ブラウザは本当にJavaScriptに依存するページのために取っておいてください。
Amazonにはレジデンシャルプロキシとデータセンタープロキシのどちらが良いですか? レジデンシャルです。AmazonはデータセンターIPを積極的に検出しブロックするため、データセンターではRobot Checkと503を受け取ることになります。レジデンシャルIPは、本物の買い物客が見るような、地理的に正確な本物のリスティングを見ることができます。
Amazonをスクレイピングすることは合法ですか? 公開されている商品データは一般的に公開向けの性質を持っており、責任を持って行われる限り、利用規約とレート制限を尊重し、個人データを避けることで、それを収集することは概ね問題ありません。Amazonの利用規約は自動化されたアクセスを制限しているため、収集は公開データにとどめ、不確かなことについては法的助言を得てください。プロキシは根本的な行為の合法性を変えるものではありません。
まとめ
Amazonは公開商品データの宝庫ですが、マーケットプレイスごとに分かれ、地理的にパーソナライズされており、ブロックされずにスクレイピングするのが最も難しいサイトの一つです。レシピは単純です。マーケットプレイスの国に一致するレジデンシャルIPを経由し、現実的なクライアントでHTMLを取得し、防御的にパースし、大規模にローテーションし、Robot Checkには押し続けるのではなくIPを切り替えて対処します。それを実行すれば、追跡するすべてのマーケットプレイスで、買い物客が目にする実際の価格、レビュー、ランキングを得られます。
成否を分けるのはIPの品質です。クリーンなレジデンシャルIPは、Robot Checkの代わりに本物のリスティングを意味します。質の高いレジデンシャルプロキシネットワークは、Amazonスクレイピングを信頼できるものにするアクセス層であり、それは価格モニタリングやデジタル棚分析を支えているのと同じ基盤です。料金ページには、あなたにとって重要なASINとマーケットプレイスに対してこれを試すためのGB単位のプランが掲載されています。