Beautiful SoupとPythonを使ってウェブスクレイピングをしてみました。

参考にしたサイト

前提

Pythonはすでにインストールされている想定で進めます。Pythonがインストールされていない場合は、PythonとSeleniumを使ったブラウザ自動操作を参考にインストールしてください。

Beautiful Soupのバージョン

Beautiful Soupにはバージョン3系とバージョン4系があります。バージョン3系はすでに開発が終了していますので、ここではバージョン4系で進めます。

Beautiful Soupのインストール

コマンドプロンプトでpip install beautifulsoup4を実行します。

インターネット上のリソースを取得する

スクレイピングするにはまず、スクレイピングの対象となるWebページのHTMLを取得する必要があります。URLを指定してHTMLを取得する方法はいくつかありますが、ここではurllib.requestを使ってみます。以下のサイトが参考になります。

これを実行すると、対象のURLのHTMLが取得できることがわかります。

HTMLソースをBeautiful Soupに食わせる

7行目でHTMLからBeautiful Soup オブジェクトを取得しています。このBeautiful Soup オブジェクトを操作することで、このページのコンテンツを取得していきます。
8行目は取得したBeautiful Soup オブジェクトのprettify()メソッドを使用することで、1行に1タグのきれいにフォーマットされた形でHTMLを表示しています。

ユーザーエージェントを設定する

前の手順で出力されたHTMLをよく観察すると、Google ChromeでYahooへアクセスしたときのHTMLと異なっていることに気づきます。これはYahooのサイトがブラウザを判定してブラウザ毎に異なったHTMLを表示しているからです。
スクレイピングをする際に、Google Chromeなどで抽出したいタグを特定していく作業をしていきますが、取得されるHTMLがChromeと異なるとその作業が非常にやりにくくなります。そこでurllib.request.urlopenでYahooにアクセスする際にChromeでアクセスしていることにしてしまいます。HTTPヘッダーにはユーザーエージェントというデータが有り、これがアクセスしているブラウザを指定しています。これをChromeのものに書き換えます。

6行目で設定しているのがユーザーエージェントでGoogle Chromeの例です。
これを実行すると先ほどとは異なるHTMLが取得できていることがわかるはずです。またこのHTMLがGoogle Chromeで見ているHTMLと同じものだということもわかります。

CSSセレクタを使ってタグを取得する

一旦Beautiful Soup オブジェクトを取得できると、このオブジェクトを操作して様々なデータを取得できます。select()メソッドを使うと、CSSセレクタを使ってタグオブジェクトを取得することができます。

12行目で抽出したい要素のセレクタを指定しています。CSSと同様の指定方法でセレクタを指定できます。ここではYahooのページの左側メニューの主なメニューを取得しています。
ここで取得できる要素は複数ありますので結果(変数tags)はリストで返ります。そこで13行目でリストを繰り返しで処理して一つずつ表示しています。

スクレイピングでBeautiful Soupを使うかSeleniumを使うか

この記事ではBeautiful Soupを使ったスクレイピングを紹介しましたが、こちらの記事ではSeleniumを使ったスクレイピングを紹介しています。どちらを使うかはその時々で使い分けるべきでしょう。Seleniumを使うとブラウザの動作を自動化するという感覚に対し、Beautiful SoupはスクリプトでDOM操作する際に非常に便利になるという感覚で使用するレイヤーがそもそも違うように感じます。具体的にはログイン操作をしたり、JavaScriptの動的コンテンツを読み込んだりする場合はSeleniumを使ったほうが便利でしょうが、一つ一つの動作が重いためSeleniumを使うべき理由が無い場合はBeautifulSoupを使ったほうが良いことが多いでしょう。

Webスクレイピングの実例

スクレイピングをして以下のようなデータ調査を行いました。