PythonのBeautifulSoup4ライブラリを使うと簡単にウェブサイトのスクレイピング(HTMLデータを取得して必要な文字や値を抜き出すこと)が出来ます。
ビットコイン相場が気になる昨今(でもないか?)ですので、今回は、bitFlyer(日本のビットコイン販売業者大手)のサイトにあるビットコイン相場の価格を取得してしゃべらせることをやってみます。
2019年12月16日現在、bitflyerのサイトからは、ビットコイン価格は表示されてはいますが、HTMLコードで取得できなくなっています。この記事で紹介したPythonコードは動作しなくなったため、プログラムは以下の「Python:coinbase.comのサイトのビットコイン価格をチェックする」の記事を参考にしてください。ただスクレイピングの仕方やAquestalkPiによるラズパイにしゃべらせるプログラムについての解説は本記事の方が詳しく書いているので参考になさってください。
beautifulsoup4のインストール
スクレイピングには、Pythonのライブラリbeautifulsoup4を使います。
pipでインストールできます。
pip install beautifulsoup4
または、
pip3 install beautifulsoup4
bitFlyerサイトのHTMLソースコードをみて見る
ChromeやFirefoxなら
Ctrlキー + U
でそのサイトのソースコード(HTML部分)を表示できます。
Pythonのbeautifulsorup4を使うと、このHTMLソースコードの中から必要な情報を簡単に取得できます。
まずはbitFlyerのサイトに移動します。
bitFlyerのサイトでは、ビットコイン購入とビットコイン売却の2種類の相場がリアルタイムで表示されています。
今回は、右側に表示されているビットコイン売却の方の価格を取得してみます。
スクレイピングしたい情報は、マウスで選択後に「選択した部分のソースを表示」(Firefoxの場合)、「検証」(Chromeの場合)などとして一部分だけ表示できる機能を使って確認します。
以下画面はFirefox
実際にbitFlyerのビットコイン売却価格部分を選択し右クリックして表示したソースコード
id=”bfPriceBid_1″の部分に注目します。
これをみるとビットコイン売却の価格はidの設定で「bfPriceBid_1」となっていることが分かります。
HTMLをご存知の方は分かると思いますが、idはそのサイトで1か所しか設定が出来ないため、場所の特定が出来ます。
今回は、bitFlyerのサイトのidが「bfPriceBid_1」の部分の文字列を取り出せば、ビットコイン売却の相場が取得できることになります。
Pythonからそのサイトにブラウザと偽ってアクセスする
Pythonとbeautifulsoup4で検索すれば、スクレイピングの方法はたくさん解説されていると思いますが、今回は普通にスクレイピングが出来ませんでした。
ウェブサイトによってはブラウザ以外からのアクセスを禁じているサイトもあるからです。
Pythonを使ってそのサイトにアクセスするとブラウザではないため、はじかれてしまう可能性がある、ということです。
そのためブラウザと偽ってアクセスすることにします。(偽装ですねw)
通常は、Pythonならurllib.request.urlopenを使って以下のようにサイトからHTMLデータを取り出すことが出来ます。
url = "https://twitter.com/realdonaldtrump" response = urllib.request.urlopen(url)
今回は、ブラウザだと偽ってアクセスするため以下のようにします。
# ブラウザからのアクセスに偽装するためユーザエージェントを偽装 # 以下のエージェント文字例はMac bookでChromeブラウザを使った例 headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36)" } # HTMLデータを取得する req = urllib.request.Request(url, None, headers) response = urllib.request.urlopen(req)
headersの部分の文字列がユーザエージェントと言われる情報です。(やたら長い文字列ですが、たまたま自分の使っているMacBookのChromeで調べたらこんなに長くなってしまいました。実際はほかのユーザエージェント名でもOKです)
ビットコイン価格を画面に表示してみる
とりあえず、しゃべらせる前にビットコイン価格を画面に表示させてみます。
checkBTC.py
# -*- coding: utf-8 -*- ''' bitFlyerのサイトのビットコイン価格をチェックして表示する ''' import urllib.request from bs4 import BeautifulSoup # bitFlyerのサイトURL url = "https://bitflyer.com/ja-jp/" # ブラウザからのアクセスに偽装するためユーザエージェントを偽装 # 以下のエージェント文字例はMac bookでChromeブラウザを使った例 headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36)" } # HTMLデータを取得する req = urllib.request.Request(url, None, headers) response = urllib.request.urlopen(req) html=response.read().decode('utf-8') # HTMLをBeautifulSoupに渡して解析 soup = BeautifulSoup(html, 'html.parser') # ビットコイン価格部分のタグから文字列を取得 btc = soup.find(id="bfPriceBid_1").string # 文字列を整形(411,345 --> 4113451) btc = btc.replace(",", "") talk_string = "現在のビットコイン価格は、" + btc + "円です" # 画面に表示 print(talk_string)
実行イメージ
現在のビットコイン価格は、413422円です
後でしゃべらせる時のことも考慮して、ビットコイン価格の「,」(カンマ)はreplace命令で削除して金額だけの文字列にしています。
AquesTalkを使ってビットコイン相場をしゃべらせてみる
ラズパイならテキストから音声合成をしてくれる無料で利用可能なAquesTalk Piというプログラムがあります。
AquesTalk Piを利用するには、以下の記事のラズパイに天気をしゃべらせるの項目を参考にインストール&設定してください。
基本的に先ほどのビットコイン相場を表示するプログラムと同じですが、AquesTalk Piへのパス設定などがありますので、AquesTalk Piをインストールしたフォルダ名に変更して利用してください。
talkBTC.py
# -*- coding: utf-8 -*- ''' bitFlyerのサイトのビットコイン価格をチェックしてしゃべる ''' import urllib.request from bs4 import BeautifulSoup import sys, os # AquesTalkの実行パス aq_pass = "sudo /home/pi2/aquestalkpi/AquesTalkPi " # bitFlyerのサイトURL url = "https://bitflyer.com/ja-jp/" # ブラウザからのアクセスに偽装するためユーザエージェントを偽装 # 以下のエージェント文字例はMac bookでChromeブラウザを使った例 headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36)" } # HTMLデータを取得する req = urllib.request.Request(url, None, headers) response = urllib.request.urlopen(req) html=response.read().decode('utf-8') # HTMLをBeautifulSoupに渡して解析 soup = BeautifulSoup(html, 'html.parser') # ビットコイン価格部分のタグから文字列を取得 btc = soup.find(id="bfPriceBid_1").string # 文字列を整形(411,345 --> 4113451) btc = btc.replace(",", "") # しゃべるための文字列に変える talk_string = "現在のビットコイン価格は、" + btc + "円です" # 画面に表示 print(talk_string) # しゃべる cmd = aq_pass + talk_string + " | aplay" result = os.popen(cmd).readline().strip()
うまくしゃべりましたか?
以上、ラズパイ:Pythonでビットコイン相場をしゃべらせるでした。
コメント