Scrapy対BeautifulSoup
Scrapeless Scraping Browserは、フレームワークやパーサーを使用するPythonスクレイピングワークフローにおいて、動的ページの取得のためのクラウドブラウザ実行を提供します。
TL;DR
- Scrapyはクローリングフレームワークであり、BeautifulSoupは解析ライブラリです。 アプリケーションが所有すべき責任を比較します。
- BeautifulSoupは、利用可能なHTMLからの焦点を絞った抽出に適しています。 別の取得方法を追加し、タスクが必要とするスケジューリングのみを行います。
- Scrapyは調整されたクローライフサイクルを提供します。 そのスケジューラー、ダウンローダー、スパイダー、パイプラインは、関連するリクエストとアイテムを整理するのに役立ちます。
- 両方のアプローチは動的ページに適した入力を必要とします。 パーサーを変更しても、JavaScriptが実行された後にのみ表示されるコンテンツは作成されません。
Scrapy対BeautifulSoupは、フレームワークとスクレイピングスタックの1つのコンポーネント間の比較です。Scrapyはクローリングと抽出を調整します。BeautifulSoup、正式にはBeautiful Soupは、Pythonコードに解析されたHTMLまたはXMLドキュメントを検索し、ナビゲートする便利な方法を提供します。
あなたはScrapyアプリケーション内でBeautifulSoupを使用できるので、選択は常に排他的ではありません。ドキュメントパーサー、クローライフサイクル、またはその両方が必要かどうかを決定することから始めてください。その質問は、1つのツールが普遍的に速いまたは生産に適していると宣言するよりも、より有用な答えを生み出します。
各ツールが含むもの
Scrapyは調整されたリクエスト処理とアイテム処理を含む一方、BeautifulSoupはそれに供給されるドキュメントツリーに焦点を当てます。これは、ほとんどの実際的なトレードオフの背後にある中心的な違いです。
| 責任 | Scrapy | BeautifulSoup |
|---|---|---|
| ページをダウンロードする | クローリングに統合されたダウンローダー | 別の取得コンポーネントを使用します。 |
| コンテンツを解析して選択する | 組み込みのセレクターインターフェース | 選択されたパーサーを介したツリーのナビゲーションと検索 |
| 発見されたURLをスケジュールする | フレームワークスケジューラーとリクエスト | アプリケーションまたは他のフレームワークはスケジューリングを所有します。 |
| 抽出されたレコードを処理する | アイテムパイプラインとフィードエクスポート | アプリケーション定義の検証と出力 |
| ページのJavaScriptを実行する | 適切なブラウザ統合が必要です | 別のコンポーネントからレンダリングされた入力が必要です。 |
| プロジェクトライフサイクルを制御する | フレームワークの規約と設定 | 通常のPythonアプリケーション構造 |
BeautifulSoupの小さな範囲は、アプリケーションがすでに取得とストレージを処理している場合に利点になることがあります。Scrapyの広い範囲は、そうしなければ自分でその調整層を構築することになる場合に利点になります。役立つ比較は、完全に提案されたスタックであり、各パッケージを孤立させることではありません。
Scrapyクローラーがフレームワークを通じてどのように移動するか
Scrapyクローラーはリクエストをスケジューラーとダウンローダーを通じて移動し、応答をスパイダーに送信し、抽出されたアイテムを処理パイプラインを通じて渡します。 Scrapyアーキテクチャ は、これらのステージを明示化して、スパイダーが記録と追加のリクエストの両方を生成できるようにします。
この構造は、インデックスページがカテゴリを明らかにし、カテゴリが詳細ページを明らかにし、詳細ページがアイテムを生成するカタログに適しています。フレームワークは保留中のリクエストを調整し、あなたのスパイダーはソース固有の関係を記述します。共有検証またはストレージの動作は、個々のページコールバックの外で存在できます。
フレームワークの構造には、依然としてアプリケーションポリシーが必要です。発見されたリンクに従う前に、許可されたソース、有用なURLパターン、および停止条件を定義してください。よく整理されたクローラーは、発見ルールがすべてのリンクを認めている場合に依然として無関係なページを収集できます。そのアーキテクチャはスコープを中央集権化しやすくしますが、あなたのためにスコープを選ぶことはありません。
Scrapyには、プロジェクトのメンテナンスの一部となる設定と拡張ポイントもあります。開発者は、リクエストがどこで変更され、アイテムがどこで拒否されるかを理解する必要があります。その学習コストは、複数のスパイダーが共有動作から利益を得る場合には正当化されますが、狭い1ドキュメントのタスクには不要かもしれません。
BeautifulSoupが小さな抽出タスクにどのように適合するか
BeautifulSoupは、Pythonがすでにドキュメントを持ち、読みやすい抽出ルールを必要とするタスクに適しています。 Beautiful Soupドキュメントナビゲーションインターフェース 選択したパーサーと連携し、要素検索、CSS選択、ツリー走査を提供します。
既存のアプリケーションによってダウンロードされた公開テーブルに対して、BeautifulSoupは小さな追加機能となります:受け入れられたマークアップをロードし、各行を特定し、そのセルを読み取り、結果のフィールドを検証します。もともとの入力がウェブサイトから来たという理由だけでクロールフレームワークは必要ありません。
周囲のプログラムが残りを所有します。文書を取得し、ソースを特定し、失敗がどのように表現されるかを決定し、受け入れられたレコードを書き出す必要があります。ページが追加されると、別のフレームワークが提供しない限り、スケジューリングや重複排除も所有します。この柔軟性は便利ですが、設計見積もりには視覚的に残るべきです。
インストールされた依存関係に頼るのではなく、パーサーを指定してください。異なるパーサーの選択肢は、誤ったマークアップから異なるツリーを構築する可能性があります。開発者のマシンで機能するセレクターは、パーサーの設定が変更されるとデプロイ後に異なる動作をするかもしれません。
セレクターは完全なスクレイピングアーキテクチャではありません
セレクターの品質は両方のアプローチで抽出の正確性に影響を与えますが、フレームワークの選択を決定するものではありません。Scrapyの CSSとXPathセレクターインターフェイス は、自身の抽出サーフェスを提供します。BeautifulSoupは、CSS選択サポートを持つ独自の検索およびトラバーサルモデルを提供します。
まず、1つのエンティティを表すコンテナを見つけます。そのコンテナ内のタイトルとオプションのフィールドを読み取り、欠落している値がレコード間の関連をシフトしないようにします。このルールは、表現がScrapyのレスポンスを介して書かれているかBeautifulSoupのオブジェクトを介して書かれているかよりも重要です。
パーサーは誤ったページを忠実に処理できます。アクセス通知には、広範なセレクターを満たす見出しや段落が含まれているかもしれません。抽出値を受け入れる前に文書の種類を検証してください。タイトルといくつかのテキストは、コレクターが要求されたカタログエントリに到達したという十分な証拠ではありません。
クロール調整がScrapyを正当化する時
Scrapyは、共有リクエスト調整とアイテム処理が繰り返しのニーズであるとき魅力的になります。そのトリガーはワークフローの複雑さであり、普遍的なページ数のしきい値ではありません。複数のページタイプと持続的な状態を持つ適度なクロールは、大きな固定リストのシンプルな文書よりも多くの調整が必要かもしれません。
Scrapyの アイテムパイプラインモデル は、抽出後に検証、正規化、重複処理、および永続性に明確な場所を提供します。これは、多くのスパイダーが同じ出力契約を満たす必要があるレコードを生成する場合に便利です。
長時間実行される作業の場合、Scrapyは構成されたジョブディレクトリを通じて適切なクロール状態を持続させ、クリーンに停止したジョブを再開できます。この機能には要件と制限があります。すべての任意のアプリケーションオブジェクトまたは外部セッションが無期限に有効であることを意味しているわけではありません。各ジョブの状態を分け、計画している実際の一時停止・再開ワークフローをテストしてください。
BeautifulSoupは、同じように設計された生産アプリケーションに参加できますが、周囲のシステムがこれらの調整責任を提供する必要があります。ライブラリが意図的に解析に焦点を当てているだけで生産に不適切だと呼ぶのは避けてください。サービス全体とその運用上の所有権を評価してください。
現実的なワークロードで示された3つの決定
適切な選択は、作業の形と既存のインフラストラクチャに従います。以下のシナリオは、測定されたベンチマークではなく、示唆的な選択例です。
既存のPythonジョブにおける単一の公開テーブル
アプリケーションが既に知られている文書をダウンロードし、既存のパイプラインにテーブルを抽出する必要がある場合はBeautifulSoupを使用します。行のスキーマを明示的に保ち、欠落しているセルを正しく保持してください。別のクロールは、現在のメンテナンスの負担を取り除かずに概念を追加することができます。
カテゴリと詳細ページを持つカタログ
カテゴリが詳細リクエストを導き、多くのページが収集ポリシーを共有する場合はScrapyを使用します。発見をスパイダーに配置し、アイテムパイプラインで共通の検証を集中化し、重複リクエストを重複製品レコードから区別してください。これは、責任を正当化するためにフレームワークを使用します。
複雑なHTMLフラグメントを持つ確立されたScrapyプロジェクト
特定のフラグメントの解釈が容易になる場合は、Scrapyコールバック内でBeautifulSoupを使用します。同じ文書を必要なく複数のインターフェースを介して解析するのではなく、そのフラグメントのための明確な抽出パスを保持してください。既存のScrapyスケジューリングと出力処理はそのままにしておくことができます。
動的ページには取得の決定が必要です
通常のScrapyダウンロードやBeautifulSoup解析は、ページのJavaScriptを単独で実行しません。レスポンスがシェルのみを含む場合、一方の抽出インターフェースを他方で置き換えても欠落したノードは作成されません。ツールを変更する前に取得した表現を検査してください。
Scrapeless スクレイピング ブラウザ は、スクリプトやインタラクションに依存する必要な状態のためのクラウドブラウザ実行を提供します。 スクレイピングブラウザサービス紹介 は取得層を説明します。抽出された文書は、その後、Pythonアプリケーションで選択されたパーサーと検証契約を通じて処理されます。
関連する BeautifulSoup 静的および動的抽出のウォークスルー はこの分離を拡張します。抽出が始まる前に存在しなければならないページ状態を定義し、 Scrapeless価格を使用してコスト見積もりにブラウザ作業を含めます。
結論:ツールを欠落した層に一致させる
利用可能な文書の可読解析が欠けている場合はBeautifulSoupを選択してください。調整されたクロールと共有アイテム処理が欠けている場合はScrapyを選択してください。特定の解析作業がScrapyライフサイクル内でBeautifulSoupから利益を得る場合に、それらを組み合わせ、ブラウザ依存の取得を別の要件として扱ってください。
Pythonスタックが必要とする文書を提供してください
ダイナミックページの取得にはScrapeless Scraping Browserを使用し、プロジェクトに合ったPythonツールでクローリングの調整とパースを維持してください。
今日サインアップして $5の無料クレジットをゲット — クレジットカードは不要.
$5クレジットを請求する →FAQ
Q: ScrapyはBeautifulSoupより優れていますか?
Scrapyは調整されたクローリングライフサイクルが必要なプロジェクトに適しており、BeautifulSoupは焦点を絞ったドキュメントパーシングに適しています。彼らは異なるレベルで機能し、組み合わせることができます。2つのパッケージを直接の代替物として扱うのではなく、完全なアプリケーションの責任を比較してください。
Q: BeautifulSoupはScrapyと一緒に使用できますか?
BeautifulSoupはScrapyのコールバック内でレスポンスコンテンツをパースできます。Scrapyはスケジューリングとアイテム処理を管理し続け、BeautifulSoupは特定のドキュメントフラグメントを処理します。抽出の明確さが向上する場合は、その組み合わせを使用し、不必要な繰り返しパースを避けてください。
Q: BeautifulSoupは常に遅いですか?
BeautifulSoupはユニバーサルな速度の主張によって、全体のScrapyクロールと対照的に有意にランク付けされていません。パーサーの選択、入力サイズ、同時性、ネットワークの遅延、バリデーションなどが総時間に影響を与えます。同等のドキュメントと出力要件を比較し、ダウンロードとは別にパースを測定してください。
Q: どのツールがJavaScriptでレンダリングされたページを扱いますか?
BeautifulSoupもScrapyの通常のHTTPダウンローダーも、ページのJavaScriptを単独で実行しません。ブラウザ統合または他の適切な取得方法が必要なコンテンツを提供しなければなりません。一度ドキュメントが存在すれば、アプリケーションが選択したパーサーがそのフィールドを抽出できます。
Q: プロジェクトがScrapyに移行すべきページ数は?
Scrapyが必要なユニバーサルなページ数はありません。URLの発見、共有設定、ジョブの状態、アイテム処理が繰り返し調整作業になったときに移行を考慮してください。すでにそれらのレイヤーを提供している既存のアプリケーションは、BeautifulSoupを成功裏に使用し続けることができます。