Amazonをスクレイピングする方法:2024年版ガイド

PythonでAmazonをスクレイピングする方法と、Bright Dataのスクレイピングブラウザの使用方法をご紹介します。
5 min read
How To Scrape Amazon

さて、なぜ Amazonに注目するのかと疑問に思われるかもしれません。Amazonは世界最大のオンラインショッピングプラットフォームの1つであり、貴重なデータを提供する重要なソースとして広く活用されています。このデータには、商品、価格、顧客からのフィードバック、新たなトレンドなど、多岐にわたる詳細が含まれています。たとえば、販売業者は競合他社を監視するためにこのデータを活用できるほか、研究者は市場動向を研究するためにこのデータを利用でき、消費者は十分な情報を得た上で商品を購入することができるでしょう。その可能性は無限です。

このチュートリアルでは、  Beautiful Soup や Playwright などのツールを利用しながらAmazonをスクレイピングする方法を紹介します。段階的にプロセスを進めていく中で、プロセスを大幅に加速できる Bright Dataの ソリューションについても学ぶことができます。

PythonでAmazonを手動スクレイピング

Amazonのウェブサイトからデータを抽出する前に、マシンに必要な全てのライブラリがインストールされていることを確認してください。ウェブスクレイピングとHTMLについて基本的な知識があれば、より理解しやすくなります。

重要事項: このチュートリアルはあくまでも教育を目的としたものであり、技術的な性能のデモンストレーションを行うためのものです。Amazonからデータをスクレイピングする際には、利用規約や法的な制約に違反する可能性があることを認識しておく必要があります。許可なくスクレイピングを行った場合、法的措置やアカウント停止などの重大な結果を招く可能性があります。常に慎重に行動し、倫理的な慣行を守ることが重要です。

前提条件

このチュートリアルを続行するためには、マシンにPythonがインストールされている必要があります。Pythonを初めて使用する場合は、この Pythonでスクレイプする方法ガイド を読んで、詳細な手順を確認してください。すでにPythonを使用されている場合は、お使いのバージョンが 3.7.9 以降であることを確認してください。

Pythonの準備ができたところで、ターミナルまたはシェルを開き、次のコマンドを使用して新しいプロジェクトディレクトリを作成してください:

mkdir scraping-amazon-python && cd scraping-amazon-python

プロジェクトディレクトリを作成したら、次のステップは、効果的なウェブスクレイピングに必須となる追加ライブラリのセットをインストールすることです。具体的には、PythonでHTTPリクエストを処理するために設計されたライブラリである Requests、データの操作と分析に特化した堅牢なライブラリである pandas、HTMLコンテンツの解析を目的とした Beautiful Soup (BS4) 、さらにWebブラウジングに関連するタスクを自動化する Playwright を使用します。

これらのライブラリをインストールするには、ターミナルまたはシェルを開き、以下のコマンドを実行してください:

pip3 install beautifulsoup4
pip3 install requests
pip3 install pandas
pip3 install playwright
playwright install

インストールプロセスが問題なく終了したことを確認した上で、次のステップに進んでください。

注意: 最後のコマンド (ie playwright install) は、必要となるブラウザバイナリが正しくインストールされていることを確認するために極めて重要です。

Amazon のレイアウトとデータコンポーネントのナビゲート

必要なライブラリをインストールしたら、そのウェブサイトの構造に慣れる必要があります。Amazonのメインページには使いやすい検索バーがあり、電子機器から書籍まで、ありとあらゆる商品を検索することができます。

検索条件を入力すると、検索結果がリスト形式で表示されます。このリストには、商品のタイトル、価格、評価、その他の関連情報が記載されています。ここでポイントとなるのは、これらの検索結果は、価格帯、商品カテゴリ、カスタマーレビューなどのさまざまなフィルターを使って並べ替えることができる点です:

Amazon

より詳細な結果リストが必要な場合は、ページの下部にあるページネーションボタンを利用できます。通常、各ページには多数のリストが掲載されているため、その他の商品も閲覧することができます。ページの上部にあるフィルターを使用すると、要件に応じて検索を絞り込むことができます。

AmazonのHTML構造を理解するには、次の手順に従ってください:

  1.  Amazonのウェブサイトにアクセスします。
  2. 検索バーに希望の商品を入力するか、おすすめリストからカテゴリーを選択します。
  3. 商品を右クリックし、 Inspect Elementを選択して、ブラウザの開発者ツールを開きます。
  4. HTMLレイアウトを調べて、抽出するデータのタグと属性を特定します。

Amazonにある商品のスクレイプ

Amazonの商品構造について理解したところで、このセクションでは、商品名、評価、評価数、価格などの詳細情報を収集していきます。

プロジェクトディレクトリで、 amazon_scraper.py という名前の新しいPythonスクリプトを作成し、それに次のコードを追加してください:

import asyncio
from playwright.async_api import async_playwright
import pandas as pd
async def scrape_amazon():
    async with async_playwright() as pw:
        # Launch new browser
        browser = await pw.chromium.launch(headless=False)
        page = await browser.new_page()
        # Go to Amazon URL
        await page.goto('https://www.amazon.com/s?i=fashion&bbn=115958409011')
        # Extract information
        results = []
        listings = await page.query_selector_all('div.a-section.a-spacing-small')
        for listing in listings:
            result = {}
            # Product name
            name_element = await listing.query_selector('h2.a-size-mini > a > span')
            result['product_name'] = await name_element.inner_text() if name_element else 'N/A'
            
            # Rating
            rating_element = await listing.query_selector('span[aria-label*="out of 5 stars"] > span.a-size-base')
            result['rating'] = (await rating_element.inner_text())[0:3]await rating_element.inner_text() if rating_element else 'N/A'
            
            # Number of reviews
            reviews_element = await listing.query_selector('span[aria-label*="stars"] + span > a > span')
            result['number_of_reviews'] = await reviews_element.inner_text() if reviews_element else 'N/A'
            
            # Price
            price_element = await listing.query_selector('span.a-price > span.a-offscreen')
            result['price'] = await price_element.inner_text() if price_element else 'N/A'
            if(result['product_name']=='N/A' and result['rating']=='N/A' and result['number_of_reviews']=='N/A' and result['price']=='N/A'):
                pass
            else:
                results.append(result)
        # Close browser
        await browser.close()
        
        return results
# Run the scraper and save results to a CSV file
results = asyncio.run(scrape_amazon())
df = pd.DataFrame(results)
df.to_csv('amazon_products_listings.csv', index=False)

このコードでは、PythonとPlaywrightライブラリの非同期機能を利用して、特定の Amazon ファッションページから商品リストをスクレイピングしています。新しいブラウザ画面を立ち上げ、対象のAmazonのURLに移動すると、商品名、評価、レビュー数、価格などの商品情報が抽出されます。ページ上の各リスティングを繰り返し処理した後、データのないリストを除外します(ie 「N/A」とマークします)。そうすると、スクレイピングの結果はPandas DataFrameに保存され、その後 amazon_products_listings.csvという名前のCSVファイルにエクスポートされます。

スクリプトを実行するには、ターミナルまたはシェルで python3 amazon_scraper.py を実行します。出力は次のようになります:

product_name,rating,number_of_reviews,price
Crocs Women's Kadee Ii Sandals,4.2,17.5K+,$29.99
Teva Women's W Flatform Universal Sandal,4.7,7K+,$58.80
"OOFOS OOriginal Sport Sandal - Lightweight Recovery Footwear - Reduces Stress on Feet, Joints & Back - Machine Washable - Hand-Painted Graphics",4.5,9.4K+,N/A
"Crocs Women's Brooklyn Low Wedges, Platform Sandals",4.6,11.7K+,N/A
Teva Women's Original Universal Sandal,4.7,18.7K+,$35.37
Reef Women's Water Vista Sandal,4.5,1.9K+,$59.95
Crocs Women's Brooklyn Platform Slides Sandal,4.2,376,N/A
…output omitted…

注意: 初めて実行したときにスクリプトがうまく機能しない場合は、もう一度実行してみてください。Amazonは高度なスクレイピング対策を講じており、データスクレイピングを試みた場合、その動作が防止されたりブロックされたりする可能性があります。

Amazonにおける高度なスクレイピングテクニック

Amazonでスクレイピングを始めると、複雑で入り組んだウェブページで知られるこのオンラインショッピングの巨人が課題を突きつけてくることに気がつくことでしょう。そして、この課題に対処するためには、基本的なスクレイピング手法だけでは不十分です。スムーズで効率的なスクレイピングを可能にしてくれる高度なテクニックをいくつかご紹介します:

ページネーションの処理

Amazonでは複数の商品が表示されており、多くの場合、複数のページにまたがっています。全てのデータをキャプチャするためには、複数のページをスムーズに移動できるスクリプトが必要となります。一般的な方法の1つは、商品リストの下部にある 次へ ボタンをターゲットにすることです。独自のセレクターを識別することで、このボタンを クリックして 次のページに移動するようにスクリプトをプログラムすることができます。ただし、次のアクションに進む前に、ページの全てのエレメントが完全に読み込まれるのを待つ必要があります。

広告回避

Amazonの商品リストに広告が表示されることがよくあります。これらの広告は通常の商品とは異なる構造を持っている場合があり、それが原因でスクレイピングプロセスに問題が生じることがあります。これを解決するには、広告を示すエレメントやタグを検出する必要があります。たとえば、 Sponsored や Adなどのラベルの付いたタグを探してみましょう。検出されたら、スクリプトにこれらのエントリをスキップするように指示し、本物の商品データのみを収集することが可能です。

ブロッキングの軽減

Amazonはコンテンツに厳重な注意を払っており、ロボットや疑わしいアクティビティが検出されると、それをブロックまたは一時的に停止する場合があります。スクレイパーができるだけ人間に似た動作を行うことが重要です。

ブロックされないようにするには、 asyncio.sleep (random.uniform (1, 5))などの関数を使用して、リクエスト間に遅延またはランダムな間隔を設ける必要があります。これにより、スクレイピングのパターンが自動的なものではなくなります。さらに、検出のリスクを減らすために、ユーザーエージェントとIPアドレスを定期的に変更することも検討してください。CAPTCHAの問題に直面したときには、CAPTCHA解決サービスを利用するのもよいでしょう。

コンテンツを動的に処理

レビューやQ&Aセクションなど、Amazonのコンテンツの一部は動的に読み込まれるため、基本的なスクレイパーではこのデータを見逃してしまう可能性があります。JavaScriptを実行できるスクレイパーを使用し、ページ上で動的に読み込まれるコンテンツが完全に読み込まれるのを待つ必要があります。 Playwright や Seleniumなどのツールを使用すると、スクレイパーが特定の要素が表示されるのを待つための明示的な待機機能を利用できます。

スクレイピング制限を設定

残念ながら、多数の同時リクエストを送信すると、IPブラックリストに登録される可能性があります。これを防ぐためには、リクエストを送信する速度を制限する必要があります。

Amazonのサーバーに負荷がかからないようにスクリプトを設計してください。前述の方法で述べたように、リクエスト間に適切な時間の遅延を設定することが肝心です。

これらの高度な技術を利用することで、Amazonでのスクレイピング作業がより効率的になるだけでなく、スクレイパーが検出されたりブロックされたりするリスクが低減し、スクレイパーの寿命を延ばすこともできます。

AmazonでのスクレイピングにはBright Dataの使用をご検討ください

データ収集が小規模な場合は手動でのウェブスクレイピングでも問題ないかもしれませんが、大規模な収集になると手動では効率が悪くなり、作業時間が増える可能性があります。Amazonから大量のデータを収集する際には、効率的な手段としてBright Dataを利用することもご検討ください。

Bright Data スクレイピングブラウザを使用すると、JavaScriptやAJAXリクエストなどの複雑な処理を効果的に処理できるため、Amazonなどの動的なウェブサイトをスムーズに操作することが可能です。または、商品リスト、レビュー、販売者プロフィールなど、構造化されたAmazonデータをを迅速に入手したい場合は、そのサイトの Amazonデータセットに直接アクセスして、プラットフォームから選り抜いたデータをダウンロードして利用することができます。

Bright Dataアカウントの作成

Bright Dataを利用するためには、まずアカウントを作成し、設定を行う必要があります。そのためには以下の手順に従ってください:

ブラウザを開き、 Bright Data ウェブサイトにアクセスしてください。 [無料トライアルを開始] をクリックし、指示に従って続行してください。

ダッシュボードを開いたら、左側のサイドバーにあるクレジットカードアイコンを見つけ、 [請求] ページにアクセスしてください。 ここで有効な支払い方法を登録して、アカウントを有効化してください:

[請求] ページ。

次に、それぞれのアイコンを選択して [プロキシとスクレイピングインフラストラクチャ] セクションに移動します。[スクレイピングブラウザ]を選択 > [始める]を選択します

スクレイピングブラウザ

ソリューションに適切な名前を付け、 [追加] ボタンで確認します:

 アクセスパラメータで、ユーザー名、ホスト(デフォルト)、パスワードを書き留めてください。後でこれらの情報が必要になります:

以上の手順を全て完了すると、データを抽出する準備が整った状態になります。

スクレイピングブラウザを使用して、Amazon商品データを抽出

Bright Dataを使用してAmazonから商品データのスクレイピングを開始するには、 amazon_scraper_bdata.py という名前の新しいファイルを作成し、それに次のコードを追加してください:

import asyncio
from playwright.async_api import async_playwright
import pandas as pd
username='YOUR_BRIGHTDATA_USERNAME'
password='YOUR_BRIGHTDATA_PASSWORD'
auth=f'{username}:{password}'
host = 'YOUR_BRIGHTDATA_DEFAULT_HOST'
browser_url = f'wss://{auth}@{host}'
async def scrape_amazon_bdata():
    async with async_playwright() as pw:
        print('connecting')
        # Launch new browser
        browser = await pw.chromium.connect_over_cdp(browser_url)
        print('connected')
        page = await browser.new_page()
        print('navigating')
        # Go to Amazon URL
        await page.goto('https://www.amazon.com/s?i=fashion&bbn=115958409011', timeout=600000)
        print('data extraction in progress')
        # Extract information
        results = []
        listings = await page.query_selector_all('div.a-section.a-spacing-small')
        for listing in listings:
            result = {}
            # Product name
            name_element = await listing.query_selector('h2.a-size-mini > a > span')
            result['product_name'] = await name_element.inner_text() if name_element else 'N/A'
            
            # Rating
            rating_element = await listing.query_selector('span[aria-label*="out of 5 stars"] > span.a-size-base')
            result['rating'] = (await rating_element.inner_text())[0:3]await rating_element.inner_text() if rating_element else 'N/A'
            
            # Number of reviews
            reviews_element = await listing.query_selector('span[aria-label*="stars"] + span > a > span')
            result['number_of_reviews'] = await reviews_element.inner_text() if reviews_element else 'N/A'
            
            # Price
            price_element = await listing.query_selector('span.a-price > span.a-offscreen')
            result['price'] = await price_element.inner_text() if price_element else 'N/A'
            if(result['product_name']=='N/A' and result['rating']=='N/A' and result['number_of_reviews']=='N/A' and result['price']=='N/A'):
                pass
            else:
                results.append(result)
        # Close browser
        await browser.close()
        
        return results
# Run the scraper and save results to a CSV file
results = asyncio.run(scrape_amazon_bdata())
df = pd.DataFrame(results)
df.to_csv('amazon_products_bdata_listings.csv', index=False)

このコードでは、 Playwright ライブラリと asyncio を組み合わせて使用して、Amazonのウェブページから商品の詳細を非同期で取得しています。プロキシサービスであるBright Dataの認証情報の設定は完了していますので、次はこのサービスを使用してブラウザに接続します。

接続すると、スクリプトは指定された Amazon URL に移動し、商品名、評価、レビュー数、価格などの情報を抽出し、それらの詳細をリストにまとめます。特定の商品に前述のデータが一切ない場合、その商品はスキップされます。

スクレイピングが完了すると、ブラウザは閉じられ、抽出された商品の詳細が amazon_products_bdata_listings.csvという名前のCSVファイルに保存されます。

重要:  YOUR_BRIGHTDATA_USERNAME、 YOUR_BRIGHTDATA_PASSWORD、および YOUR_BRIGHTDATA_HOST を、お客様固有のブライトデータゾーンアカウントの詳細情報(「アクセスパラメータ」タブにあります)に 置き換えてください。

次のコマンドを使用してターミナルまたはシェルからコードを実行します:

python3 amazon_scraper_bdata.py

出力は次のようになります:

product_name,rating,number_of_reviews,price
Women's Square Neck Bodice Dress Sleeveless Tank Top Stretch Flare Mini Dresses,N/A,131,$32.99
"Women's Swiftwater Sandal, Lightweight and Sporty Sandals for Women",N/A,"35,941",$19.95
Women's Elegant Sleeveless Off Shoulder Bodycon Long Formal Party Evening Dress,N/A,"3,122",$49.99
Women 2023 Summer Sleeveless Tank Dresses Crew Neck Slim Fit Short Casual Ruched Bodycon Party Club Mini Dress,N/A,"40,245",$33.99
"Infinity Dress with Bandeau, Convertible Bridesmaid Dress, Long, Plus Size, Multi-Way Dress, Twist Wrap Dress",N/A,"11,412",$49.99
…output omitted…

手動でAmazonをスクレイピングするとCAPTCHAやアクセス制限などの問題が生じる可能性がありますが、Bright Dataのスクレイピングブラウザはこれらの課題に対処する柔軟性と回復力を提供し、データ抽出の中断がないことを保証します。

Bright DataのAmazonデータセット

ご自分で手動でデータを収集したくない方向けに、Bright Dataはすでに作成された Amazonデータセットも提供しています。 これらのデータセットには、商品の詳細からユーザーレビューまで、あらゆるものが含まれています。これらのデータセットを使用すれば、自分でウェブサイトをスクレイピングする必要がなくなるのはもちろん、データがすでに整理されているので、すぐに利用することが可能です。

これらのデータセットを見つけるには、Bright Data ダッシュボードに移動し、左側の [データセットとウェブスクレイパー IDE] をクリックしてください。次に、 データセットマーケットプレイスから [データを取得] をクリックします:

検索バーで「amazon」と検索します。 [データセットを表示]をクリックします:

必要なデータセットを選択してください。フィルターを使用して、選択肢を絞り込むこともできます。費用はデータの量に応じて変動しますので、必要なものと予算に合わせて選択するようにしてください:

このチュートリアルで使用されているコードは、次の GitHubリポジトリにあります。

まとめ

このチュートリアルではPythonを使って手動でAmazonからデータを収集する方法を学びました。ただし、この方法には、CAPTCHA やレート制限など、効率的なデータスクレイピングを妨げる潜在的な課題が伴います。しかしながら、 Bright Data のツールとそのスクレイピングブラウザを活用すれば、プロセスを効率化し、これらの課題を軽減することが可能です。

Bright Dataは、Amazonなどのウェブサイトからのデータ収集を容易にするツールを提供しています。これらのツールは、厄介なウェブスクレイピング作業を簡素化し、時間とエネルギーの両方を節約します。

さらに、Bright Dataでは、特にAmazon向けに、すぐに使用できるデータセットを提供しています。つまり、ゼロから始める必要はなく、膨大な量のAmazonデータに直接アクセスすることができるのです。

Bright Dataツールを活用することで、データ収集が簡単になり、新たな洞察や知識を得ることができます。Bright Dataを使って、新しいデータの可能性を発見してみましょう!