【Python】Webスクレイピングとは・BeautifulSoupコードの使い方解説|HTML解析入門

こんにちは、Kosei(@kay_diacc2)です!

Webスクレイピングとは、プログラムを用いてWebからコンテンツを取得・処理することを指します。一方で「スクレイピングツールはどのようにプログラミングされるのでしょうか?」本記事ではこの疑問に回答します。世の中にある多様なスクレイピング技法の中でもBeautifulSoupを用いた方法に絞り、徹底解説します。

目次

Webスクレイピングとは

Webスクレイピング(Web Scraping)とは、WebサイトのHTMLからデータを抽出する技術を指します。この技術をもとに、Web上のテキストや画像データを抽出できます。Webスクレイピングのメリットは短時間で多量な情報収集ができる点です。

BeautifulSoupとは

Beautiful Soupとは、Webサイトを構築するHTMLやXMLを取得するためのモジュールです。

本記事ではBeautifulSoupを用いたPythonプログラミングをもとに、HTMLファイルをパース(構文解析)し、必要なデータを取得する方法を解説します。

BeautifulSoupのモジュール名は、BeautifulSoupバージョン4になります。インストール未済の場合は、コマンドラインから下記のように入力しインストールしましょう。

pip install beautifulsoup4

BeautifulSoupを用いたWebスクレイピング手順

Webスクレイピングの実行手順を上図に示します。これはBeautifulSoupのみならず、Webスクレイピング全般として当てはまるプロセスと言えます。

プロセスは非常にシンプルですね!プログラム実行環境を開き、まず、①HTML解析するためのオブジェクトを生成します。続いて、②取得したいHTML要素を見つけ出し、③見つけたHTML要素からデータを抽出するという3ステップです。

find()メソッドを用いたHTML要素の見つけ方

プログラミングする前に、各ステップで用いるメソッドについて理解しましょう。

対象のHTML要素を見つけるためには、find()メソッドまたはselect()メソッドが頻繁に用いられます。(今回はfind()メソッドを例に紹介)

find()メソッドは「指定したHTML要素の先頭要素のみ渡すfind()メソッド」と「指定したHTML要素をリストで全て渡すfind_all()メソッド」の2つがあります。以下それぞれの違いについて解説します。

find()メソッドとfind_all()メソッドの違い

メソッド 概要 引数部分の記述方法
find_all() 指定した全要素をリストで渡す find_all(“要素名”, {“属性”:”キーワード”})
find() 指定した要素の先頭要素のみ渡す find(“要素名”, {“属性”:”キーワード”})

findメソッドを用いた記述例

Find()メソッドに渡す要素 マッチする対象要素
Bs_Obj.find_all(“div”) 全てのdiv要素
Bs_Obj.find(“div”) 先頭のdiv要素
Bs_Obj.find(id=”XXXX”) id属性がXXXXである要素
Bs_Obj.find_all(class_=”XXXX”) class属性がXXXXである全要素
Bs_Obj.find(class_=”XXXX”) class属性がXXXXである先頭要素
Bs_Obj.find_all(“table”,{“class”:”XXXX”}) class属性がXXXXである全table要素
Bs_Obj.find_all(“input”,{“type”:”button”}) type属性がbuttonである全input要素

※Bs_Obj: BeautifulSoupのオブジェクト

HTML要素からデータを取得する方法

続いて、HTML要素からデータ取得する方法を解説します。

getText()・find()メソッドでテキストデータ取得

各メソッドを用い、下記pタグ要素内のテキストデータを取得する場合を解説します。各メソッドの違いを理解しましょう。

<p>他のブログは<a href="https://di-acc2.com">こちら</a></p>
メソッド HTML要素からテキスト取得方法 出力結果
find(text=True) .find(“p”).find(text=True) “他のブログは”
find_all(text=True) .find(“p”).find_all(text=True) [“他のブログは”,”こちら”]
getText() .find(“p”).getText() “他のブログはこちら”
  • find(text=True):指定した要素(pタグ)から次の要素(aタグ)までに存在するテキストデータを取得
  • find_all(text=True):指定した要素(pタグ)のテキストデータを全て取得。ただし、途中で異なる要素(aタグ)がある場合、リストに分けて出力
  • getText():指定した要素(pタグ)のテキストデータを全て取得

get()メソッドでハイパーリンク取得

ハイパーリンクを取得する場合、get()メソッドを用います。

メソッド 使用例 概要
get() .get(“href”) ハイパーリンク取得
get() .get(“src”) (主に画像の)リンク取得

BeautifulSoupを用いたPythonプログラミング(事前準備)

ここから具体的なプログラミング方法の解説です。まず、モジュール読込等の事前準備を行います。

モジュール読込

HTML解析に用いるBeautifulSoupモジュールをインポートします。

from bs4 import BeautifulSoup

スクレイピング対象のHTMLの読込

今回のHTML解析では下記のHTML要素をそれぞれ指定し、データ取得を行います。事前にHTMLを読み込んでおきましょう!

html = """
<h2 class="title"> BeautifulSoupを用いたWebスクレイピング学習基礎</h2>
<p>以下のようなことが学習できます。</p>
<ol>
  <li class="list">Webスクレイピングの基礎</li>
  <li class="list">BeautifulSoupの活用方法</li>
</ol>
<p>他のブログは<a href="https://di-acc2.com">こちら</a></p>
"""

BeautifulSoupを用いたPythonプログラミング

上記で解説したWebスクレイピングの手順に従い、プログラミングを実施します。

BeautifulSoupのオブジェクトを作成

BeautifulSoup()関数にhtmlを渡したオブジェクトを作成します。

Bs_Obj = BeautifulSoup(html, "html.parser")

オブジェクト(Bs_Obj)を実行すると、取得したHTML要素が全て返ってきます。

# 取得結果
# <h2 class="title"> BeautifulSoupを用いたWebスクレイピング学習基礎</h2>
#   <p>以下のようなことが学習できます。</p>
# <ol>
#   <li class="list">Webスクレイピングの基礎</li>
#   <li class="list">BeautifulSoupの活用方法</li>
# </ol>
#   <p>他のブログは<a href="https://di-acc2.com">こちら</a></p>

HTML要素を見つける

BeautifulSoupオブジェクトに対してfind()メソッドを用い、HTML要素を取得します。以下具体例と出力結果を示します。

先頭のpタグ要素を取得

list_element = Bs_Obj.find("p")
# 取得結果
# <p>以下のようなことが学習できます。</p>

タグ要素をリスト形式で全て取得

list_element = Bs_Obj.find_all("p")
# 取得結果
# [<p>以下のようなことが学習できます。</p>, <p>他のブログは<a href="https://di-acc2.com">こちら</a></p>]

class属性が”title”の要素を取得

class_element = Bs_Obj.find_all(class_="title")
# 取得結果
# [<h2 class="title"> BeautifulSoupを用いたWebスクレイピング学習基礎</h2>]

HTML要素からデータを取得する

取得したHTML要素からテキストデータを取得します。以下具体例と出力結果です。

先頭のpタグ要素からテキストを取得

text = Bs_Obj.find("p").find(text=True)


# 取得結果
# '以下のようなことが学習できます。'

最下部のpタグ要素からテキストを取得

text = Bs_Obj.find_all("p")[-1].getText()


# 取得結果
# '他のブログはこちら'

最下部のpタグ要素テキストを取得(別要素に囲まれたテキストはリストに分けて出力)

text = Bs_Obj.find_all("p")[-1].find_all(text=True)


# 取得結果
# ['他のブログは', 'こちら']

aタグ要素のhref属性を指定し、ハイパーリンクを取得

hyperlink = Bs_Obj.find("a").get("href")


# 取得結果
# 'https://di-acc2.com'

まとめ

Webスクレイピングはインターネット上のデータを利活用してマーケティング等の多様な分野に応用できる点で優れています。一方で、Webスクレイピング実施時は、法律や規約などいくつか準拠すべき事項があります。このような事項は必ず理解したのち、Webスクレイピングを実施するようにしましょう。下記のリンクにWebスクレイピングの概要をまとめていますので、是非ご覧ください。

より実践的な内容として、実際のサイトを利用してWebスクレイピングを実行した事例も紹介しています。こちらも伏せてご覧いただけると幸いです。

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
URLをコピーする
URLをコピーしました!
目次
閉じる