【Python】BeautifulSoupを活用したHTML解析|ビットコイントレンドデータのWebスクレイピング

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

サマリー
  • Python・BeautifulSoupを用いたWebスクレイピングツールの構築事例を紹介します。
  • 実践的なWebスクレイピング手法が学習できます。本記事で紹介するHTML解析手法をマスターすることで多様なWeb調査に応用できます。
  • スクレイピングツールは既存の仮想通貨サイトを対象としており、最新ビットコインのトレンド解析を目的としています。
目次

【Python × Beautiful Soup】Webスクレイピングツール作成概要

PythonのBeautiful Soupというライブラリを活用してWebスクレイピングを実践する方法を解説します。本記事では実際のWebサイトからデータ抽出を試みるため、実践的ノウハウの習得が可能です。

Beautifulを用いたWebスクレイピング

Beautiful Soupとは、Webサイトを構築するHTMLやXMLを取得するためのモジュールを意味します。本記事で紹介するツールは、BeautifulSoupを用いたPythonプログラミングをもとに、ビットコイン最新トレンド情報を解析することを目的としています。

本記事は実践的な内容を取り扱っているため、Webスクレイピングの概要やBeautifulSoupの基礎を知りたい方は、下記の記事を併せてご覧下さい。

【参考】Beautiful Soup

【参考】Webスクレイピングを学ぶ

情報取得先のWebサイト

仮想通貨サイトはCOINTELEGRAPH(https://cointelegraph.com/)を対象として検討します。全世界の仮想通貨市場ニュースが配信されているサイトであり、トレンドを知る上で魅力的なサイトです。

Webスクレイピングツールの完成イメージ

上図のように、Pandas DataFrameを活用し、ビットコイントレンド情報(最新の記事タイトル、日付、概要、記事リンク)を表形式で出力します。取得できたデータはExcelファイル形式で保存します。

Webスクレイピングツール作成手順

プログラミング手順は、上図に従い進めます。詳しく解説すると以下です。

  1. PythonでBeautifulSoupのオブジェクト作成
  2. 前述のオブジェクトにWebサイトURLを渡し、HTML要素を全て抽出
  3. HTML要素の中から目的のHTML要素を見つける
  4. HTML要素に対して画像・テキスト・リンク取得メソッドを指定し、目的のデータを取得する
  5. 取得したデータはPandas DataFrameで整理
  6. 最終的に取得した結果をExcelファイルに保存

【Python実践】BeautifulSoupを活用したWebスクレイピング

それでは下記より実際のプログラミング作業に移っていきましょう!

BeautifulSoupオブジェクトを作成

HTML解析に用いるBeautifulSoupモジュールをインポートし、オブジェクトBs_Objを作成します。

from bs4 import BeautifulSoup
from urllib.request import urlopen
import pandas as pd
import pprint

#BeautifulSoupのオブジェクト
html = urlopen("https://cointelegraph.com/tags/bitcoin")
Bs_Obj = BeautifulSoup(html, "html.parser")

オブジェクトはBeautiful()関数にHTMLを渡すことで作成できます。Bs_Objの中身は一度出力してみましょう!対象サイトのHTML要素が全て抽出できているはずです。

取得したいHTML要素を見つける

続いて取得したいHTML要素を見つけるプロセスです。本記事では記事一覧データに紐づくHTML要素取得を試みます。

目的HTML要素取得の際は、find_all()メソッドに対して該当の属性情報を与えます。今回の場合、class属性の要素を指定し、次のようなコードを実行してみましょう。

news_items = Bs_Obj.find_all(class_="posts-listing__item")

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

前述で取得したHTML要素から目的のテキストデータを抽出します。

下記のコードを実行すると、Pandas DataFrameの形式でビットコインの記事タイトル・日付・概要・記事リンクがそれぞれ取得できます。

#データを保存するリスト
title_list     = []  # タイトル
date_list      = []  # 日付
summary_list   = []  # 記事概要
hyperlink_list = []  # ハイパーリンク


#HTML要素を取得
for i in range(len(news_items)):
    
    """
    *******************************************************************************
    ① テキストデータを取得 
    *******************************************************************************
    """
    #タイトル
    title = news_items[i].find(class_="post-card-inline__header").find("span",{"class":"post-card-inline__title"}).getText()
    #日付
    date = news_items[i].find(class_="post-card-inline__meta").find("time").getText().replace("minutes ago","分前").replace("hour ago","時間前").replace("hours ago","時間前")
    #概要取得
    summary = news_items[i].find("p",{"class":"post-card-inline__text"}).getText()
    #ハイパーリンク
    hyperlink = "https://cointelegraph.com/" + news_items[i].find(class_="post-card-inline__header").find("a").get("href")    
    
    """ 
    *******************************************************************************
    ②テキストデータをPython環境に一時保存 
    *******************************************************************************
    """
    title_list.append(title)
    date_list.append(date)
    summary_list.append(summary)
    hyperlink_list.append(hyperlink)
    
    
#Pandas DataFrameとして出力
df = pd.DataFrame({"タイトル":title_list,
                   "日付":date_list,
                   "概要":summary_list,
                   "URL":hyperlink_list,
                  })
#出力
print(df)

WebスクレイピングデータをExcelファイルに保存

前述で取得したデータは、Excel形式で保存します。下記のコードを実行しましょう。

ビットコイン最新トレンドを取得するためのWebスクレイピングツールが完成しました。お疲れ様です!

df.to_excel("最新ビットコイントレンド.xlsx",index=False)

【Python × BeautifulSoup】Webスクレイピングによるトレンド分析まとめ

最後に本日作成したWebスクレイピングツールの纏めとして、コードの全量を関数形式で記載します。

実際にプログラムを起動する際は、下記の関数を用いると良いでしょう。

from bs4 import BeautifulSoup
from urllib.request import urlopen
import pandas as pd

def get_bitcoin_news():
    
    #データを保存するリスト
    title_list = []
    date_list = []
    summary_list = []
    hyperlink_list = []

    """ 01 BeautifulSoupのオブジェクトを作成 """
    html = urlopen("https://cointelegraph.com/tags/bitcoin")
    Bs_Obj = BeautifulSoup(html, "html.parser")

    
    """ 02 取得したいHTML要素を見つける """
    news_items = Bs_Obj.find_all(class_="posts-listing__item")


    """ 03 HTML要素を取得する """
    for i in range(len(news_items)):

        #タイトル
        title = news_items[i].find(class_="post-card-inline__header").find("span",{"class":"post-card-inline__title"}).getText()
        #日付
        date = news_items[i].find(class_="post-card-inline__meta").find("time").getText().replace("minutes ago","分前").replace("hour ago","時間前").replace("hours ago","時間前")
        #概要取得
        summary = news_items[i].find("p",{"class":"post-card-inline__text"}).getText()
        #ハイパーリンク
        hyperlink = "https://cointelegraph.com/" + news_items[i].find(class_="post-card-inline__header").find("a").get("href")    

        #テキストデータを保存
        title_list.append(title)
        date_list.append(date)
        summary_list.append(summary)
        hyperlink_list.append(hyperlink)


    #Pandas DataFrameとして出力
    df = pd.DataFrame({"タイトル":title_list,
                       "日付":date_list,
                       "概要":summary_list,
                       "URL":hyperlink_list,})
    
    
    #Excelファイルを保存
    df.to_excel("最新ビットコインニュース.xlsx",index=False)
    
    #出力
    return df

上記関数は下記を記載することで実行できます。

get_bitcoin_news()

【参考】Pythonで面倒な作業を自動化!手法一挙公開中!

当サイトでは日々面倒な作業をPythonで自動化する方法を多数配信しております。日々の作業が飛躍的効率化できること間違いなしですので、以下気になった記事があれば併せてご覧ください。

【面倒なタスクをPythonで解決!】作業効率化の人気記事一覧




【参考】Pythonとは?・実現できること

最後に

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

本記事をシェア!
目次