ブライトデータのスクレイピング・ブラウザを使ったWebスクレイピング on Apify

Bright DataのScraping BrowserとApifyを統合して、Webスクレイピングの効率を向上させ、コストを削減し、アンチボットの課題を回避する方法をご覧ください。
7 分読
Scraping Browser + Apify blog image

このブログ記事で、あなたは学ぶだろう:

  • アピファイとは
  • アピファイでスクレイピング・ブラウザを使用することは、なぜWin-Winのシナリオなのか?
  • Bright DataのスクレイピングブラウザをApify Pythonスクリプトに統合する方法
  • ブライトデータのプロキシをApifyで使用する方法

さあ、飛び込もう!

アピファイとは?

ApifyはフルスタックのWebスクレイピングとデータ抽出プラットフォームです。Actorと呼ばれるカスタムWebスクレイピングツールをクラウド上で作成し、実行することができます。これらのアクターは、データ収集、処理、自動化に関連するタスクを自動化します。

Apifyでは、スクレイピングスクリプトを公開し、他のユーザーが利用できるようにすることで、収益化することができます。Actor を個人的に利用するにしても、公開するにしても、Bright Data のスクレイピングソリューションは、スクレイパーをより信頼性の高い効果的なものにするのに役立ちます。

ブライトデータのスクレイピングブラウザをApifyで使う理由

Bright DataのScraping Browserの価値を理解するためには、このツールが何であり、何を提供しているかを理解する必要があります。

ブラウザ自動化ツールの最大の限界は、そのAPIではなく、制御するブラウザにある。スクレイピング・ブラウザは、ウェブ・スクレイピングのために特別に設計された次世代ウェブ・ブラウザである。特に、次のような主要機能を備えている:

  • 検出を回避する信頼性の高いTLSフィンガープリント
  • 大規模データ抽出のための無制限のスケーラビリティ
  • 1億5,000万IPプロキシネットワークによる内蔵IPローテーション
  • 失敗したリクエストを処理するための自動再試行
  • CAPTCHA解決能力

Scraping Browserは、Playwright、Puppeteer、Seleniumを含むすべての主要なブラウザ自動化フレームワークと互換性があります。そのため、新しいAPIを学んだり、サードパーティの依存関係をインストールしたりする必要はありません。既存のブラウザオートメーションスクレイピングスクリプトに直接統合するだけです。

今、Scraping BrowserとApifyを使用することで、さらに多くの利点がもたらされ、以下のような利点があります:

  • クラウドコストの削減:ブラウザはリソースを大量に消費するため、CPUとRAMの使用率が高くなります。無制限のスケーラビリティが保証されたクラウド上でホスティングされるScraping Browserは、Apifyでアクターを実行する間のクラウドコストを削減します。Apifyはサーバー使用量によって課金されるため、Scraping Browserの料金を考慮しても、このセットアップはコスト削減につながります。
  • オールインワンのアンチボットバイパスツール:スクレイピング・ブラウザは、IPバン、CAPTCHAチャレンジ、ブラウザ・フィンガープリント問題、その他のアンチスクレイピング・バリアに取り組みます。これにより、スクレイピングプロセスがより効率的になり、中断されにくくなります。
  • 組み込みのプロキシ統合:Scraping Browserにはプロキシ管理機能が搭載されているため、プロキシの維持や手動でのローテーションを心配する必要がありません。
  • Apifyの利点:(一般的なスクリプトの代わりに)クラウドのApifyアクターでスクレイピングブラウザを使用することで、次のような利点が
    あります。

Bright DataとApifyの統合は、スクレイピングのワークフローを簡素化するだけでなく、信頼性も向上させます。また、Webスクレイピングボットをオンラインにするために必要な時間と労力を削減します。

Bright DataのスクレイピングブラウザをApifyに統合する方法:ステップバイステップガイド

このセクションのターゲットとなるサイトは、情報量は豊富だがボット対策が厳しいことで悪名高いアマゾンである。適切なツールがなければ、悪名高いAmazon CAPTCHAに遭遇し、スクレイピングの試みがブロックされる可能性が高い:

スクリプトをブロックするAmazon CAPTCHA

このセクションでは、一般的なアマゾンの商品検索ページからデータを抽出するために、Bright Dataのスクレイピング・ブラウザを活用したスクレイピング・アクターを構築します:

アマゾンの商品検索ページ

:アクターはPythonで書かれますが、ApifyはJavaScriptもサポートしていることを覚えておいてください。

Bright DataのスクレイピングツールをApifyと統合する方法は以下のステップに従ってください!

前提条件

このチュートリアルに従うには、以下の前提条件を満たす必要があります:

ステップ1:プロジェクトのセットアップ

新しいApify Actorプロジェクトをセットアップする最も簡単な方法は、Apify CLIを使うことです。まず、以下のコマンドでNode.js経由でグローバルにインストールします:

npm install -g apify-cli

次に、新しいApifyプロジェクトを作成します:

npx apify-cli create

いくつかの質問に答えるよう促されます。以下のように答えてください:

✔ Name of your new Actor: amazon-scraper
✔ Choose the programming language of your new Actor: Python
✔ Choose a template for your new Actor. Detailed information about the template will be shown in the next step.
Playwright + Chrome

こうすることで、Apify CLIはamazon-scraperフォルダに“Playwright + Chrome “テンプレートを使って新しいPython Actorを作成します。これらのツールに慣れていない場合は、Playwrightウェブスクレイピングのガイドをお読みください。

: Bright Dataのスクレイピング・ブラウザは、どのブラウザ自動化ツールとも統合できるので、SeleniumやPuppeteerのテンプレートでも動作します。

あなたのアピファイ・アクター・プロジェクトは次のような構成になります:

amazon-scraper
│── .dockerignore
│── .gitignore
│── README.md
│── requirements.txt
│
├── .venv/
│   └── ...
│
├── .actor/
│   │── actor.json
│   │── Dockerfile
│   └── input_schema.json
│
├── src/
│   │── main.py
│   │── __init__.py
│   │── __main__.py
│   └── py.typed
│
└── storage/
    └── ...

amazon-scraperフォルダを、Python拡張機能付きのVisual Studio Codeや PyCharm Community Editionなど、お好みのPython IDEにロードします。

アクターをローカルで実行するには、Playwrightのブラウザがインストールされている必要があります。そのためには、まずプロジェクトディレクトリ内の仮想環境フォルダ(.venv)をアクティブにします。Windowsの場合、実行します:

.venv/Scripts/activate

同様に、Linux/macOSでは、起動する:

source .venv/bin/activate

次に、必要なPlaywrightの依存関係をインストールしてください:

playwright install --with-deps

素晴らしい!これでアクターをローカルで動かすことができる:

apify run

これでApifyプロジェクトは完全にセットアップされ、Bright Dataのスクレイピングブラウザと統合する準備が整いました!

ステップ2:ターゲットページに接続する

アマゾンの検索結果ページのURLを見てみると、このような形式になっていることに気づくだろう:

https://www.amazon.com/search/s?k=<keyword>

例えば、こうだ:

対象ページのURLに注意

スクリプトのターゲットURLはこの形式を使うべきです。 は、Apify入力引数を使用して動的に設定できます。アクターが受け付ける入力パラメータは、.actorディレクトリにあるinput_schema.jsonファイルで定義されます。

keyword引数を定義すると、スクリプトがカスタマイズ可能になり、ユーザーが好みの検索語を指定できるようになる。このパラメータを定義するには、input_schema.jsonの内容を以下のものに置き換える:

{
    "title": "Amazon Scraper",
    "type": "object",
    "schemaVersion": 1,
    "properties": {
        "keyword": {
            "title": "Search keyword",
            "type": "string",
            "description": "The keyword used to search products on Amazon",
            "editor": "textfield"
        }
    },
    "required": ["keyword"]
}

このコンフィギュレーションでは、文字列型の必須キーワードパラメータを定義します。

Actorをローカルで実行するときにキーワード引数を設定するには、storage/key_value_stores/default内のINPUT.jsonファイルを以下のように変更します:

{
    "keyword": "laptop"
}

こうすると、アクターは「ラップトップ」を検索語としてキーワード入力引数を読み込む。

アクターがアピファイプラットフォームにデプロイされると、アクターを実行する前にこのパラメータをカスタマイズできる入力フィールドが表示されます:

アピファイコンソールの設定されたキーワードテキストフィールド

Apifyアクターのエントリーファイルはsrcフォルダにあるmain.pyです。このファイルを開いて

  1. 入力引数からキーワード・パラメータを読み込む
  2. アマゾンの検索ページのターゲットURLを構築する
  3. Playwrightを使ってそのページに移動する

このステップの終わりまでに、あなたのmain.pyファイルには以下のPythonロジックが含まれているはずです:

from apify import Actor
from playwright.async_api import async_playwright


async def main() -> None:
    # Enter the context of the Actor
    async with Actor:
        # Retrieve the Actor input, and use default values if not provided
        actor_input = await Actor.get_input() or {}
        # Reading the "keyword" argument from the input data, assigning it the
        # value "laptop" as a default value
        keyword = actor_input.get("keyword")

        # Building the target url
        target_url = f"https://www.amazon.com/search/s?k={keyword}"

        # Launch Playwright and open a new browser context
        async with async_playwright() as playwright:
            # Configure the browser to launch in headless mode as per Actor configuration
            browser = await playwright.chromium.launch(
                headless=Actor.config.headless,
                args=["--disable-gpu"],
            )
            context = await browser.new_context()

            try:
                # Open a new page in the browser context and navigate to the URL
                page = await context.new_page()
                await page.goto(target_url)

                # Scraping logic...

            except Exception:
                Actor.log.exception(f"Cannot extract data from {target_url}")

            finally:
                await page.close()

上記のコード:

  1. スクリプトのライフサイクルを管理するために、アピファイ・アクターを初期化します。
  2. Actor.get_input()を使って入力引数を取得する
  3. 入力データからキーワード引数を取り出す
  4. Pythonのf-stringを使ってターゲットURLを構築する。
  5. Playwrightを起動し、GPUを無効にしたヘッドレスChromiumブラウザを起動する。
  6. 新しいブラウザコンテキストを作成し、ページを開き、page.goto()を使用してターゲットURLに移動する。
  7. Actor.log.exception()でエラーをログに記録します。
  8. 実行後にPlaywrightページが閉じられるようにする。

完璧です!あなたのApify Actorは効率的なWebスクレイピングのためにBright Dataのスクレイピングブラウザを利用する準備ができています。

ステップ#3: Bright Dataのスクレイピング・ブラウザの統合

次に、Playwright APIを使用して、ターゲットページに接続した後のスクリーンショットをキャプチャします:

await page.screenshot(path="screenshot.png")

Actorをローカルで実行すると、プロジェクトフォルダにscreenshot.pngファイルが生成されます。それを開くと、次のようなものが表示されます:

スクリプトをブロックするAmazon CAPTCHA

同様に、以下のようなアマゾンのエラーページが表示されるかもしれない:

アマゾンのエラーページ

ご覧のように、あなたのウェブスクレイピングボットはアマゾンのボット対策によってブロックされています。これは、Amazonや他の人気のあるウェブサイトをスクレイピングする際に遭遇する可能性のある多くの課題の一つに過ぎません。

Bright Dataのスクレイピングブラウザは、無制限のスケーラビリティ、自動IPローテーション、CAPTCHA解決、アンチスクレイピングバイパスを提供するクラウドベースのスクレイピングソリューションです。

まずは、Bright Dataのアカウントを作成してください。その後、プラットフォームにログインします。User Dashboard “セクションで、”Get proxy products “ボタンをクリックします:

プロキシ製品を取得する」ボタンを押す

プロキシ&スクレイピング・インフラストラクチャ “ページの “マイ・ゾーン “表で、”scraping_browser “行を選択する:

スクレイピング・ブラウザ製品の選択

オン/オフスイッチを切り替えて製品を有効にする:

スクレイピング・ブラウザの有効化

Configuration(設定)」タブで、「Premium domains(プレミアム・ドメイン)」と「CAPTCHA Solver(キャプチャ・ソルバー)」の両方のオプションが有効になっていることを確認してください:

プレミアムドメイン」と「CAPTCHA Solver」オプションを有効にする

概要」タブで、Playwrightスクレイピングブラウザの接続文字列をコピーする:

Puppeteer / Playwrightスクレイピング・ブラウザの接続文字列をクリップボードにコピーする

接続文字列を定数としてmain.pyファイルに追加します:

SBR_WS_CDP = "<YOUR_PLAYWRIGHT_SCRAPING_BROWSER_CONNECTION_STRING>"

を置き換えてください。 を先ほどコピーした接続文字列に置き換える。

注意: あなたのActorをApifyで公開するつもりなら、SBR_WS_CDPをApify Actorの入力引数として定義してください。そうすることで、あなたのActorを採用するユーザーは、独自のScraping Browser接続文字列を統合することができます。

さて、PlaywrightでScraping Browserを使うためにmain.pyの ブラウザ定義を更新します:

browser = await playwright.chromium.connect_over_cdp(SBR_WS_CDP, timeout=120000)

プロキシを通したIPローテーションやCAPTCHAの解決には時間がかかることがあるため、接続タイムアウトは通常よりも大きな値に設定する必要があることに注意してください。

完了しました!アピファイ・アクター内のPlaywrightにスクレイピング・ブラウザを統合することができました。

ステップ#4:すべての商品リストをスクレイピングする準備

アマゾンから商品リストをスクレイピングするには、まずページを検査してそのHTML構造を理解する必要がある。これを行うには、ページ上の商品要素の1つを右クリックし、”Inspect “オプションを選択します。以下のDevToolsセクションが表示されます:

製品リスト要素の検査

ここでは、このCSSセレクタを使って、各商品リスト要素を選択できることがわかります:

[data-component-type=\"s-search-result\"]

カスタム・データ*属性をターゲットにすることは、これらの属性が一般的にテストやモニタリングに使用されるため、理想的である。したがって、これらの属性は長期間一貫性を保つ傾向があります。

次に、Playwrightのロケーターを使って、ページ上のすべての商品要素を取得します:

product_elements = page.locator("[data-component-type=\"s-search-result\"]")

次に、商品要素を繰り返し、そこからデータを抽出する準備をする:

for product_element in await product_elements.all():
    # Data extraction logic...

驚いた!アマゾンのデータ抽出ロジックを実装する時が来た。

ステップ#5:スクレイピング・ロジックの実装

まず、個々の製品リスト要素を検査する:

商品画像要素

このセクションでは、.s-image要素のsrc属性から商品画像を取得することができます:

image_element = product_element.locator(".s-image").nth(0)
image = await image_element.get_attribute("src")

nth(0)は、ロケータにマッチする最初のHTML要素を取得するために必要であることに注意。

次に、商品のタイトルを確認する:

商品タイトル要素

商品のURLとタイトルは

要素から集めることができます:

title_header_element = product_element.locator("[data-cy=\"title-recipe\"]").nth(0)

link_element = title_header_element.locator("a").nth(0)
url = None if url_text == "javascript:void(0)" else "https://amazon.com" + url_text

title_element = title_header_element.locator("h2").nth(0)
title = await title_element.get_attribute("aria-label")

“javascript:void(0) “を無視するために使用されるロジックに注意してください。URL(特別な広告商品に表示される)を無視するために使用されるロジックと、商品のURLを絶対的なものに変換する処理に注目してください。

そして、レビュー欄を見る:

製品レビューの要素

data-cy="reviews-block"]から、レビューの評価をaria-labelから取得することができます。 要素の

rating_element =  product_element.locator("[data-cy=\"reviews-block\"] a").nth(0)
rating_text = await rating_element.get_attribute("aria-label")
rating_match = re.search(r"(\d+(\.\d+)?) out of 5 stars", rating_text)
if rating_match:
    rating = rating_match.group(1)
else:
    rating = None

aria-labelの評価テキストは “X out of 5 stars “形式なので、単純な正規表現で評価値Xを抽出することができます。ウェブスクレイピングのための正規表現の使い方を参照してください。

Python標準ライブラリからreをインポートすることを忘れないでください:

import re

次に、レビュー数要素を検査する:

レビュー回数要素

要素からレビュー数を抽出する。 data-component-type="s-client-side-analytics"]内の要素からレビュー数を抽出します:

review_count_element = product_element.locator("[data-component-type=\"s-client-side-analytics\"] a").nth(0)
review_count_text = await review_count_element.text_content()
review_count = int(review_count_text.replace(",", ""))

Pythonで “2,539 “のような文字列を数値に変換する簡単なロジックに注目してほしい。

最後に、製品価格ノードを検査する:

製品価格要素

data-cy="price-recipe"]内の.a-offscreen要素から製品価格を収集します:

price_element_locator = product_element.locator("[data-cy=\"price-recipe\"] .a-offscreen")
# If the price element is on the product element
if await price_element_locator.count() > 0:
    price = await price_element_locator.nth(0).text_content()
else:
    price = None

すべての商品にprice要素があるとは限らないので、price要素のカウントをチェックしてから値を取得するようにしましょう。

スクリプトを動作させるには、Playwrightのインポートを更新する:

from playwright.async_api import async_playwright, TimeoutError

美しい!アマゾンの商品データのスクレイピング・ロジックが完成した。

この記事の目的はAmazonのスクレイピングロジックを深く掘り下げることではないことに注意してください。より詳しいガイダンスについては、PythonでAmazonの商品データをスクレイピングする方法のガイドをご覧ください。

ステップ6:スクレイピングしたデータを収集する

forループの最後の命令として、スクレイピングされたデータを商品オブジェクトに投入する:

product = {
    "image": image,
    "url": url,
    "title": title,
    "rating": rating,
    "review_count": review_count,
    "price": price
}

そして、Apifyデータセットにプッシュする:

await Actor.push_data(product)

push_data()は、スクレイピングされたデータがApifyに登録されていることを保証し、API経由でアクセスしたり、多くのサポートされているフォーマット(CSV、JSON、Excel、JSONLなど)でエクスポートすることを可能にします。

ステップ7:すべてをまとめる

これが最終的なApify + Bright Data Actormain.pyの内容です:

from apify import Actor
from playwright.async_api import async_playwright, TimeoutError
import re

async def main() -> None:
    # Enter the context of the Actor
    async with Actor:
        # Retrieve the Actor input, and use default values if not provided
        actor_input = await Actor.get_input() or {}
        # Reading the "keyword" argument from the input data, assigning it the
        # value "laptop" as a default value
        keyword = actor_input.get("keyword")

        # Building the target url
        target_url = f"https://www.amazon.com/search/s?k={keyword}"

        # Launch Playwright and open a new browser context
        async with async_playwright() as playwright:
            # Your Bright Data Scraping API connection string
            SBR_WS_CDP = "wss://brd-customer-hl_4bcb8ada-zone-scraping_browser:[email protected]:9222"

            # Configure Playwright to connect to Scraping Browser and open a new context
            browser = await playwright.chromium.connect_over_cdp(SBR_WS_CDP, timeout=120000)
            context = await browser.new_context()

            try:
                # Open a new page in the browser context and navigate to the URL
                page = await context.new_page()
                await page.goto(target_url)

                # Use a locator to select all product elements
                product_elements = page.locator("[data-component-type=\"s-search-result\"]")

                # Iterate over all product elements and scrape data from them
                for product_element in await product_elements.all():
                    # Product scraping logic
                    image_element = product_element.locator(".s-image").nth(0)
                    image = await image_element.get_attribute("src")

                    title_header_element = product_element.locator("[data-cy=\"title-recipe\"]").nth(0)

                    link_element = title_header_element.locator("a").nth(0)
                    url_text = await link_element.get_attribute("href")
                    url = None if url_text == "javascript:void(0)" else "https://amazon.com" + url_text

                    title_element = title_header_element.locator("h2").nth(0)
                    title = await title_element.get_attribute("aria-label")

                    rating_element =  product_element.locator("[data-cy=\"reviews-block\"] a").nth(0)
                    rating_text = await rating_element.get_attribute("aria-label")
                    rating_match = re.search(r"(\d+(\.\d+)?) out of 5 stars", rating_text)
                    if rating_match:
                        rating = rating_match.group(1)
                    else:
                        rating = None

                    review_count_element = product_element.locator("[data-component-type=\"s-client-side-analytics\"] a").nth(0)
                    review_count_text = await review_count_element.text_content()
                    review_count = int(review_count_text.replace(",", ""))

                    price_element_locator = product_element.locator("[data-cy=\"price-recipe\"] .a-offscreen")
                    # If the price element is on the product element
                    if await price_element_locator.count() > 0:
                        price = await price_element_locator.nth(0).text_content()
                    else:
                        price = None

                    # Populate a new dictionary with the scraped data
                    product = {
                        "image": image,
                        "url": url,
                        "title": title,
                        "rating": rating,
                        "review_count": review_count,
                        "price": price
                    }
                    # Add it to the Actor dataset
                    await Actor.push_data(product)
            except Exception:
                Actor.log.exception(f"Cannot extract data from {target_url}")

            finally:
                await page.close()

ご覧のように、Bright DataのスクレイピングブラウザとApifyの “Playwright + Chrome “テンプレートの統合は簡単で、数行のコードで済みます。

ステップ#8: Apifyへのデプロイとアクターの実行

ローカルの Actor を Apify にデプロイするには、プロジェクトフォルダで以下のコマンドを実行します:

apify push

まだログインしていない場合は、Apify CLIで認証するよう促されます。

配備が完了すると、次のような質問が表示されます:

✔ Do you want to open the Actor detail in your browser?

Y “または “yes “と答えると、Apify ConsoleのActorページにリダイレクトされます:

あなたのアクターのApifyページ

お望みなら、同じページに手動でアクセスすることもできる:

  1. ブラウザでApifyにログインする
  2. コンソールへの移動
  3. 俳優」のページを訪問

アクターを開始」ボタンをクリックして、アマゾンスクレイパーアクターを起動します。予想通り、キーワードの入力を求められます。ゲーミングチェア “などと入力してみてください:

キーワード・テキスト・フィールドの入力要素を埋める

その後、”Save & Start “を押してアクターを実行し、Amazonから “ゲーミングチェア “の商品リストをスクレイピングする。

スクレイピングが完了すると、Outputセクションに取得したデータが表示されます:

表形式のスクレイピング・データ

データをエクスポートするには、”Storage “タブで “CSV “オプションを選択し、”Download “ボタンを押す:

ダウンロード」ボタンを押す

ダウンロードされたCSVファイルには以下のデータが含まれます:

CSV形式のスクレイピング・データ

出来上がり!Bright DataのスクレイピングブラウザとApifyの統合は魅力的に機能します。Amazonやその他のサイトをスクレイピングする際、CAPTCHAやブロックはもう必要ありません。

[おまけ] Bright Data ProxyのApifyへの統合

Scraping BrowserやWeb Unlockerのようなスクレイピング製品を直接Apifyで使用するのは便利で簡単です。

同時に、すでにApifyでActorをお持ちで、プロキシで拡張する必要があるとします(例えば、IP禁止を避けるため)。Bright Dataのプロキシを直接Apify Actorに統合することができます。

結論

このチュートリアルでは、Amazonからプログラムでデータを収集するために、Playwrightのスクレイピングブラウザと統合するApifyアクターを構築する方法を学びました。ゼロから始め、ローカルでスクレイピングスクリプトを作成し、それをApifyにデプロイするすべてのステップを説明しました。

これで、Scraping Browserのような専門的なスクレイピングツールをApifyのクラウドスクレイピングに使用する利点がご理解いただけたと思います。同様の手順で、Apifyは他の全てのBright Data製品をサポートしています:

今すぐBright Dataに登録し、相互運用可能なプロキシサービスとスクレイピング製品を無料でお試しください!

クレジットカードは必要ありません