このブログ記事で、あなたは学ぶだろう:
- アピファイとは
- アピファイでスクレイピング・ブラウザを使用することは、なぜ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に遭遇し、スクレイピングの試みがブロックされる可能性が高い:
このセクションでは、一般的なアマゾンの商品検索ページからデータを抽出するために、Bright Dataのスクレイピング・ブラウザを活用したスクレイピング・アクターを構築します:
注:アクターはPythonで書かれますが、ApifyはJavaScriptもサポートしていることを覚えておいてください。
Bright DataのスクレイピングツールをApifyと統合する方法は以下のステップに従ってください!
前提条件
このチュートリアルに従うには、以下の前提条件を満たす必要があります:
- Python 3.8+をローカルにインストール:ローカルのActorスクリプトの開発とビルドのため。
- Node.jsがローカルにインストールされていること:Apify CLIをインストールする。
- Apifyアカウント:ローカルActorをApifyプラットフォームにデプロイする。
- Bright Dataアカウント:スクレイピングブラウザにアクセスする。
ステップ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はこの形式を使うべきです。 は、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
です。このファイルを開いて
- 入力引数からキーワード・パラメータを読み込む
- アマゾンの検索ページのターゲットURLを構築する
- 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()
上記のコード:
- スクリプトのライフサイクルを管理するために、
アピファイ・アクターを
初期化します。 Actor.get_input()
を使って入力引数を取得する。
- 入力データから
キーワード
引数を取り出す - Pythonのf-stringを使ってターゲットURLを構築する。
- Playwrightを起動し、GPUを無効にしたヘッドレスChromiumブラウザを起動する。
- 新しいブラウザコンテキストを作成し、ページを開き、
page.goto()
を使用してターゲットURLに移動する。 Actor.log.exception()
でエラーをログに記録します。- 実行後にPlaywrightページが閉じられるようにする。
完璧です!あなたのApify Actorは効率的なWebスクレイピングのためにBright Dataのスクレイピングブラウザを利用する準備ができています。
ステップ#3: Bright Dataのスクレイピング・ブラウザの統合
次に、Playwright APIを使用して、ターゲットページに接続した後のスクリーンショットをキャプチャします:
await page.screenshot(path="screenshot.png")
Actorをローカルで実行すると、プロジェクトフォルダにscreenshot.png
ファイルが生成されます。それを開くと、次のようなものが表示されます:
同様に、以下のようなアマゾンのエラーページが表示されるかもしれない:
ご覧のように、あなたのウェブスクレイピングボットはアマゾンのボット対策によってブロックされています。これは、Amazonや他の人気のあるウェブサイトをスクレイピングする際に遭遇する可能性のある多くの課題の一つに過ぎません。
Bright Dataのスクレイピングブラウザは、無制限のスケーラビリティ、自動IPローテーション、CAPTCHA解決、アンチスクレイピングバイパスを提供するクラウドベースのスクレイピングソリューションです。
まずは、Bright Dataのアカウントを作成してください。その後、プラットフォームにログインします。User Dashboard “セクションで、”Get proxy products “ボタンをクリックします:
プロキシ&スクレイピング・インフラストラクチャ “ページの “マイ・ゾーン “表で、”scraping_browser “行を選択する:
オン/オフスイッチを切り替えて製品を有効にする:
Configuration(設定)」タブで、「Premium domains(プレミアム・ドメイン)」と「CAPTCHA Solver(キャプチャ・ソルバー)」の両方のオプションが有効になっていることを確認してください:
概要」タブで、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要素を取得するために必要であることに注意。
次に、商品のタイトルを確認する:
要素から集めることができます:
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")
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にログインする
- コンソールへの移動
- 俳優」のページを訪問
アクターを開始」ボタンをクリックして、アマゾンスクレイパーアクターを起動します。予想通り、キーワードの入力を求められます。ゲーミングチェア “などと入力してみてください:
その後、”Save & Start “を押してアクターを実行し、Amazonから “ゲーミングチェア “の商品リストをスクレイピングする。
スクレイピングが完了すると、Outputセクションに取得したデータが表示されます:
データをエクスポートするには、”Storage “タブで “CSV “オプションを選択し、”Download “ボタンを押す:
ダウンロードされた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製品をサポートしています:
- プロキシサービス:1億5,000万以上の家庭用IPを含む、ロケーション制限を回避する4種類のプロキシ
- ウェブスクレーパーAPI:100以上の人気ドメインから新鮮で構造化されたウェブデータを抽出するための専用エンドポイント。
- SERP API:SERPのすべての継続的なロック解除管理を処理し、1つのページを抽出するAPI
今すぐBright Dataに登録し、相互運用可能なプロキシサービスとスクレイピング製品を無料でお試しください!
クレジットカードは必要ありません