Scrapy vs. Selenium for Web Scraping

静的サイト向けのScrapyと動的コンテンツ向けのSeleniumを比較分析し、ウェブスクレイピングの詳細を探求してデータ駆動型の意思決定を強化します。
2 分読
Scrapy vs. selenium blog image

ウェブスクレイピングとは、専門的なツールやプログラムを使用してウェブサイトからデータを自動的に抽出・収集する手法です。特に、データに基づく意思決定プロセスの改善を目指す企業にとって非常に価値があります。

しかし、多くのウェブサイトに見られる複雑なHTML構造、動的コンテンツ、多様なデータ形式により、ウェブスクレイピングの効果は使用するツールに大きく依存します。

ScrapySeleniumは、ウェブスクレイピングを効率化するために設計された強力なツールです。Scrapyは静的ウェブサイトからデータを抽出し、SeleniumはWebブラウザの自動化と動的ウェブサイトからのデータ抽出が可能です。

この記事では、使いやすさ、パフォーマンスとスケーラビリティ、さまざまなウェブコンテンツへの適合性、そして統合機能の観点から2つのツールを比較します。

使いやすさ

ScrapyはLinux、Windows、macOS、Berkeley Software Distribution(BSD)で動作するPythonベースのウェブスクレイピングツールです。Scrapyは使いやすいだけでなく、ウェブスクレイピングタスク向けの高レベルAPIを提供しており、ウェブスクレイピングのプロセスをさらに簡略化できます。

Scrapyのセットアップは、インストールしてPythonコードでスパイダーを設定するだけです(ウェブスクレイピングの概念についての理解が必要です)。Scrapyコマンドを実行してプロジェクトを開始すると、プロジェクト専用のフォルダが生成されます。このフォルダにはitems.pypipelines.pysettings.pyなどのデフォルトのPythonファイルが含まれており、シンプルな構造で整理されているため、ウェブスクレイピングをすぐに始めることができます。

Scrapyは、厳選された記事やビデオを含む充実したドキュメントを提供しており、疑問点の解消に役立ちます。また、活発なsubredditとDiscordコミュニティがあり、さまざまなディスカッションやトピックに参加できます。

一方、SeleniumはJava、JavaScript、Python、C#など複数のプログラミング言語をサポートし、Windows、macOS、LinuxなどScrapyと同様の多くのOSに対応しています。Scrapyと比較すると、Seleniumは習得が容易ではなく、熟練するまでにより多くの時間、労力、そして場合によってはリソースが必要です。

Seleniumのセットアップには、Seleniumライブラリのインストールと、ブラウザ自動化を処理するWebDriverの設定が必要です。ログインが必要な動的ウェブサイトのデータをスクレイピングする場合、データの収集を始める前にログインプロセスを処理するウェブ自動化を設定する必要があります。

Seleniumは、ウェブページ上の要素を簡単に特定するためにカスタマイズできる豊富なナビゲーションメソッドを提供しています。さらに、クリック、ダブルクリック、ドラッグ、ドロップ、スクロールなどのインタラクティブなアクションのチェーンを提供し、ウェブページとの操作を容易にします。

Seleniumの公式ドキュメントには、ウェブ自動化とウェブスクレイピングの両方に関する充実したガイドライン、ステップバイステップの手順、チュートリアルが含まれています。

Seleniumはウェブ自動化のための汎用ツールであるため、より大きく多様なコミュニティを持っています。Seleniumの使用中に疑問が生じた場合は、公式ユーザーグループやsubredditコミュニティが役立ちます。すぐに回答が必要な問題がある場合は、IRCチャットルームを利用することもできます。

パフォーマンスとスケーラビリティ

ウェブスクレイピングツールのパフォーマンスの有効性は、大量のデータを迅速に収集するという目的から、その速度に大きく依存します。

Scrapyは静的ウェブページのコンテンツのスクレイピングに優れており、Seleniumよりも高速なデータ抽出を実現します。これは、Seleniumがボタンのクリックやフォームへの入力などのさまざまな操作を実行するためにブラウザインスタンスに依存しているためです。

https://books.toscrape.com/から1,000冊の本のタイトルと価格を収集する速度テストでは、Scrapyは31.57秒でタスクを完了しました。一方、Seleniumは同じコンテンツをスクレイピングするのに平均156.01秒かかりました:

Scrapy vs. Selenium speed test results

Scrapyのアーキテクチャは、レスポンスとアイテムを継続的なプロセスで処理することでメモリを効率的に管理し、ウェブページ全体を一度にメモリに読み込む必要がありません。Scrapyはキャッシュとインクリメンタルスクレイピングの組み込みサポートも備えており、冗長なリクエストを最小化し、新規または更新されたコンテンツのみを処理することでスケーラビリティを向上させます。

さらに、Scrapyは同時リクエスト数、深度制限、アイテムパイプラインなどの設定を通じてメモリ使用量を微調整するオプションを提供しています。これらの機能により、ウェブスクレイピングプロジェクトの具体的な要件に応じてメモリ消費を最適化できます。

SeleniumはJavaScriptが多用されたウェブサイトと連携する際に大量のメモリを消費する傾向があり、メモリ消費量が増加します。これは特に大規模なスクレイピングプロジェクトにおいて、スケーラビリティとパフォーマンスに悪影響を及ぼす可能性があります。

ScrapyのHTTPCacheMiddlewareという組み込みミドルウェアは、スパイダーが行うリクエストとそれに関連するレスポンスをキャッシュします。プロジェクトのsettings.pyファイルに以下のコードを追加することでキャッシュを有効にできます:

# Enable and configure HTTP caching (disabled by default)
HTTPCACHE_ENABLED = True

Seleniumを大規模なデータスクレイピングに対応させるには、分散システム全体に複数のインスタンスをデプロイする必要があり、RAMやCPUなどのリソース需要が増大します。

さまざまなウェブコンテンツへの適合性

インターネット上の大多数のウェブサイトは、動的または静的なウェブページを持っています。ScrapyとSeleniumが両タイプのウェブページをどのように処理するか見てみましょう。

動的ウェブページ

動的ウェブページの大部分は、AngularやReactなどのJavaScriptフレームワークを使用して、ページ全体をリロードせずにコンテンツを更新します。

Seleniumはさまざまなウェブサイトから動的コンテンツをスクレイピングできますが、ScrapyはJavaScriptによって生成された動的コンテンツのスクレイピングをそのままではサポートしていません。SeleniumやSplashなどのツールとScrapyを統合することで、この機能を実現できます。

静的ウェブページ

静的ウェブページは通常、動的なものと比較してインタラクションが限られており、コンテンツの閲覧やリンクのクリックのみが可能なことが多いです。

前述のとおり、Seleniumは静的ページのスクレイピングも可能ですが、その用途に最も効率的なツールではありません。一方、Scrapyは静的データのスクレイピングに優れており、目的の情報を収集するためのスムーズで効率的な体験を提供します。

統合機能

Scrapyは、MySQL、PostgreSQL、MongoDBなどのデータベースを含むほとんどのPythonツールと簡単に統合でき、スクレイピングしたデータを保存できます。SQLAlchemyなどのオブジェクトリレーショナルマッパー(ORM)を使用して、リレーショナルデータベースへのデータ保存プロセスを簡略化することもできます。データをさらに処理・分析したい場合は、Pythonの人気データ操作・分析ライブラリであるpandasを使用できます。

ScrapyはDjangoやFlaskなどのウェブフレームワークとも統合でき、ウェブスクレイピング機能を組み込んだウェブアプリケーションを構築できます。さらに、FastAPIとの統合により、スクレイピングリクエストを効率的に処理するのに適した非同期サポートを持つ高パフォーマンスのWeb APIを構築できます。

一方、Seleniumは、Selenium WebDriver APIとブラウザの間の仲介役として機能するブラウザドライバーを提供しています。お好みのウェブブラウザと統合するためのWebDriverをダウンロードしてインストールできます。現在、SeleniumはChrome、Edge、Firefox、Safariのブラウザドライバーを提供しています。

Seleniumはウェブアプリケーションの機能を自動的にテストするためにも使用できますが、組み込みのテストフレームワークを持っていない点に注意が必要です。CodeceptJS、Helium、Selenideなどの人気テストフレームワークとSeleniumを統合できます。

SeleniumはかつてJenkinsやTravis CIなどのCIツールと統合して、CI/CDパイプラインの一部として自動化スクリプトを自動実行できましたが、現在は継続的なテストとデプロイメントプロセスをサポートするGitHub Actionsですべてを実行しています。

Scrapyは、プロキシのIPとポートをリクエストパラメーターとして渡すことで、Bright Dataなどのさまざまなプロキシサービスプロバイダーと統合できます。この方法は、プロジェクトに特定のプロキシを使用したい場合に推奨されます。

例えば、プロキシサーバーと統合したい場合、以下のようにpipコマンドpip3 install scrapyを使用してScrapyをインストールできます:

#import scrapy module
import scrapy
class BookSpider(scrapy.Spider):
    name = "books"
    def start_requests(self):
        start_urls = ["https://example.com/products"]
        for url in start_urls:
            yield scrapy.Request(
                url=url,
                callback=self.parse,
                # connect with proxy
                meta={"proxy": "http://USERNAME:[email protected]:22225"},
            )
    def parse(self, response):
        for book in response.css(".book-card"):
            yield {
                "title": book.css(".title ::text").get(),
                "price": book.css(".price-wrapper ::text").get(),
            }

ここでは、Scrapyをインポートし、Scrapyのスパイダークラスを継承したBookSpiderというクラスを定義して、ウェブサイトから本のリストをスクレイピングします。start_requests()メソッドは指定されたURLとプロキシでリクエストを開始し、parse()メソッドはCSSセレクターを使用して本のタイトルと価格を抽出します。

一方、SeleniumはChromeDriverやgeckodriverなどのさまざまなブラウザドライバーを通じて、簡単なプロキシ統合をサポートしています。Selenium WebDriverをプロキシサーバー経由でHTTPリクエストをルーティングするように設定するだけです。

例えば、以下のようにBright Dataが提供するプロキシのIPとポートを指定することで、Seleniumとプロキシを統合できます:

#import selenium modules
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType
# Proxy configuration
proxy_address = "http://USERNAME:[email protected]"
proxy_port = "22225"
# Selenium options : integrate with proxy credentials from Bright data
options = webdriver.ChromeOptions()
options.add_argument('--proxy-server=%s:%s' % (proxy_address, proxy_port))
# Selenium webdriver instantiation
driver = webdriver.Chrome(options=options)
# Example usage: scraping a webpage
url = "https://example.com"
driver.get(url)
print(driver.page_source)
# Close the driver
driver.quit()

ここでは、必要なSeleniumモジュールをインポートしてプロキシ設定をセットアップします。次に、定義されたプロキシサーバーを使用するようにChromeを設定し、WebDriverをインスタンス化し、ウェブページ("https://example.com")をスクレイピングし、ページソースを出力して、WebDriverを閉じてプロセスを終了します。

まとめ

この記事では、ScrapyとSeleniumという2つの人気のウェブスクレイピングツールを比較しました。

Scrapyは静的ウェブサイトでのデータ抽出に最適な、使いやすいPythonベースのスクレイピングツールです。一方、Seleniumは複数のプログラミング言語を使用した自動化とスクレイピング機能を提供し、さまざまなウェブブラウザをサポートし、動的でJavaScriptレンダリングされたコンテンツのスクレイピングに優れています。

どちらのツールを使用する場合でも、Bright Dataのようなデータインフラを利用することをお勧めします。地理的制限やブロックを回避し、CAPTCHAを解決する機能をウェブスクレイピングスクリプトに追加できます。Bright DataのAPIとSDKを活用して、より幅広いスクレイピング要件に対応し、ウェブスクレイピングプロジェクトの効率性、速度、精度、スケーラビリティを確保できます。データ収集をさらに発展させたいですか?カスタムデータセットを購入してください(無料サンプルあり)。