Puppeteer と Selenium: Web スクレイピングにはどちらを選ぶべきでしょうか?

プロキシの選択と購入

Puppeteer と Selenium: Web スクレイピングにはどちらを選ぶべきでしょうか?

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、macOSWindows、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 スピードテスト

以下のグラフは、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 のローテーションプロキシ このプロセスをさらに最適化し、シームレスなスクレイピングエクスペリエンスを提供します。

よくある質問 (FAQ)

Puppeteer と Selenium はどちらも、Web スクレイピング、テスト、およびブラウザ タスクの自動化に使用されるブラウザ自動化フレームワークです。Puppeteer は、DevTools プロトコルを介して Chrome または Chromium を制御する Node.js ライブラリであり、Selenium は、WebDriver API を通じてさまざまなブラウザとプログラミング言語をサポートするオープンソース ツールです。

Puppeteer は一般的に Selenium よりも高速です。ただし、Web スクレイピングや自動化プロジェクトで使用される特定のタスクや構成によって速度の違いは異なります。

Puppeteer は、使いやすさ、スピード、そしてデフォルトでヘッドレス モードでタスクを自動化する機能で知られています。Chromium をサポートし、強力なイベント駆動型アーキテクチャを備えているため、コード内で手動でスリープを呼び出す必要がありません。

Puppeteer は Selenium に比べてサポートするブラウザが少なく、主に JavaScript に重点を置いていますが、Python や PHP などの他の言語用の非公式ポートも存在します。

Puppeteerがプロキシサーバーを使用するように設定するには、プロキシ設定を args ブラウザを起動するときにオプションを選択します。

Selenium は複数のプログラミング言語 (Python、Java、JavaScript、Ruby、C#) をサポートし、Firefox、Edge、Safari、QtWebKit などのカスタム ブラウザーを含むさまざまなブラウザーを自動化できます。また、さまざまなブラウザー設定でクラウド サーバーをセットアップするなどの手法により、広範なスケーラビリティも実現します。

Selenium は、特に異なるブラウザや環境向けに構成する場合、Puppeteer に比べてセットアップが複雑になる可能性があります。

Seleniumでプロキシサーバーを設定するには、 webdriver.Proxy クラス。

Puppeteer と Selenium の両方を使用して、Danube-store サンドボックスで同じ Web スクレイピング タスクを実行しました。各スクリプトは 20 回実行され、平均実行時間が計算されてパフォーマンスが比較されました。

結果によると、Puppeteer は Selenium よりも約 60% 高速であり、高速 Web スクレイピングや自動化タスクに適していることがわかりました。

OneProxy は、ブロックを回避するのに役立ちます。OneProxy は、ボット対策のバイパスを処理し、ローテーションプロキシ、ヘッドレスブラウザ、自動再試行などを提供し、シームレスな Web スクレイピングエクスペリエンスを保証します。

データセンタープロキシ
共有プロキシ

信頼性が高く高速なプロキシ サーバーが多数あります。

から開始IPごとに$0.06
プロキシのローテーション
プロキシのローテーション

リクエストごとの支払いモデルによる無制限のローテーション プロキシ。

から開始リクエストごとに $0.0001
プライベートプロキシ
UDPプロキシ

UDP をサポートするプロキシ。

から開始IPごとに$0.4
プライベートプロキシ
プライベートプロキシ

個人使用のための専用プロキシ。

から開始IPごとに$5
無制限のプロキシ
無制限のプロキシ

トラフィック無制限のプロキシ サーバー。

から開始IPごとに$0.06
今すぐプロキシ サーバーを使用する準備はできていますか?
IPごとに$0.06から