BeautifulSoupとSeleniumを使ったWebスクレイピング:完全ガイド

  • BeautifulSoup と Requests は、サーバーからすでにレンダリングされた HTML の静的スクレイピングに最適です。
  • Selenium を使用すると、JavaScript を読み込み、iframe を処理し、動的なページでのユーザー アクションをシミュレートできます。
  • レンダリング用の Selenium と解析用の BeautifulSoup を組み合わせることで、柔軟性と精度が向上します。
  • 倫理、robots.txt の尊重、適切なエラー管理は、あらゆるスクレイピング プロジェクトにおいて重要です。

BeautifulSoupとSeleniumを使ったWebスクレイピング

上司に聞かれたら 競合他社の価格を監視したり、レビューを分析したり、数百ページからデータを収集したりできます。手作業によるコピー&ペーストはもう終わりです。面倒な作業に時間を費やしたり、繰り返し作業に何時間も費やしたりすることなく、情報抽出を自動化する方法が必要です。

Pythonエコシステムでは、このために最もよく耳にする2つのツールは次の通りです。 BeautifulSoupとSelenium1つはHTMLを素早く簡単に解析することに優れており、もう1つは実際のブラウザを開き、JavaScriptを実行し、クリックし、フォームに入力し、人間のユーザーのように動作します。重要なのは、それらをしっかりと理解することです。 それぞれをいつ使うか、どのように組み合わせるか 最大限に活用するためです。

ウェブスクレイピングとは何か?いつ使うのが適切か?

ウェブスクレイピングとは、 ウェブページからデータを抽出するプロセスコピー&ペーストでも可能ですが、情報量が増えるにつれて、ページを調べて興味のあるものを保存するスクリプトや自動ツールに頼るのが合理的です。

スクレイピングでは 製品リストと価格、ニュース、レビュー、コメント、ソーシャルメディアの投稿をまとめます あるいは、Web上で公開されている事実上あらゆるコンテンツ。これは、多くのデータ分析、機械学習、タスク自動化プロジェクトの準備段階として役立ちます。

ただし、スクレイピングを戦略とすべきタイミングについて明確にすることが重要です。 最初ではなく最後の手段サイトが既に十分に文書化された公式 API を提供している場合は、通常はそれを使用する方がよいでしょう。より安定しており、通常は使用制限が明確で、何かを壊したり利用規約に違反したりするリスクが軽減されます。

スクレイピングが意味を持ち始めるのは API がないか、API が不完全であるか、または Web インターフェースにのみ表示されるデータが必要です。埋め込みコメント、ランキング、小さなタグ、動的に生成されるコンテンツ ブロックなど。

混同されやすい 2 つの概念を区別することも重要です。 ウェブスクレイピングとウェブクローリングスクレイピングは特定のページから特定のデータを抽出することに重点を置いていますが、一方、クロールは サイトまたはウェブ全体の構造を探索してマッピングする検索エンジンがコンテンツをインデックスするのと同じように、リンクをたどることで。

法的および倫理的側面:無視してはいけないこと

スクレーパーを無謀に起動する前に、少し時間を取って考えてみる価値があります。 法的、技術的、倫理的な影響自分のウェブサイトや学術プロジェクトをスクレイピングすることは、他の人のデータを基に商用サービスを立ち上げることとは異なります。

まず最初に確認すべきことは、 あなたの国または地域の法律を遵守するデータ保護、プライバシー、個人情報の利用といった問題は、場所によって大きく異なる可能性があるため、無視するのは賢明ではありません。機密性の高いデータや個人を特定できるデータを扱う場合は、テクノロジー法に精通した専門家に相談することをお勧めします。

次のステップは、サイトに スクレイピングを禁止する利用規約多くのポータルでは、自動データ抽出、情報の商用利用、特定のセクションへの不正アクセスに関する具体的な条項が利用規約に含まれています。

必ず確認すべき重要な点が1つあります。それはファイルです。 robots.txtのドメインのルートに次のような場所があります。 https://www.ejemplo.com/robots.txtそこで、所有者は、例えば次のような指示を通じて、クロールやインデックスを希望しないルートを指定します。 禁じます ルートをブロックしたり クロール遅延 リクエスト間の遅延を最小限に抑えるためです。

これらのガイドラインを尊重することは倫理の問題であるだけでなく、 1 秒あたり数百のリクエストでサーバーに過負荷をかけないでください。適切に設計されていないスクレーパーはサービス拒否攻撃に似ている可能性があり、洗練されていないだけでなく、問題を引き起こす可能性があります。

最後に、自分自身に問いかけてみましょう データの使用目的は合理的です。そのまま再配布しますか?他のソースと混ぜますか?社内プロジェクト用ですか?それとも情報の再販用ですか?これらの質問は、リスクとソリューションの設計方法に大きく影響します。

ウェブページが実際に読み込まれる仕組み: HTML、CSS、JavaScript、iframe

効果的にスクレイピングを行うには、スクリプトがリクエストを発行した際に実際に何を見ているかを理解することが不可欠です。理想的な状況では、サーバーから受信したページには既に以下の情報が含まれています。 興味のあるコンテンツを含むすべてのHTMLブラウザが行うことは、CSS でスタイルを設定し、JavaScript で少しインタラクティブ性を追加することだけです。

現実はそれほど美しくはない。多くの現代のウェブサイトは JavaScript を使用して遅延データを読み込み、iframe を使用してサードパーティのコンテンツを埋め込みます。 あるいは、DOMをリアルタイムで書き換えます。ブラウザの従来の「ソースの表示」メニューを開くと、画面に表示されるコメント、カウンター、動的ブロックの痕跡が全く表示されないことがあります。

典型的な例としては、次のようなコメントシステムが挙げられる。 ディスカス元の HTML にはコメントが 1 行も含まれていない可能性がありますが、ブラウザによって生成される最終的な DOM にはコメントが 1 行含まれている可能性があります。 JavaScript によって作成された iframe スレッド全体が読み込まれる場所です。そのページを静的にスクレイピングしようとすると、HTMLが「不完全な」状態になってしまいます。

このようなシナリオでは、戦略には 実際のブラウザの動作をシミュレートするページを読み込み、JavaScript を実行し、必要な要素が表示されるまで待ってからコンテンツを抽出します。ここで Selenium の出番です。

RequestsとBeautifulSoupを使った静的スクレイピング

必要なコンテンツがすでに最初のHTMLに含まれている場合(典型的な製品、ニュース、シンプルな表、静的なリストなど)、最も効率的なアプローチは通常、 HTTPリクエストを作成するためのRequestsとHTMLを解析するためのBeautifulSoup軽くて素早いスクレーピングに最適な定番のペアです。

基本的な流れはシンプルです。まずリクエストを送信します。 リクエスト.get(url) そして、反応を分析します。手に持った物体を見れば ステータスコード(status_code)、テキストコンテンツ(text)、またはバイナリコンテンツ(content)ヘッダーと最終 URL を検査して、サーバーが返す内容をより深く理解するだけでなく、

HTML ができたら、通常は次のようにして BeautifulSoup に渡します。 BeautifulSoup(html, "html.parser")パーサーはテキストをツリー構造に分解します。これにより、タグ、属性、ネストされたコンテンツの検索が容易になります。

このスープオブジェクトでは次のようなメソッドが使えるようになります。 find、find_all、またはselect 特定のノードを見つけるには、例えば、 チュートリアル、表の行、ニュースセクションのリンクなど または、合理的に一貫した HTML 構造を持つページの任意の部分。

典型的な例としては、Página 12のようなデジタル新聞用のスクレーパーを設定することが挙げられます。フロントページにリクエストを送信し、 セクションブロックを解析し、ニュースリンクを見つける そこから、体系的にナビゲートして、見出し、日付、本文、メイン画像、興味のあるデータを表示し、それを辞書にパッケージ化してデータベースに保存できるようにします。

これらのスクレーパーでは、ロジックを追加することをお勧めします。 try-exceptによるエラー処理 単一の障害 (構造が変更されたニュース項目、失敗したリクエスト、タグの欠落) によってプロセス全体が停止するのを防ぐため、特定の例外をキャッチし、エラーを無視するタイミングと停止するタイミングを決定することは、この種のプロジェクトの日常業務の一部です。

Selenium による動的スクレイピング: JavaScript、iframe、ユーザーアクション

ウェブがあらゆる面でJavaScriptに依存するようになると、静的スクレイピングは機能しなくなります。コンテンツがオンザフライで生成される場合、 iframe またはボタン、フォーム、または動的要素を操作した後にのみ表示されますすべてのロジックを実行する実際のブラウザまたはヘッドレス ブラウザが必要です。

ここでSeleniumが力を発揮します。Seleniumは元々、 Webアプリケーションの機能テストを自動化するしかし、ページを開いてクリックし、入力して、コンテンツが読み込まれるのを待つなど、ブラウザを処理できるため、動的スクレイピングにとって非常に強力なツールになります。

Seleniumの核となるのはWebDriverです。これは、選択されたブラウザ(Chrome、Firefoxなど)を制御するコンポーネントです。これを使用するには、 ブラウザ固有のドライバー (Firefox の場合は geckodriver、Chrome の場合は chromedriver など)、システムからアクセス可能なパスに配置する必要があり、通常は PATH 環境変数に含まれています。

基本的なPythonのインストールは次のように行います。 pipインストールセレンそこから、スクリプト内でWebDriverのインスタンスを作成します。例えば、 webdriver.Firefox() または webdriver.Chrome()これで、実際のユーザーと同じように、ページを閲覧したり、URL を開いたり、ページを操作したりできるようになります。

ブラウザの種類としては、グラフィカルインターフェースを備えたフルブラウザやスタンバイモードのブラウザが使用できます。 レス理論的には PhantomJS のような代替手段がありますが、実際には多くの人が非互換性や奇妙な動作を報告しているため、通常は以下を使用することをお勧めします... ChromeまたはFirefoxをリアルモードまたはヘッドレスモードで使用する 驚きを減らすためです。

ページが読み込まれると、Selenium ではさまざまなセレクターを使用して要素を見つけることができます。 ID、名前、クラス、CSSセレクター、またはXPathで次のようなメソッドを呼び出すことができます find_element または find_elements そこから、クリック、send_keys などのアクションを起動したり、各ノードの表示テキストを取得したりします。

SeleniumとBeautifulSoupを組み合わせて最大限に活用する

複雑なサイトの場合、最も強力な組み合わせは通常次のようになります。 Selenium はページの読み込み、JavaScript の実行、最終的な DOM の準備を処理します。その後、BeautifulSoup がレンダリングされた HTML を解析してデータを抽出します。 検索機能の利便性をすべて備えています。

基本的なパターンはシンプルです。まずWebDriverを初期化し、URLをロードします。 ドライバー.get() 必要に応じて、明示的な待機を使用して特定のキー要素が表示されるまで待機します。コンテンツが読み込まれたことを確認したら、 driver.page_source を含む最終的な HTML.

静的スクレイピングと同様に、そのHTMLをBeautifulSoupに渡して反復処理します。 表、リスト、記事、行、または繰り返し構造を持つブロックこれにより、Selenium セレクターの機能を活用してページの正しい部分に到達し、BeautifulSoup の柔軟性を活用してデータをきれいに抽出できるようになります。

Disqusコメントなどのiframeを使用するページでは、 特定のiframeにコンテキストを変更する コンテンツを抽出する前に、Selenium で iframe(例えば、コンテナ ID が disqus_thread であるもの)を見つけ、switch_to.frame を使って iframe 内に入ったら、コメントカウンターやテキストブロックなどの要素が読み込まれるのを待ちます。

コンテンツジェネレーターのような他のケースでは、この組み合わせはさらに明白です。スターウォーズの名前ジェネレーターで、 男性名、女性名、または混合名を希望する場合、また一度に何名希望するか例えば、クリックごとに100件の名前が生成される場合などです。Seleniumは適切なオプション(例えば、name="choice"、value="100"のラジオボタン)を選択し、「生成」ボタンをクリックして、名前のテーブルが構築されるのを待ちます。

名前の表が表示されたら、 driver.page_source を BeautifulSoup に渡します対応するテーブル (たとえば、ページの 4 番目のテーブル) を探し、そこからすべてのセルを抽出します。テキストをクリーンアップし、異常な文字を置き換え、重複を削除し、新しい名前をリストに保存します。

このプロセスを、例えば100.000万件の名前に達するまで繰り返すループでは、Seleniumがユーザーインターフェースの操作を自動化し、BeautifulSoupがデータの抽出とクリーニングを処理します。このようなプロセスには時間がかかることも珍しくありません。 1時間以上したがって、タイミングを制御し、例外を処理し、必要に応じて中間状態を保存して、作業の損失を回避することをお勧めします。

BeautifulSoup、Selenium、API の実践的な使用例

これらのピースをすべて揃えれば、次のようなさまざまなプロジェクトを構築できます。 個人用のシンプルなスクレーパーから複雑な大規模抽出パイプラインまで重要なのは、各レイヤーに適切なツールを選択することです。

例えば出版業界では、新聞社のウェブサイトをクロールして、 特定のセクションの記事については、本文、著者、日付、タグ、メイン画像をダウンロードします。 後でコンテンツ分析や NLP プロジェクトを行うためにデータベースに保存します。

電子商取引の典型的な例としては、航空会社のウェブサイトや航空券比較サイトから情報をスクレイピングして、 価格、スケジュール、出発空港と到着空港を取得します手荷物制限やその他の役立つ情報。ここでは HTMLが静的な場合のリクエストとBeautifulSoupフォームや動的セレクターを操作した後に結果が表示される場合は、Selenium などを使用します。

もう一つの典型的なプロジェクトは、スクレイピングと 公式API(利用可能な場合)たとえば、Spotify API を使用してアーティスト、アルバム、曲に関する情報を取得し、同時に音楽ブログや Web サイトからレビューやコメントをスクレイピングして、ユーザーの意見でデータを充実させることができます。

一度限りのスクリプトを超えて、 大量のデータに対応するScrapyは、リクエストキュー、スパイダー管理、ミドルウェア、パイプラインといった機能を備えた、スクレイピングに特化したフレームワークです。Seleniumは特定のケースでは依然として有用です。JavaScriptの実行を必要とするスパイダーにSeleniumを統合するだけで、Seleniumの開発が効率化されます。

これらすべてのケースにおいて、倫理と合法性は依然として適用されます。robots.txtを尊重し、リクエストの頻度を適度に抑えることが重要です。 プライベートエリアにアクセスしたり、セキュリティ対策を回避したりしないでください。 特に商業的に利用する場合には、責任を持ってデータを使用してください。

エラー管理、作業環境、ベストプラクティス

強力なスクレイパーとは、ライブラリの使い方を知っているだけでなく、 作業環境を適切に整理し、エラーを制御し、コードを読みやすく再利用しやすい状態に保ちます。プロジェクトが少しでも成長すれば、正しいスタートを切ったことを喜ぶことになるでしょう。

LinuxやmacOSのプロフェッショナルプロジェクトでは、通常、プロジェクト専用のフォルダを作成し、 venvを使用した仮想環境これをアクティブ化し、その中に必要な依存関係のみをインストールします (ノートブックを使用する場合は、requests、beautifulsoup4、selenium、jupyter など)。これにより、環境の再現、パッケージの更新、またはプロジェクトを別のマシンに移行することがはるかに簡単になります。

より軽い環境やラピッドプロトタイピングでは、多くの人が グーグルコラボpip を使って必要なライブラリをインストールし、ブラウザから直接作業できます。ただし、本格的なプロジェクトの場合は、コードのバージョン管理や認証情報の安全な管理が可能な、管理された環境に移行することをお勧めします。

日々の業務では、例外を処理する必要があります。リクエストが失敗した場合、Selenium要素が時間どおりに表示されない場合、あるいはBeautifulSoupが期待したノードを見つけられない場合、Pythonは例外をスローします。 キャッチされない場合、プログラムが停止する例外try-except ブロックを使用すると、これらの失敗を処理し、発生した問題をログに記録し、その URL をスキップするか、再試行するか、実行を停止するかを決定できます。

機能的なデザインは秩序を維持するのにも大いに役立ちます。 ページをダウンロードするプログラム、リンクを解析するプログラム、ニュース記事の内容を抽出するプログラム また、データを保存する別のモジュールを使用すると、各部分を個別にテストしたり、コードを再利用したり、サイトの構造が変更されたときに実装を変更したりできます。

最後に、記事の注目画像などのマルチメディア コンテンツをダウンロードする場合は、そのロジックを処理する特定の関数にカプセル化する必要があります。 URL を受信し、リクエストを行い、適切な名前でファイルを保存し、接続エラーを処理します。こうすることで、同じコード ブロック内にあまりにも多くの責任が混在することを回避できます。

つまり、最新の Web ページの構築方法、静的 HTML で十分な場合と実際のブラウザーが必要な場合を理解し、それらを適切に組み合わせれば、望ましい結果を得ることができます。 リクエスト、BeautifulSoup、Selenium、API、Scrapyなどのツールデータ抽出は非常にエレガントに自動化できます。重要なのは、技術的および法的制限を尊重しながら慎重に実行し、数か月後でも各部分が何をしているかを把握できるようにコードを整理しておくことです。