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

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

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

目次

Webスクレイピングツールの全体像

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

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

本記事は実践的な内容を取り扱っているため、Webスクレイピングの概要やBeautifulSoupの基礎を知りたい方は、下記の記事も伏せてご覧になられることを推奨します。

情報取得先のWebサイト

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

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

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

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

プログラミング手順は、上図に従い進めます。それでは下記より実際のプログラミングに移っていきましょう!

BeautifulSoupのオブジェクトを作成

まず、HTML解析に用いるBeautifulSoupモジュールをインポートし、オブジェクト(Bs_Obj)を作成します。下記のようにコーディングしましょう。オブジェクトはBeautiful()関数にHTMLを渡すことで作成が可能です。

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")

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

続いて取得したいHTML要素を見つけるプロセスです。上図に示す通り、本記事では記事一覧データに紐づくHTML要素を取得します。下記のように記載しましょう。

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

上記はfind_all()メソッドを用いており、指定のキーワードから成るclass属性の要素を全て取得するを意味します。

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

最後に上記で取得したHTML要素からテキストデータを取得します。下記のように記載し、実行してみましょう。

#データを保存するリスト
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")    
    
    """ テキストデータを保存 """
    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,})
#出力
df

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

取得したデータはExcel形式で保存できるようにしましょう。下記のようにコードを記載します。

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

ビットコイン最新トレンドを取得するための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()

最後に

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

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