こんにちは、Kosei(@kay_diacc2)です!
Webスクレイピングツールの全体像
Beautifulを用いたWebスクレイピング
Beautiful Soupとは、Webサイトを構築するHTMLやXMLを取得するためのモジュールを意味します。本記事で紹介するツールは、BeautifulSoupを用いたPythonプログラミングをもとに、ビットコイン最新トレンド情報を解析することを目的としています。
本記事は実践的な内容を取り扱っているため、Webスクレイピングの概要やBeautifulSoupの基礎を知りたい方は、下記の記事も伏せてご覧になられることを推奨します。
【Web情報解析の自動化】「Webスクレイピングとは」概要や法律課題まで徹底解説
Webサイト上のデータを収集し、企業のマーケティング活動等に活かせるスクレイピング技術。とても便利な反面、法律面での注意点がいくつかあります。本記事では、Webスクレイピングとは何か?ご紹介します。加えて、Webスクレイピングの利用用途及び法律やコンプライアンス面で注意すべき点について図解も交えて詳しくご紹介します。
【BeautifulSoup】Webスクレイピング入門|Pythonプログラミング
Webスクレイピングとは、プログラムを用いて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()
最後に

お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら