5log

日々の仕事の備忘録

BeautifulSoup4を使用してWebサイトをスクレイピングする方法

今回はデザインから少し離れて、Pythonを使ったWebスクレイピングの記事を書こうと思います。

はじめに:Webスクレイピングとは?

スクレイピングの概要についてはWikipediaの説明が非常に詳しいので、そちらを参照してください。

ウェブスクレイピング - Wikipedia

噛み砕いて説明すると「Webサイトの情報(html)をプログラムで自動的に取得・加工する」ための技術と考えればよいと思います。Webサイトのクローラーが行なっている「クローリング」とも似ていますが、「クローリング」が情報を取得するだけなのに対し「スクレイピング」は取得したデータから必要なデータの抽出や加工などを行うことも含まれます。

しかし、Webスクレイピングやり方を間違えるとWebサイトへの攻撃行為として扱われることもあるため、スクレイピングを行う際は注意が必要です。

岡崎市立中央図書館事件 - Wikipedia

BeautifulSoupとは?

Pythonで使用できる有名なライブラリで、ドキュメント内のHTML構造を解析した上で、中の情報の取得や加工を行うことができます。

公式ドキュメントは英語となり、有志が日本語訳をしたページも存在しますが、やや情報が古いので、色々な使い方や困ったことがあればググって解決するのが早いです。(検索結果によっては、Python2の情報やBeautifulsoupの3以前の情報も混在しているので、間違えないよう気をつけましょう!)

kondou.com - Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)

なお、今回の動作環境は、このブログで過去に書いたPython3のインストール手順に基づき、Windows10(または7)のPython3環境で動かすことを想定して記載していきます。(Macでも同じ手順で行けたはずですが、一応記載。)

5log.hateblo.jp

次の項目から、実際にBeautifulSoupをインストールして、Webサイトの情報取得までを行いたいと思います。

1. BeautifulSoupをインストール

まずはBeautifulSoupをインストールし、使える状態にする必要があります。前回のPythonインストール同様、コマンドプロンプトを開いたら、下記のコマンドを入力します。

pip install beautifulsoup4

その後、ダウンロードの進捗が100%となり「Successfully installed beautifulsoup4〜」と表示されればインストール完了です。

2. BeautifulSoupを使って情報を取得する

いよいよ実行です。適当なWebサイトから情報をスクレイピングする、でも良いのですがそうした情報は巷に溢れているので、今回はお手軽に、Pythonの変数に格納したHTMLをスクレイピングし、タグ情報の取得・加工を行いたいと思います。

もし、今すぐWebサイトからのスクレイピングをしたいんです!という方は、下記の記事に移動してください。

5log.hateblo.jp

では、今回はこのようなコードを用意します。

from bs4 import BeautifulSoup

# HTMLをpythonの変数として格納
basehtml = '''
<h1>フルーツの一覧</h1>
<ul>
<li>りんご</li>
<li>みかん</li>
<li>バナナ</li>
</ul>
'''

# HTMLを「html.parser」を使って解析
soup = BeautifulSoup(basehtml,"html.parser")

# 解析したテキスト「soup」からH1タグ情報を見つける
title = soup.find("h1")

# H1情報を出力
print(title)

これを記述したファイルを作成後、「.py」の拡張子をつけて適当な場所に保存した後、コマンドプロンプトから先程保存したPythonファイル実行すると、このように出るかと思います。

<h1>フルーツの一覧</h1>

これで、HTMLからh1情報を抽出することに成功しました。

3. スクレイピングしたHTMLを加工する

冒頭でもお伝えしたように、BeautifulSoupでは取得した情報の加工まで行うことができます。試しに今回は、先程取得したH1タグを「H2要素に変更し、新しいclass属性の付与」を行いたいと思います。

先程のコードを下記のように書き直しました。

from bs4 import BeautifulSoup

basehtml = '''
<h1>フルーツの一覧</h1>
<ul>
<li>りんご</li>
<li>みかん</li>
<li>バナナ</li>
</ul>
'''

# HTMLテキストを「html.parser」を使って解析
soup = BeautifulSoup(basehtml,"html.parser")

# 解析したテキスト「soup」からH1タグ情報を見つける
title = soup.find("h1")
title.name = "h2" # タグをh2要素に変更
title["class"] = "fruit" # fruitという名前のclassを付与

# H1情報を出力
print(title)

この後、先程同様にコマンドプロンプトから実行すると、実行結果は下記のようになります。

<h2 class="fruit">フルーツの一覧</h2>

このように、タグの変更とclassの付与が完了しました。 ちなみに、解析・加工後のHTMLは上記のコードだと「soup」の中に格納されているので、もしprint(soup)と出力した際は下記のように加工後のHTMLが出力されます。

<h2 class="fruit">フルーツの一覧</h2>
<ul>
<li>りんご</li>
<li>みかん</li>
<li>バナナ</li>
</ul>

これで加工まで完了です。簡単ですね!
もし、BeautifulSoupで他にどのようなことができるか気になる方は、下記のブログが良い感じに情報がまとまっているので、ぜひ読んでみてください。

szarny.hatenablog.com

まとめ

PythonとBeautifulSoupを使ったスクレイピングはこのように簡単に出来てしまいます。これをマスターすればHTML加工の自動化や業務の効率化などに活用していくこともできるので、Web製作に関わる方は、ぜひ一度触ってみることをオススメします!