Web スクレイピングに Puppeteer と Selenium のどちらを使用するか迷っていますか? どちらも強力なブラウザ自動化フレームワークであり、適切な選択は、特定のスクレイピングのニーズと利用可能なリソースによって異なります。
十分な情報に基づいた決定を下せるよう、以下の表に Puppeteer と Selenium の主な違いをまとめました。その後、詳細を掘り下げ、各フレームワークのスクレイピング例を示して、Web ページからデータを抽出する際の有効性を示します。
基準 | 人形遣い | セレン |
---|---|---|
対応言語 | 公式にはJavaScriptのみがサポートされていますが、非公式のPHPとPythonの移植版もあります。 | Java、Python、C#、Ruby、PHP、JavaScript、Kotlin |
ブラウザのサポート | Chromium と実験的な Firefox のサポート | Chrome、Safari、Firefox、Opera、Edge、Internet Explorer |
パフォーマンス | 60%はSeleniumより高速 | 速い |
オペレーティング システムのサポート | Windows、Linux、macOS | Windows、Linux、macOS、Solaris |
建築 | ヘッドレスブラウザインスタンスを使用したイベント駆動型アーキテクチャ | ブラウザインスタンスを制御するためのWebドライバ上のJSONWireプロトコル |
前提条件 | JavaScriptパッケージで十分 | Selenium バインディング(選択したプログラミング言語用)とブラウザ Web ドライバー |
コミュニティ | Seleniumに比べてコミュニティが小さい | よく整備されたドキュメントと大規模なコミュニティ |
これらのライブラリについて詳しく説明し、それぞれを使用してスクレイピングの例を実行して、Web ページからデータを抽出する際の効率性を示しましょう。
人形遣い
人形遣い は、DevTools プロトコルを介して Chrome または Chromium を制御するための高レベル API を提供する Node.js ライブラリです。スクリーンショットの撮影、PDF の生成、ページの移動など、Chrome または Chromium でのタスクを自動化するように設計されています。
Puppeteer は、ボタンのクリック、フォームへの入力、表示される結果の検証などのユーザー操作をシミュレートして、Web ページのテストにも使用できます。
Puppeteerの利点
- 使いやすさ: シンプルで使いやすい。
- Chromium にバンドル: 追加の設定は必要ありません。
- ヘッドレスモード: デフォルトではヘッドレス モードで実行されますが、フル ブラウザー モードで実行するように構成できます。
- イベント駆動型アーキテクチャ: コード内で手動でスリープを呼び出す必要がなくなります。
- 包括的な機能: スクリーンショットを撮ったり、PDF を生成したり、すべてのブラウザアクションを自動化したりできます。
- パフォーマンス管理: スクレーパーを最適化およびデバッグするために、実行時間と読み込みパフォーマンスを記録するツールを提供します。
- SPAクローリング: シングルページ アプリケーション (SPA) をクロールし、事前レンダリングされたコンテンツ (サーバー側レンダリング) を生成できます。
- スクリプトの記録: DevTools コンソールを使用してブラウザ上のアクションを記録し、Puppeteer スクリプトを作成できます。
パペティアの欠点
- ブラウザのサポートが制限されている: Selenium と比較してサポートされるブラウザが少なくなります。
- JavaScript に重点を置く: 主に JavaScript をサポートしていますが、Python および PHP 用の非公式ポートも存在します。
Puppeteer を使用した Web スクレイピングの例
Puppeteer の Web スクレイピング チュートリアルを実行して、Danube Web サイトの犯罪とスリラーのカテゴリからアイテムを抽出してみましょう。
ドナウストア: 犯罪とスリラー
まず、Puppeteer モジュールをインポートし、Puppeteer コードを実行する非同期関数を作成します。
const puppeteer = require('puppeteer');
async function main() {
// Launch a headless browser instance
const browser = await puppeteer.launch({ headless: true });
// Create a new page object
const page = await browser.newPage();
// Navigate to the target URL and wait until the loading finishes
await page.goto('https://danube-webshop.herokuapp.com/', { waitUntil: 'networkidle2' });
// Wait for the left-side bar to load
await page.waitForSelector('ul.sidebar-list');
// Click on the first element and wait for the navigation to finish
await Promise.all([
page.waitForNavigation(),
page.click("ul[class='sidebar-list'] > li > a"),
]);
// Wait for the book previews to load
await page.waitForSelector("li[class='preview']");
// Extract the book previews
const books = await page.evaluateHandle(
() => [...document.querySelectorAll("li[class='preview']")]
);
// Extract the relevant data using page.evaluate
const processed_data = await page.evaluate(elements => {
let data = [];
elements.forEach(element => {
let title = element.querySelector("div.preview-title").innerHTML;
let author = element.querySelector("div.preview-author").innerHTML;
let rating = element.querySelector("div.preview-details > p.preview-rating").innerHTML;
let price = element.querySelector("div.preview-details > p.preview-price").innerHTML;
let result = { title, author, rating, price };
data.push(result);
});
return data;
}, books);
// Print out the extracted data
console.log(processed_data);
// Close the page and browser respectively
await page.close();
await browser.close();
}
// Run the main function to scrape the data
main();
期待される出力
コードを実行すると、出力は次のようになります。
[
{
title: 'Does the Sun Also Rise?',
author: 'Ernst Doubtingway',
rating: '★★★★☆',
price: '$9.95'
},
{
title: 'The Insiders',
author: 'E. S. Hilton',
rating: '★★★★☆',
price: '$9.95'
},
{
title: 'A Citrussy Clock',
author: 'Bethany Urges',
rating: '★★★★★',
price: '$9.95'
}
]
Puppeteer のもう一つの使用例
Puppeteer は、Web ページからデータをスクレイピングするだけでなく、さまざまな自動化タスクにも使用できます。一般的な使用例の 1 つは、Web ページの PDF を生成することです。Puppeteer を使用して Web ページから PDF を生成する例を見てみましょう。
Puppeteer で PDF を生成する
ステップ1: Puppeteerをインポートして非同期関数を作成する
const puppeteer = require('puppeteer');
async function generatePDF() {
// Launch a headless browser instance
const browser = await puppeteer.launch({ headless: true });
// Create a new page object
const page = await browser.newPage();
// Navigate to the target URL
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
// Generate a PDF from the web page
await page.pdf({
path: 'example.pdf', // Output file path
format: 'A4', // Paper format
printBackground: true, // Include background graphics
});
// Close the page and browser respectively
await page.close();
await browser.close();
}
// Run the function to generate the PDF
generatePDF();
追加の操り人形師オプション
Puppeteer には、ニーズに合わせてカスタマイズできる PDF 生成オプションがいくつか用意されています。使用できるオプションをいくつか紹介します。
path
: PDF を保存するファイル パス。format
: 用紙のフォーマット (例: 「A4」、「レター」)。printBackground
: 背景グラフィックを含めるかどうか。landscape
: に設定true
横向き用。margin
: PDF の余白 (上、右、下、左) を指定します。
追加オプションの例:
const puppeteer = require('puppeteer');
async function generatePDF() {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
await page.pdf({
path: 'example.pdf',
format: 'A4',
printBackground: true,
landscape: true,
margin: {
top: '20px',
right: '20px',
bottom: '20px',
left: '20px',
},
});
await page.close();
await browser.close();
}
generatePDF();
出力例
上記のコードを実行すると、次の名前のPDFファイルが作成されます。 example.pdf
現在のディレクトリにウェブページの内容が保存される https://example.com
.
Puppeteer は、データのスクレイピングから PDF の生成まで、Web 自動化タスクのための多目的ツールです。使いやすさと強力な機能により、幅広いブラウザ アクティビティの自動化に最適です。データのスクレイピング、レポートの生成、Web ページのテストなど、Puppeteer は作業を効率的に行うために必要なツールを提供します。
セレン
セレン は、Web スクレイピングによく使用されるオープンソースのエンドツーエンドのテストおよび Web 自動化ツールです。主なコンポーネントには、Selenium IDE、Selenium WebDriver、および Selenium Grid が含まれます。
- セレンIDE: アクションを自動化する前に記録するために使用されます。
- セレンウェブドライバー: ブラウザ内でコマンドを実行します。
- セレングリッド: 並列実行を有効にします。
セレンの利点
- 使いやすさ: シンプルで使いやすい。
- 言語サポート: Python、Java、JavaScript、Ruby、C# など、さまざまなプログラミング言語をサポートします。
- ブラウザの自動化: Firefox、Edge、Safari、さらにはカスタム QtWebKit ブラウザーなどのブラウザーを自動化できます。
- スケーラビリティ: さまざまなブラウザ設定を持つクラウド サーバーを使用して、Selenium を数百のインスタンスに拡張できます。
- クロスプラットフォーム: Windows、macOS、Linux で動作します。
セレンの欠点
- 複雑なセットアップ: Selenium のセットアップ方法は複雑になる場合があります。
Selenium を使用した Web スクレイピングのサンプル
Puppeteer と同様に、同じターゲット サイトを使用して、Selenium による Web スクレイピングのチュートリアルを実行してみましょう。Danube Web サイトの Crime and Thriller カテゴリから書籍のプレビューを抽出します。
ドナウストア: 犯罪とスリラー
ステップ1: 必要なモジュールをインポートしてSeleniumを構成する
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
options.add_argument("--headless")
ステップ2: Chrome WebDriverを初期化する
driver = webdriver.Chrome(options=options)
ステップ3: ターゲットWebサイトに移動する
time.sleep(1)
crime_n_thrillers = driver.find_element(By.CSS_SELECTOR, "ul[class='sidebar-list'] > li")
crime_n_thrillers.click()
time.sleep(1)
books = driver.find_elements(By.CSS_SELECTOR, "div.shop-content li.preview")
ステップ4: 犯罪とスリラーのカテゴリをクリックして、本のプレビューを抽出します
time.sleep(1)
crime_n_thrillers = driver.find_element(By.CSS_SELECTOR, "ul[class='sidebar-list'] > li")
crime_n_thrillers.click()
time.sleep(1)
books = driver.find_elements(By.CSS_SELECTOR, "div.shop-content li.preview")
ステップ5: 各書籍のプレビューからデータを抽出する関数を定義する
def extract(element):
title = element.find_element(By.CSS_SELECTOR, "div.preview-title").text
author = element.find_element(By.CSS_SELECTOR, "div.preview-author").text
rating = element.find_element(By.CSS_SELECTOR, "div.preview-details p.preview-rating").text
price = element.find_element(By.CSS_SELECTOR, "div.preview-details p.preview-price").text
return {"title": title, "author": author, "rating": rating, "price": price}
ステップ6: プレビューをループし、データを抽出してドライバーを終了する
extracted_data = []
for element in books:
data = extract(element)
extracted_data.append(data)
print(extracted_data)
driver.quit()
期待される出力
上記のコードを実行すると、次のような出力が生成されます。
[
{'title': 'Does the Sun Also Rise?', 'author': 'Ernst Doubtingway', 'rating': '★★★★☆', 'price': '$9.95'},
{'title': 'The Insiders', 'author': 'E. S. Hilton', 'rating': '★★★★☆', 'price': '$9.95'},
{'title': 'A Citrussy Clock', 'author': 'Bethany Urges', 'rating': '★★★★★', 'price': '$9.95'}
]
追加の Selenium の例: スクリーンショットの撮影
データのスクレイピングに加えて、Selenium は Web ページのスクリーンショットを撮るのにも使用できます。以下は、Selenium を使用して Web ページのスクリーンショットを撮る方法の例です。
ステップ1: 必要なモジュールをインポートしてSeleniumを構成する
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--headless")
ステップ2: Chrome WebDriverを初期化する
driver = webdriver.Chrome(options=options)
ステップ3: ターゲットWebサイトに移動する
url = "https://example.com"
driver.get(url)
ステップ4: スクリーンショットを撮る
driver.save_screenshot("example_screenshot.png")
ステップ5: ドライバーを終了する
driver.quit()
Selenium は、Web スクレイピングやスクリーンショットの取得など、Web 自動化タスク向けの多目的ツールです。複数のプログラミング言語とブラウザーをサポートし、スケーラビリティも備えているため、さまざまな自動化ニーズに対応する強力な選択肢となります。データの抽出やレポートの生成など、Selenium はタスクを効率的に自動化する機能を提供します。
Puppeteer と Selenium: 速度比較
Puppeteer は Selenium よりも高速ですか? 答えは「はい」です。Puppeteer は一般に Selenium よりも高速です。
Puppeteer と Selenium の速度を比較するために、Danube-store サンドボックスを使用し、上記のスクリプトを 20 回実行して実行時間を平均しました。
セレン速度テスト
私たちは time
Selenium スクリプトの実行時間を測定するための Python モジュール。開始時間はスクリプトの始めに記録され、終了時間はスクリプトの終わりに記録されました。これらの時間の差が合計実行時間を提供します。
Selenium に使用される完全なスクリプトは次のとおりです。
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def extract(element):
title = element.find_element(By.CSS_SELECTOR, "div.preview-title").text
author = element.find_element(By.CSS_SELECTOR, "div.preview-author").text
rating = element.find_element(By.CSS_SELECTOR, "div.preview-details p.preview-rating").text
price = element.find_element(By.CSS_SELECTOR, "div.preview-details p.preview-price").text
return {"title": title, "author": author, "rating": rating, "price": price}
# Start the timer
start_time = time.time()
options = webdriver.ChromeOptions()
options.add_argument("--headless")
# Create a new instance of the Chrome driver
driver = webdriver.Chrome(options=options)
url = "https://danube-webshop.herokuapp.com/"
driver.get(url)
# Click on the Crime & Thrillers category
time.sleep(1)
crime_n_thrillers = driver.find_element(By.CSS_SELECTOR, "ul[class='sidebar-list'] > li")
crime_n_thrillers.click()
time.sleep(1)
# Extract the book previews
books = driver.find_elements(By.CSS_SELECTOR, "div.shop-content li.preview")
extracted_data = []
for element in books:
data = extract(element)
extracted_data.append(data)
print(extracted_data)
# End the timer
end_time = time.time()
print(f"The whole script took: {end_time - start_time:.4f} seconds")
driver.quit()
パペッティアスピードテスト
パペッティアのスクリプトでは、 Date
実行時間を測定するためのオブジェクト。開始時間はスクリプトの始めに記録され、終了時間はスクリプトの終わりに記録されました。これらの時間の差が合計実行時間を提供します。
Puppeteer に使用される完全なスクリプトは次のとおりです。
const puppeteer = require('puppeteer');
async function main() {
const start = Date.now();
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://danube-webshop.herokuapp.com/', { waitUntil: 'networkidle2' });
await page.waitForSelector('ul.sidebar-list');
await Promise.all([
page.waitForNavigation(),
page.click("ul[class='sidebar-list'] > li > a"),
]);
await page.waitForSelector("li[class='preview']");
const books = await page.evaluateHandle(
() => [...document.querySelectorAll("li[class='preview']")]
);
const processed_data = await page.evaluate(elements => {
let data = [];
elements.forEach(element => {
let title = element.querySelector("div.preview-title").innerHTML;
let author = element.querySelector("div.preview-author").innerHTML;
let rating = element.querySelector("div.preview-details > p.preview-rating").innerHTML;
let price = element.querySelector("div.preview-details > p.preview-price").innerHTML;
let result = { title, author, rating, price };
data.push(result);
});
return data;
}, books);
console.log(processed_data);
await page.close();
await browser.close();
const end = Date.now();
console.log(`Execution time: ${(end - start) / 1000} seconds`);
}
main();
パフォーマンステスト結果
パフォーマンス テストでは、Puppeteer は Selenium よりも約 60% 高速であることが示されました。この速度の利点により、特に Chromium ベースのブラウザーで作業する場合、高速 Web スクレイピングと自動化を必要とするプロジェクトには Puppeteer がより適した選択肢となります。
速度結果の概要:
以下のグラフは、Puppeteer と Selenium のパフォーマンスの違いを示しています。
このコンテキストでは、高速で効率的な Web スクレイピングを必要とするプロジェクト向けに Puppeteer アプリケーションをスケールアップすることが最適な選択です。
Puppeteer と Selenium: どちらが優れているか?
では、スクレイピングには Selenium と Puppeteer のどちらが優れているのでしょうか? この質問には直接的な答えはありません。長期的なライブラリ サポート、クロスブラウザ サポート、Web スクレイピングのニーズなど、複数の要因に依存するためです。
Puppeteer は高速ですが、Selenium と比較するとサポートされるブラウザの数が少なくなっています。また、Selenium は Puppeteer と比較すると、サポートされるプログラミング言語が多くなっています。
結論
Puppeteer または Selenium を使用することは Web スクレイピングに適したオプションですが、高度なボット対策によってこれらのライブラリが検出されブロックされる可能性があるため、Web スクレイピング プロジェクトのスケールアップと最適化は困難になる可能性があります。これを回避する最善の方法は、OneProxy などの Web スクレイピング API を使用することです。
プロキシサーバーでPuppeteerを使用する
Puppeteerをプロキシサーバーで使用するには、プロキシ設定を args
ブラウザインスタンスを起動するときにオプションを選択します。次に例を示します。
const puppeteer = require('puppeteer');
async function main() {
const proxyServer = 'http://your-proxy-server:port';
const browser = await puppeteer.launch({
headless: true,
args: [`--proxy-server=${proxyServer}`]
});
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
// Perform your web scraping tasks here
await browser.close();
}
main();
プロキシサーバーで Selenium を使用する
Seleniumをプロキシサーバーで使用するには、 webdriver.Proxy
クラス。次に例を示します。
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType
proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = "your-proxy-server:port"
proxy.ssl_proxy = "your-proxy-server:port"
capabilities = webdriver.DesiredCapabilities.CHROME
proxy.add_to_capabilities(capabilities)
options = webdriver.ChromeOptions()
options.add_argument("--headless")
driver = webdriver.Chrome(desired_capabilities=capabilities, options=options)
driver.get("https://example.com")
# Perform your web scraping tasks here
driver.quit()
Puppeteer と Selenium でプロキシ サーバーを使用すると、IP ベースの制限を回避し、ブロックされるリスクを軽減して、Web スクレイピング タスクの効率を高めることができます。 OneProxy のローテーションプロキシ このプロセスをさらに最適化し、シームレスなスクレイピングエクスペリエンスを提供します。