こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!
- Webスクレイピングとは、プログラムを用いてWebからコンテンツデータを取得すること。
- 本記事ではBeautifulSoupを用いたスクレイピング手法について徹底解説。
【Python】Webスクレイピングとは
Webスクレイピング(Web Scraping)とは、WebサイトのHTMLからデータを抽出する技術を指します。この技術をもとに、Web上のテキストや画像データを抽出できます。Webスクレイピングのメリットは短時間で多量な情報収集ができる点です。
【参考】Webスクレイピングについて詳しく学ぶ
【Python】Webスクレイピング学習におすすめの入門本・動画教材8選|Webデータ収集・ブラウザ操作の自動化支援
「Webスクレイピングに興味がある!ビジネス現場で活用したい!」「BeautifulSoup、Request、Selenium等のPythonスクレイピングライブラリを使いこなせるようになりたい」このような要望にお応えします。
Pythonライブラリ|BeautifulSoupとは
Beautiful Soupとは、Webサイトを構築するHTMLやXMLを取得するためのモジュールです。
本記事ではBeautifulSoupを用いたPythonプログラミングをもとに、HTMLファイルをパース(構文解析)し、必要なデータを取得する方法を解説します。
【事前準備】BeautifulSoupをインストール
BeautifulSoupのモジュール名は、BeautifulSoupバージョン4になります。インストール未済の場合は、コマンドラインから下記を入力しインストールしましょう。
pip install beautifulsoup4
【Python】BeautifulSoupを用いたWebスクレイピング手順
- PythonでBeautifulSoupのオブジェクト作成
- HTML要素の中から目的のHTML要素を見つける
- HTML要素に対して画像・テキスト・リンク取得メソッドを指定し、目的のデータを取得する
- 取得したデータはPandas DataFrameで整理することが多い
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スクレイピングの概要をまとめていますので、是非ご覧ください。
【Web情報解析の自動化】「Webスクレイピングとは」概要や法律課題まで徹底解説
Webサイト上のデータを収集し、企業のマーケティング活動等に活かせるスクレイピング技術。とても便利な反面、法律面での注意点がいくつかあります。本記事では、Webスクレイピングとは何か?ご紹介します。加えて、Webスクレイピングの利用用途及び法律やコンプライアンス面で注意すべき点について図解も交えて詳しくご紹介します。
より実践的な内容として、実際のサイトを利用してWebスクレイピングを実行した事例も紹介しています。こちらも併せてご覧下さい。
【BeautifulSoup】Python・Webスクレイピング実践|ビットコイン最新トレンド解析
「Python・BeautifulSoupモジュールを用いたWebスクレイピングツールの構築事例」を紹介します。スクレイピングツールは既存の仮想通貨サイトを対象としており、最新ビットコインのトレンドを解析することを目的としています。本記事で紹介するHTML解析手法をマスターすることで多様なWeb調査に応用することもできます。
【参考】Pythonで面倒な作業を自動化!手法一挙公開中!
当サイトでは日々面倒な作業をPythonで自動化する方法を多数配信しております。日々の作業が飛躍的効率化できること間違いなしですので、以下気になった記事があれば併せてご覧ください。
【面倒なタスクをPythonで解決!】作業効率化の人気記事一覧
【参考】Pythonとは?・実現できること
最後に
お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら