Eコマースウェブサイトのスクレイピングガイド

このステップガイドでは、PlaywrightとBright DataのScraping Browserを使ってEコマースサイトをスクレイピングする方法を説明します。
5 min read
How to scrape ecommerce websites

目まぐるしく変化するEコマースの世界では、時代の最先端を走り続けるということは、常に競合に目を配り続けることを意味します。その方法の1つが、ウェブサイトからデータを抽出する技術であるウェブスクレイピングです。この記事は、経験豊富な開発者にも、データ抽出の世界に足を踏み入れたばかりの初心者にも、Eコマースウェブサイトのウェブスクレイピングを詳しく理解するのに役立つように構成されています。

競合分析、市場調査、価格監視、リードジェネレーション、データ主導の意思決定など、Eコマースウェブサイトのスクレイピングに興味を持つ理由はさまざまです。

このチュートリアルでは、Eコマースウェブサイトをスクレイピングする際に直面する一般的な課題と、PythonライブラリであるPlaywrightおよびBright DataのScraping Browserを使用してスクレイピングする方法について説明します。

ローカルブラウザーを使ったウェブスクレイピングの問題点

膨大な量のデータを抽出するスクレイパーを記述できるとしたらそれは素晴らしいことですが、初めてそれを行うプロセスは簡単とは言い難いものです。たとえば、ローカルブラウザを使用する場合、開発者は効率と有効性を妨げる可能性のあるさまざまな問題に直面することがよくあります。最も一般的な問題には、次のようなものがあります。

  1. IPブロッキング:ウェブサイトは多くの場合、リクエストを行うIPアドレスを追跡します。単一のIPからの異常な数のリクエストが検出された場合(ウェブスクレイピングやブルートフォースにおいて典型的)、そのIPがブロックされる可能性があります。ローカルブラウザを使用する場合、すべてのリクエストは単一のIPから送信されるため、これは重大な問題となります。
  2. レート制限:多くのウェブサイトはレート制限を実装しており、特定の期間内にIPアドレスから一定数のリクエストのみを許可します。この制限を超えると、それ以上のリクエストはブロックされるか、速度が低下し、スクレイピングプロセスが妨げられる可能性があります。
  3. プロキシの欠如:プロキシのプールがない場合、スクレイピング操作のリクエストすべては同じIPアドレスから送信されます。これにより、ウェブサイトはスクレイピング行為を検知し、ブロックしやすくなります。対照的に、プロキシのプールを使うことで、リクエストが異なるIPアドレスから送信されるようになり、検知されるリスクを軽減できます。
  4. CAPTCHAチャレンジ:ウェブサイトは、ユーザーがボットではなく人間であることを確認するためにCAPTCHAチャレンジを使用することがあります。ローカルブラウザには、これらのチャレンジを自動的に解決する機能がないことが多く、スクレイピング作業の大きな障害となっています。
  5. 動的なウェブサイトコンテンツ:最新のウェブサイトの多くは、JavaScriptを使ってコンテンツを動的に読み込みます。ローカルブラウザでは、これらのウェブサイトを正確にスクレイピングするのに苦労する可能性があります。スクレイピングを開始する前にコンテンツが完全に読み込まれていない可能性があるためです。

ローカルブラウザを使用したスクレイピングでは、これらの問題が複雑に絡み合い、ウェブスクレイピングを困難なものにしています。IPローテーションや自動CAPTCHA解決などの高度な機能がないため、スクレイピングプロセスが遅くなり、収集されるデータの質と量が低下する可能性があります。開発者がこれらの一般的な問題を認識し、効果的に回避するためのツールとテクニックを見い出すことが極めて重要です。

次のセクションでは、Bright Data Scraping Browserがどのようにこれらの問題を解決し、ウェブスクレイピングをよりスムーズで生産的なものにするかを説明します。

Bright Data Scraping Browserを使ってスクレイピングする方法

ウェブスクレイピングの世界では、Bright Dataは最先端のプロバイダーとして際立っています。Bright Dataの提供するサービスの中心には、データ抽出で直面する課題に対処するために特別に設計されたツールであるWeb Scraping Browserがあります。

Scraping Browserは、広大なレジデンシャルおよびモバイルIPプールにアクセスできるため、IPブロッキングの問題に簡単に対処できます。つまり、IPをローテーションし、オーガニックユーザーの行動をエミュレートすることで、ブロックされるリスクを大幅に減らすことができます。

同様に、Bright Dataの広範なIPプールを活用することで、Scraping Browserは複数のIPにリクエストを分散させることができ、レート制限の問題を効果的に軽減できます。さらに、Scraping Browserを使用すると、自動プロキシ管理が可能になります。これは、スクレイピングブラウザがプロキシのローテーションを処理し、手動による介入なしでスクレイピングアクティビティを継続できることを意味します。

Scraping Browserは、高度なブラウザフィンガープリント保護も提供するため、実際のユーザーを模倣できます。これにより、ウェブサイトがスクレイピング作業を検出してブロックすることが困難になります。

Scraping Browser CP

これらの機能を念頭に置いてチュートリアルに進み、Bright Data Scraping Browserを使用してEコマースウェブサイトをスクレイピングする方法を学びましょう。ここでは、プログラミング言語としてPythonを使用します。

ステップ1:新しいPythonプロジェクトをセットアップする

このチュートリアルの最初のステップは、新しいPythonプロジェクトをセットアップすることです。これがスクレイピングタスクのワークスペースとなります。お好みのテキストエディターまたは統合開発環境(IDE)をお使いください。

さらに、お使いのマシンにPythonがインストールされていることを確認してください。これを確認するには、ターミナルにpython -- versionと入力します。Pythonがインストールされていれば、このコマンドでそのバージョンが表示されます。そうでない場合は、インストールする必要があります。

Pythonがインストールされていることを確認したら、プロジェクトディレクトリを作成します。ターミナルを開き、プロジェクトを配置する場所に移動します。次に、以下のコマンドを入力します。

mkdir ecommerce-scraping   # This command creates a new directory named ecommerce-scraping.
cd ecommerce-scraping      # This command navigates into the newly created directory.
python -m venv env         # This command creates a new virtual environment in your project directory.
source env/bin/activate    # This command activates the virtual environment.

仮想環境を作成するのは良い方法です。プロジェクトとその依存関係を他のPythonプロジェクトから分離し、異なるバージョンのライブラリ間の競合を防ぐことができるからです。

ステップ2:プロジェクトにPlaywrightをインストールする

Playwrightは、ウェブブラウザの自動化とテストを実行するためのPythonライブラリです。これを使用してScraping Browserを制御します。

Playwrightをインストールするには、Pythonのパッケージインストーラであるpipを使用します。

pip install playwright

Playwrightのインストール後に、playwright installコマンドを実行する必要があります。これにより、Playwrightがブラウザを自動化するために必要なブラウザバイナリがダウンロードされます。

playwright install

ステップ3:新しいBright Dataアカウントを設定する

次に、Bright Dataアカウントが必要です。お持ちでない場合は、Bright Dataのウェブサイトにアクセスして登録してください。アカウントを取得すると、Scraping Browserインスタンスを作成および管理し、固有の認証情報にアクセスできるようになります。

ステップ4:新しいScraping Browserインスタンスを作成する

Bright Dataアカウントにアクセスできるようになったら、ログインし、Scraping Browserセクションに移動して新しいScraping Browserインスタンスを作成します。

Scraping Browserに接続する際に必要になるため、ホストIDをメモしておきます。

ステップ5:Scraping Browserインスタンスに接続する

次に、PlaywrightをScraping Browserインスタンスに接続します。Bright Dataのドキュメントには、出発点として使用できるサンプルスクリプトが掲載されています。YOUR_ZONE_USERNAMEYOUR_ZONE_PASSWORDYOUR_ZONE_HOSTは、実際のBright Data認証情報と、作成したScraping BrowserインスタンスのIDに置き換えてください:

import asyncio
from playwright.async_api import async_playwright

auth = 'YOUR_ZONE_USERNAME:YOUR_ZONE_PASSWORD'
browser_url = f'wss://{auth}@YOUR_ZONE_HOST'

async def main():
    async with async_playwright() as pw:
        print('connecting');
        browser = await pw.chromium.connect_over_cdp(browser_url)
        print('connected');
        page = await browser.new_page()
        print('goto')
        await page.goto('https://example.com', timeout=120000)
        print('done, evaluating')
        print(await page.evaluate('()=>document.documentElement.outerHTML'))
        await browser.close()

asyncio.run(main())

このファイルをmain.pyとしてプロジェクトディレクトリに保存します。次に、以下のようにスクリプトを実行します。

python main.py

このスクリプトは、Chromiumブラウザの新しいインスタンスを開始し、指定したURLに移動します。次に、ウェブページのコンテンツを出力して、ブラウザを閉じます。

これで、Scraping Browserインスタンスに接続できることを確認できました。これは基本スクリプトなので、コードをすばやく確認しておきましょう。

  • import asyncio, async_playwrightはこのスクリプトに必要なインポートです。asyncioはコルーチンを使用してシングルスレッド同時実行コードを記述するためのライブラリで、async_playwrightはPlaywrightライブラリの非同期APIです。
  • auth = 'YOUR_ZONE_USERNAME:YOUR_ZONE_PASSWORD'は、ゾーンのユーザー名とパスワードを利用して、Bright Data Scraping Browserの認証を設定します。
  • browser_url = f'wss ://{auth}@YOUR_ZONE_HOSTは、Bright Data Scraping Browserに接続するWebSocket URLを構築します。
  • browser = await pw.chromium.connect_over_cdp(browser_url)は、Chromiumブラウザを使用してBright Data Scraping Browserに接続します。awaitキーワードは、接続が確立されるまで関数の実行を一時停止します。
  • await page.goto('https://example.com', timeout=120000)は、指定されたURLにページを移動します。timeoutパラメータは、エラーをスローする前にナビゲーションが完了するまでの待機時間を指定します。
  • print(await page.evaluate('()=>document.documentElement.outerHTML'))は、ページのコンテキストでJavaScriptコードを評価し、結果を出力します。この場合、JavaScriptコードはページ全体のHTMLコンテンツを返します。

ステップ6:Eコマースウェブサイトをスクレイピングする

Scraping Browserインスタンスに接続し、スクレイピングを開始する準備が整いました。このチュートリアルでは、スクレイピングが許可されているサンドボックスのEコマースウェブサイトである、Books to Scrapeをスクレイピングします。

main.pyファイルを開き、内容を以下のコードに置き換えてから、ターミナルでこのスクリプトを実行します。

import asyncio
from playwright.async_api import async_playwright

auth = 'YOUR_ZONE_USERNAME:YOUR_ZONE_PASSWORD'
browser_url = f'wss://{auth}@YOUR_ZONE_HOST'

async def main():
    async with async_playwright() as pw:
        print('connecting');
        browser = await pw.chromium.connect_over_cdp(browser_url)
        print('connected');
        page = await browser.new_page()
        print('goto')
        await page.goto('https://books.toscrape.com', timeout=120000)
        print('done, evaluating')
        print(await page.evaluate('()=>document.documentElement.outerHTML'))
        await browser.close()

asyncio.run(main())

Books to Scrapeのホームページの内容が出力されます。この時点では、スクリプトを実行しても、ターゲットウェブサイトのHTMLコンテンツ全体を取得できるだけで、役に立つものは何も返されません。

ステップ7:構造化された情報を抽出する

このチュートリアルをもう少し役立つものにするために、構造化データをいくつか抽出してみましょう。このプロセスは、どんなデータに関心があるかによって異なりますが、この例ではホームページ上の書籍名と価格を抽出します。

まず、books.toscrape.comのホームページを調べ、書籍名と価格を含むHTML要素を特定します。書籍名は<article class= "product_pod">内の<h3>タグの中にあり、価格は同じ<article>タグ内の<p class= "price_color">タグの中にあります。

この情報を抽出するためにスクリプトを変更する方法を以下に示します。

from playwright import sync_playwright

auth = 'YOUR_ZONE_USERNAME:YOUR_ZONE_PASSWORD'
browser_url = f'wss://{auth}@YOUR_ZONE_HOST'

async def main():
    async with async_playwright() as pw:
        print('connecting')
        browser = await pw.chromium.connect_over_cdp(browser_url)
        print('connected')
        page = await browser.new_page()
        print('goto')
        await page.goto('https://books.toscrape.com', timeout=120000)
        print('done, evaluating')
        
        # Find all the books in the article elements
        books = await page.query_selector_all('article.product_pod')

        # Extract and print each book details in a loop
        async def get_book_details(book):
            # Extract and print book name and price
            book_name_element = await book.query_selector('h3 > a')
            book_name = await book_name_element.get_attribute('title')
            book_price_element = await book.query_selector('div.product_price > p.price_color')
            book_price = await book_price_element.inner_text()
            print(f'{book_name}: {book_price}')

        # Use asyncio.gather() to execute all async calls concurrently
        await asyncio.gather(*(get_book_details(book) for book in books))

        await browser.close()

asyncio.run(main())

このスクリプトを実行すると、書籍名とその価格のリストがターミナルに表示されます。以下のようになります。

スクリプト実行後のコード

これは非常に単純な例ですが、PlaywrightとBright Dataを使用して、ウェブサイトから構造化データを抽出する方法を示しています。このスクリプトを応用して、他のページやウェブサイトからさまざまな種類のデータをスクレイピングできます。

次に、さらに一歩進んで、スクレイピングされたデータを含むCSVファイルを生成しましょう。

ステップ8:スクレイピングしたデータをCSVファイルに保存する

スクレイピングしたデータをCSVファイルに保存するには、csvモジュールをインポートし、main()関数内で新しいCSVファイルを作成する必要があります。その後、get_book_details()関数でスクレイピングしたデータをCSVファイルに書き込むことができます。

main.pyファイルを開き、以下のコードを追加します。

import asyncio
import csv
from playwright.async_api import async_playwright

auth = 'YOUR_ZONE_USERNAME:YOUR_ZONE_PASSWORD'
browser_url = f'wss://{auth}@YOUR_ZONE_HOST'

async def main():
    async with async_playwright() as pw:
        print('connecting')
        browser = await pw.chromium.connect_over_cdp(browser_url)
        print('connected')
        page = await browser.new_page()
        print('goto')
        await page.goto('https://books.toscrape.com', timeout=120000)
        print('done, evaluating')

        # Find all the books in the article elements
        books = await page.query_selector_all('article.product_pod')

        async def get_book_details(book):
            # Extract book name and price
            book_name_element = await book.query_selector('h3 > a')
            book_name = await book_name_element.get_attribute('title')
            book_price_element = await book.query_selector('div.product_price > p.price_color')
            book_price = await book_price_element.inner_text()

            return book_name, book_price

        # Use asyncio.gather() to execute all async calls concurrently
        book_details = await asyncio.gather(*(get_book_details(book) for book in books))

        # Write book details to a CSV file
        with open('books.csv', 'w', newline='') as f:
            writer = csv.writer(f)
            writer.writerow(['Book Name', 'Price'])  # Write header
            writer.writerows(book_details)  # Write book details

        await browser.close()

asyncio.run(main())

このスクリプトを実行すると、プロジェクトディレクトリにbooks.csvという新しいファイルができます。このファイルを開くと、以下のようにスクレイピングされたデータをCSV形式で見ることができます。

まとめ

このチュートリアルでは、PlaywrightとBright Dataを使用して、Eコマースウェブサイトからデータをスクレイピングする方法を説明しました。このチュートリアルは、PlaywrightとBright Data Scraping Browserでできることのほんの一部を紹介したに過ぎません。Bright Data Scraping Browserは、高度なボット対策検出技術を使用するウェブサイトからのデータ収集をロック解除することに焦点を当てたプロキシブラウザソリューションです。この記事で取り上げた基本事項を組み合わせてより高度なワークフローを作り上げることで、プライスマッチ、市場分析、リードジェネレーションなどを自動化できます。

バックグラウンドで、Bright Dataは完全なプロキシインフラストラクチャを使用して、何百万ものIPプールを経由してリクエストをルーティングします。これにより、ブロックされたり禁止されたりすることなく、ウェブサイトからデータをスクレイピングできます。無料トライアルにサインアップし、今すぐScraping Browserをお試しください!

Eコマースウェブサイトのスクレイピングは省略して、データだけを取得したいですか?Eコマースデータセットをご購入ください