この記事では、以下の事項を説明します。
- スクレイピングの仕組みとは?
- PythonのBeautiful Soupとは?
- RequestsおよびBeautiful Soupのインストール
- equestsとBeautiful Soupを使ったPythonでの簡単なスクレイピングの手順
スクレイピングの仕組みとは?
ウェブページのスクレイピングとは、対象のウェブページから特定のデータを要求することです。ページをスクレイピングする際に、書かれたコードは、目的地のページをホストしているサーバーにリクエストを送ります。その後、このコードはページをダウンロードし、クローリングジョブで最初に定義されたページの要素のみを抽出します。
例えば、H3のタイトルタグでターゲットデータを探すとします。その情報を探すためのスクレイパーのコードを書くことになります。スクレーパーは3段階で機能します。
ステップ1:サイトのコンテンツをダウンロードするリクエストをサーバーに送信します。
ステップ2:ページのHTMLをフィルタリングして、目的のH3タグを探します。
ステップ3:テキストをターゲットタグにコピーし、あらかじめコードで指定したフォーマットで出力します。
多くのプログラミング言語で様々なライブラリを用いてウェブスクレイピング作業を行うことができますが、PythonとBeautiful Soupライブラリを用いることは、最も一般的で効果的な方法の一つです。以下のセクションでは、Beautiful Soupを使ったPythonでのスクレイピングの基本について説明します。
PythonのBeautiful Soupとは?
Beautiful Soupは、HTMLやXMLファイルの解析ツリーをナビゲート、検索、修正するためのシンプルなメソッドを提供します。複雑なHTMLドキュメントをPythonオブジェクトのツリーに変換します。また、自動的にユニコードに変換されるので、エンコーディングを考える必要がありません。このツールは、スクレイピングだけでなく、データのクリーニングにも役立ちます。Beautiful Soupは、標準のPythonライブラリに含まれるHTMLパーサーをサポートしていますが、lxmlやhml5libのようなサードパーティのPythonパーサーもいくつかサポートしています。
その機能の全容は、こちらでご覧ください。Beautiful Soup documentation.
RequestsおよびBeautiful Soupのインストール
Beautiful Soupをインストールするには、pipなどのPythonのインストーラーが必要です。Jupyter Labを利用することもできます。この記事では、最も便利なpipを使用します。そのためには、ターミナルで次のコードを実行します。
1: Requests
2: Hml5lib
RequestsとBeautiful Soupを使ったPythonでの簡単なスクレイピングの手順
ステップ1:スクレイピングしたいページのサーバーにHTTPリクエストを送信する必要があります。サーバーは、ウェブページのHTMLコンテンツを送信することで応答します。リクエストにPythonを使うので、サードパーティのHTTPライブラリが必要で、Requestsを使うことにします。
まずRequestsライブラリをインポートして、URLに簡単なGETリクエストをします。https://www.brainyquote.com/topics/motivational-quotesを選んだのは、シンプルなHTML構造であり、Beautiful Soupの可能性を簡単に実証することができるからです。 レスポンス[200]があれば、これは本質的にサイトがHTTP 200 OKレスポンスコードで応答して、ページのHTMLコンテンツを送ってきたことを意味します。もう一度同じリクエストをしてみましょう。今度は結果をrという変数に格納し、その内容を表示します。 このページのHTMLコード全体が出力されるはずです。ご覧の通り、非構造化されているので、Beautiful Soupは、クリーンアップし、必要なデータを取得するのに役立ちます。
もう一度同じリクエストをしてみましょう。今度は結果をrという変数に格納し、その内容を表示します。 このページのHTMLコード全体が出力されるはずです。ご覧の通り、非構造化されているので、Beautiful Soupは、クリーンアップし、必要なデータを取得するのに役立ちます。
ステップ2:HTMLのコンテンツができたので、データをパースする必要があります。そのためには、パーサーのhtml5libを使ったBeautiful Soupを使用します。BeautifulSoup()に次の2つの値を渡す必要があります。
#1: ウェブサイトのHTML文字列、「r.content」
#2: 使用するHTMLパーサー、「html5lib」
ステップ3:このとき、スクレイピングするサイトに移動したい場合。Devtoolsを開き(F12)、Elementsタブを開きます。一番上のテーブルレイヤーを探します。
これまでの内容を把握するために、表をプリントアウトして、.prettify()を使ってみましょう。
出力は次のようになります。
今度は必要なデータを探します。この例では、引用されたテキストと著者名だけが必要です。ご覧のように、これらのデータはすべて次の場所にあります。
これで、各ループインスタンスの
「img alt」キーの情報を探しているので、引用符の変数を作成して、このデータを代入してみましょう。
ご覧の通り、「try」ステートメントでラップしています。この場合、1つの行に目的のデータがなくても、エラーにはならず、ループは継続されます。また、結果を「-」で分割しました。先ほど見たように、本文と著者名は「-」で区切られています。 それを利用して、両者を分離して分割してみましょう。
これで完了です。見積もり変数は、次のようになります。
このプロセスの最後に、データをファイルに保存することができ、コードは次のようになるはずです。