Scrapy vs Pyspider:Webスクレイピングにはどちらが良いのか?

WebスクレイピングのためにScrapyとPyspiderを比較し、あなたのWebスクレイピングのニーズに最適なツールを選択します。
3 分読
Scrapy vs Pyspider blog image

このScrapy vs Pyspiderガイドでは、次のことを学びます:

  • ScrapyとPyspiderとは
  • ウェブスクレイピングのためのScrapyとPyspiderの比較
  • ウェブスクレイピングにScrapyとPyspiderの両方を使う方法
  • WebスクレイピングシナリオにおけるScrapyとPyspiderの共通の制限事項

さあ、飛び込もう!

Scrapyとは?

ScrapyはPythonで書かれたオープンソースのウェブスクレイピングフレームワークである。その主な目的は、ウェブサイトからデータを迅速かつ効率的に抽出することである。具体的には、以下のことができる:

  • 1つまたは複数のウェブページをナビゲートし、情報を収集する方法を定義する。
  • HTTPリクエスト、リンクフォロー、データ抽出などの処理を行う。
  • スロットリングと非同期リクエストでリクエスト速度を調整することで、禁止を回避する。
  • カスタムミドルウェアまたはscrapy-rotating-proxiesライブラリを使用して、プロキシとプロキシローテーションを管理します。

Pyspiderとは?

Pyspiderは Python で書かれたオープンソースのウェブクローリングフレームワークです。ウェブサイトから簡単かつ柔軟にデータを抽出するために構築されており、以下のことが可能です:

  • CLIまたはユーザーフレンドリーなWebインターフェイスのいずれかを介して、1つまたは複数のWebページからナビゲートし、情報を収集する方法を定義します。
  • タスクのスケジューリング、リトライ、データ保存などの側面を処理する。
  • 分散クロールと優先順位付きタスクをサポートすることで、ブロックを制限します。
  • データベースとメッセージキューの組み込みサポートにより、複雑なワークフローとデータ処理を管理します。

Scrapy vs Pyspider:ウェブスクレイピングのための機能比較

さて、ScrapyとPyspiderがどんなものかを学んだところで、ウェブスクレイピングのために両者を比較する時が来た:

特徴 スクラップ ピスパイダー
使用例 大規模かつ複雑なスクレイピング・プロジェクト スクレイピング・タスクのスケジュール
スクレイピング管理 コマンドラインインタフェース CLIとUI
解析方法 XPathとCSSセレクタ CSSセレクタ
データ保存 データをCSVやその他のファイル形式にエクスポート可能 データを自動的にデータベースに保存
リトライ 再試行には手作業が必要 失敗したタスクを自動的に再試行
タスクのスケジューリング 外部との統合が必要 ネイティブ対応
プロキシローテーション ミドルウェア経由のプロキシローテーションに対応 手動介入が必要
コミュニティ 現在54k以上のGitHubスターを持ち、積極的に貢献しているHigeコミュニティ 現在16k以上のGitHubスターを持つ大規模なコミュニティだが、2024年6月11日からアーカイブされている。

上記のScrapyとPyspiderの比較表は、この2つのライブラリが似ていることを示しています。高いレベルでの主な違いは

  • ScrapyはCLI経由でのみ使用できるが、PyspiderはUIも提供する。
  • ScrapyはXPathとCSSセレクタを解析できますが、PyspiderはCSSセレクタしかサポートしていません。
  • Scrapyは、カスタムミドルウェアロジックによって自動的にプロキシローテーションをサポートする。

しかし、本当に重要なことは、Pyspiderがサポートされなくなったということです:

PyspiderアーカイブGitHubリポジトリ

Scrapy vs Pyspider:ダイレクトスクレイピングの比較

ScrapyとPyspiderを比較した結果、この2つのフレームワークは似たようなウェブスクレイピング機能を提供していることがわかりました。そのため、それらを比較する最良の方法は、実際のコーディング例を通して行うことです。

次の2つのセクションでは、ScrapyとPyspiderを使って同じサイトをスクレイピングする方法を紹介します。詳細には、ターゲットページはScrape This Siteの “Hokey Teams “ページになります。これにはホッケーのデータが表形式で含まれています:

スクレイピングする表データ

これらのセクションの目的は、テーブルからすべてのデータを取り出し、ローカルに保存することです。その方法を見てみよう!

ウェブスクレイピングのためのScrapyの使い方

この段落では、Scrapyを使用して、対象のウェブサイトが提供するテーブルからすべてのデータを取得する方法を学びます。

必要条件

このチュートリアルに従うには、あなたのマシンにPython 3.7以上がインストールされている必要があります。

ステップ #1: 環境のセットアップと依存関係のインストール

プロジェクトのメインフォルダーをhockey_scraper/と呼ぶとする。このステップが終わると、フォルダは次のような構造になっている:

hockey_scraper/
   └── venv/

venv/ 仮想環境ディレクトリは次のように作成する:

python -m venv venv

アクティベートするには、ウィンドウズで以下を実行する:

venv\Scripts\activate

同様に、macOS/Linuxでは、次のように実行する:

source venv/bin/activate

これでScrapyをインストールできる:

pip install scrapy

ステップ2:新規プロジェクトの開始

これで新しいScrapyプロジェクトを立ち上げることができる。hockey_scraper/main フォルダの中で、次のようにタイプする:

scrapy startproject hockey

このコマンドで、Scrapyはhockey/フォルダを作成します。その中に、必要なすべてのファイルを自動的に生成します。これが結果のフォルダ構造です:

hockey_scraper/ 
    ├── hockey/ # Main Scrapy project folder
    │   ├── __init__.py  
    │   ├── items.py # Defines the data structure for scraped items 
    │   ├── middlewares.py # Custom middlewares
    │   ├── pipelines.py # Handles post-processing of scraped data 
    │   ├── settings.py # Project settings 
    │   └── spiders/ # Folder for all spiders  
    ├── venv/ 
    └── scrapy.cfg # Scrapy configuration file

ステップ3:スパイダーの生成

対象のウェブサイトをクロールする新しいスパイダーを生成するには、まずhockey/フォルダに入る:

cd hockey

そして、新しいスパイダーを生成する:

scrapy genspider data https://www.scrapethissite.com/pages/forms/

このスクリプトでは、dataはスパイダーの名前を表します。Scrapy は自動的にspiders/フォルダの中にdata.pyファイルを作成します。このファイルには Hokey チームのデータを取得するために必要なスクレイピングロジックが含まれます。

ステップ#4:スクレイピング・ロジックの定義

これでスクレイピング・ロジックをコーディングする準備ができた。まず、目的のデータを含むテーブルをブラウザで確認します。データは.table要素の中に含まれていることがわかります:

HTMLのテーブル・クラス n ターゲット・ウェブ・ページのHTMLコード

全てのデータを取得するには、data.pyファイルに以下のコードを記述します:

import scrapy

class DataSpider(scrapy.Spider):
    name = "data"
    allowed_domains = ["www.scrapethissite.com"]
    start_urls = ["https://www.scrapethissite.com/pages/forms/"]
    
    def parse(self, response):
        for row in response.css("table.table tr"):
            yield {
                "name": row.css("td.name::text").get(),
                "year": row.css("td.year::text").get(),
                "wins": row.css("td.wins::text").get(),
                "losses": row.css("td.losses::text").get(),
                "ot_losses": row.css("td.ot-losses::text").get(),
                "pct": row.css("td.pct::text").get(),
                "gf": row.css("td.gf::text").get(),
                "ga": row.css("td.ga::text").get(),
                "diff": row.css("td.diff::text").get(),
            }

変数nameallowed_domainsstart_urlsは、前のステップでScrapyによって自動的に作成されたことに注意してください。

parse()メソッドもScrapyによって自動的に作成されている。そのため、forループの下にあるこのステップでスクレイピングのロジックを追加するだけでよい。

詳細には、response.css()メソッドはテーブルを検索します。そして、コードはテーブルのすべての行を繰り返し、データを取得します。

ステップ5:クローラーの実行とCSVファイルへの保存

クローラーを実行し、スクレイピングされたデータをCSVファイルに保存するには、次のように入力する:

scrapy crawl data -o output.csv

このコードで、Scrapy:

  • スクレイピングロジックを含むdata.pyファイルを実行します。
  • スクレイピングしたデータをoutput.csvというCSVファイルに保存します。

スクレーパーが生成するoutput.csvファイルは以下の通りである:

期待されるCSVファイル

Scrapyを使用するこの方法は最短ですが、それだけではないことに注意してください。Scrapyはさまざまなカスタマイズや設定を提供しており、それについてはScrapy vs Requestsの記事で詳しく説明しています。

ウェブスクレイピングにPyspiderを使う方法

Pyspiderを使って同じターゲットウェブサイトをスクレイピングする方法をご覧ください。

必要条件

PyspiderはPython3.6を最新バージョンとしてサポートしています。それ以降のバージョンのPythonをインストールしている場合は、次のステップを読んで3.6バージョンの使い方を学んでください。

ステップ #1: 環境のセットアップと依存関係のインストール

プロジェクトのメインフォルダをhockey_scraper/ と呼ぶとする。

Python 3.7以降を持っている場合は、pyenvをインストールしてPython 3.6を入手してください。

Python 3.6をインストールするにはpyenvを使ってください:

pyenv install 3.6.15

そして、異なるバージョンでシステム全体に影響を与えないように、ローカルバージョンのPythonにする:

pyenv local 3.6.15

すべてがうまくいったことを確認するために、Pythonのバージョンを確認する:

python --version

結果はそうでなければならない:

Python 3.6.15

正しいPythonのバージョンを選択して仮想環境を作成する:

python3.6 -m venv venv

このガイドの前の章で示したように、仮想環境をアクティブにします。これでPyspiderをインストールできます:

pip install pyspider

UIを起動するには

pyspider

このリポジトリはアーカイブされており、Python 3.6 を使用しているため、いくつかのエラーが発生することに注意してください。これらを修正するには、以下のライブラリをインストールする必要があるかもしれません:

pip install tornado==4.5.3 requests==2.25.1

また、webdav.pyファイルに関して他のエラーが表示されるかもしれません。そのファイルを検索し、以下を修正してください:

  • ScriptProvider()クラスで、メソッドgetResourceInst() の名前をget_resource_inst()に変更します。
  • ファイルの一番下で、config = DEFAULT_CONFIG.copy()という変数を探し、それに続くコードをすべて次のように変更する:
config = DEFAULT_CONFIG.copy()
config.update({
    "mount_path": "/dav",
    "provider_mapping": {
        "/": ScriptProvider(app)
    },
    "domaincontroller": NeedAuthController(app),
    "verbose": 1 if app.debug else 0,
    "dir_browser": {"davmount": False,
                    "enable": True,
                    "msmount": False,
                    "response_trailer": ""},
})
dav_app = WsgiDAVApp(config)

これでpyspiderのウェブUIが起動できるはずです。ブラウザでhttp://localhost:5000/ にアクセスしてください:

Pyspider UI

ステップ2:新規プロジェクトの作成

新規プロジェクトを作成するには「作成」をクリックし、フィールドに必要事項を入力します:

  • Hockey_scraperなど、お好きなプロジェクト名を選んでください。
  • 開始URL(s)フィールドにhttps://www.scrapethissite.com/pages/forms/

このような結果になるはずだ:

Pyspiderでのプロジェクト作成結果

ステップ3:スクレイピング・ロジックを定義する

UIの右側にあるエディタに直接Pythonコードを記述して、スクレイピングロジックを実装する:

from pyspider.libs.base_handler import *

class Handler(BaseHandler):
    crawl_config = {}

    @every(minutes=24 * 60)
    def on_start(self):
        self.crawl("https://www.scrapethissite.com/pages/forms/", callback=self.index_page)

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc("table.table tr").items():
            self.crawl(each.attr.href, callback=self.detail_page)

    @config(priority=2)
    def detail_page(self, response):
        return {
            "name": row.css("td.name::text").get(),
            "year": row.css("td.year::text").get(),
            "wins": row.css("td.wins::text").get(),
            "losses": row.css("td.losses::text").get(),
            "ot_losses": row.css("td.ot-losses::text").get(),
            "pct": row.css("td.pct::text").get(),
            "gf": row.css("td.gf::text").get(),
            "ga": row.css("td.ga::text").get(),
            "diff": row.css("td.diff::text").get(),
        }

以下はデフォルトのコードからの変更点である:

  • response.doc()メソッドは、ターゲット・テーブルを検索します。
  • detail_page()はrow.css()メソッドによってインターセプトされた行を返します。

保存 “と “実行 “をクリックして、スクレイピング処理を開始する。出来上がったデータは、Scrapyで取得したものと同じようなものになります。

素晴らしい!これでWebスクレイピングにScrapyとPyspiderの両方を使う方法がわかったでしょう。

Scrapy vs Pyspider:どちらを使うべきか?

ScrapyとPyspiderの比較は、その使い方を示したが、どちらが優れているのだろうか?それを知る時が来た!

Scrapyを選択します:

  • 並列クロールやスロットリングなどの高度な機能を必要とする高性能プロジェクト向け。
  • スクレイピングを外部のパイプラインや他のツールと統合する必要がある場合。
  • CLIの使用やウェブスクレイピングのシナリオに自信があり、最新のフレームワークを好むなら。

Pyspiderを選ぶなら:

いつものように、決定的な勝者は存在しない-最良のスクレイピングツールは、あなたの特定のニーズとユースケースに完全に依存する。

ScrapyとPyspiderの限界

ScrapyとPyspiderはウェブスクレイピングのための強力なフレームワークだが、限界がある。

第一に、レンダリングやデータ取得にJavaScriptを使用している動的コンテンツサイトのスクレイピングに苦労している。どちらもJavaScriptを使用したサイトをスクレイピングするために拡張することはできるが、本質的にその面では限界がある。そのため、一般的なスクレイピング対策にも影響を受けやすい。

また、これらのフレームワークはどちらも自動化されたリクエストを大量に行うため、IPバンの対象となる。これらはレートリミッターを作動させる可能性があり、あなたのIPがブラックリストに載ることになる。あなたのIPが禁止されるのを防ぐ解決策は、あなたのコードにプロキシを統合することです。

プロキシのローテーションについては、Pythonでプロキシを使ってIPアドレスをローテーションする方法のガイドを参照してください。

最後に、信頼できるプロキシサーバーをお探しなら、Bright Dataのプロキシネットワークは、フォーチュン500の企業や世界中の20,000人以上のお客様から信頼されていることを覚えておいてください。この広範なネットワークには以下が含まれます:

結論

このScrapyとPyspiderのブログポストでは、Webスクレイピングにおける2つのライブラリの役割について学びました。データ抽出のためのそれぞれの特徴を探り、実際のページネーションシナリオでのパフォーマンスを比較しました。

PyspiderはフレンドリーなUIを提供するが、残念ながら非推奨である。代わりにScrapyは、構造化スクレイピングに必要なツールのほとんどを提供し、その基盤技術は最新のPythonバージョンに対応しているため、大規模なプロジェクトに役立つ。

また、IPバンの可能性など、その限界も発見されたことでしょう。幸いなことに、これらの課題は、プロキシやBright DataのWeb Scraper APIのような専用のWebスクレイピングソリューションを使用することで克服することができます。このスクレイピングに特化したAPIは、Scrapy、Pyspider、その他のHTTPクライアントやウェブスクレイピングツールとシームレスに統合し、無制限のデータ抽出を可能にします。

今すぐ無料のBright Dataアカウントを作成し、プロキシAPIとスクレーパーAPIをお試しください!

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