こんにちは。sinyです。
最近、Pythonでスクレイピングの勉強を始めたのですが、思った以上にいろんなことが簡単にできることがわかり、ワクワクしています 😛
スクレイピング自体はまだまだ入門者ですが、実際に作ってみた仮想通貨レートをスクレイピングする事例を紹介したいと思います。
仮想通貨の価格情報を取得する。
Pythonでスクレイピングをする場合いろんなやり方があるようですが、今回はBeautifulSoupというライブラリーを使った方法を試してみました。
BeautifulSoupを利用するには、まずpipコマンドでライブラリーのインストールを行います。
pip install beautifulsoup4
プログラム内でbeautifulsoupを利用するには、urllibのrequestとbeautifulsoupをインポートします。
#ライブラリーの読み込み
import urllib.request as req
from bs4 import BeautifulSoup
事前準備は以上で終わりです!
今回は、bitFlyerのサイトからBTC/JPYの仮想通貨価格をスクレイピングしてみます。
上記リンク先のbitFlyerのTOP画面でずっと下のほうにスクロールすると以下のような画面があります。
今回は、下図の赤枠のBTC/JPY価格をスクレイピングしてみます。
pythonで上記サイトの仮想通貨価格を取得するまでのコードはたったの4行です。
#urlの設定
url = "https://bitflyer.com/ja-jp/"
# url のopen
res = req.urlopen(url)
# HTMLを解析する --- (※1)
soup = BeautifulSoup(res, 'html.parser')
#対象情報(BTC/JPYの価格)を取得
price = soup.find(id="bfPriceMid").string
①url変数で指定したURLをurlopenメソッドでオープンします。
②BeautifulSoupのhtmlパーサー(html.parser)を使ってオープンしたURL情報を解析します。
③今回、取得したいBTC/JPYの価格情報は、以下のようなid要素(bfPriceMid)で特定できるため、Beautifulsoupのfindメソッドを使って情報を取得します。
「.string」を付加することで該当要素のテキスト情報部分(仮想通貨価格)を取得できます。
さて、実際にプログラムを実行してみると、以下のようにBTC/JPYの価格情報「392,526」が取得できることが確認できると思います。
url = "https://bitflyer.com/ja-jp/"
res = req.urlopen(url)
soup = BeautifulSoup(res, 'html.parser')
price = soup.find(id="bfPriceMid").string
print(price)
392,526
ちなみに、スクレイピングした仮想通貨価格を、matplotlibを使ってリアルタイム表示させるとこんな感じになります。
価格変動を自動検知してライン通知。
さて、スクレイピングで仮想通貨の価格情報が簡単に取得できることがわかりましたが、
ということで、スクレイピングで取得した仮想通貨価格の変動幅を自動計算して、一定以上の変動があった場合にライン通知する機能(異常検知)を追加してみました。
異常検知として価格変動を計算するロジックはいろいろあると思います(機械学習、AIなど)が、今回は単純に一定以上の価格変動(例えば200円以上変動があった)があった場合に、ラインに通知するという感じで実装してみました。
※実際にLINEに通知されたときのメッセージはこんな感じ
ライン通知の機能自体は、LineのNotifyとPythonコードを使って簡単に実装できます。
具体的な実装方法は以下の記事で紹介していますので、チェックしてみてください。
参考書籍
現在、以下の書籍を使ってスクレイピングの勉強をしています。
まだ読み始めたばかりですが、具体事例を交えながらわかりやすく説明されているのと、スクレイピングだけではなく、データの前処理や機械学習、ディープラーニングへの具体的な活用事例も載っているので結構お勧めです。
以前からこの機能欲しいと思っていたので、今回作った機能をちょっとアレンジしてHEROKU等のサーバで自動スケジュールさせて自動通知させるプログラムを自動実行させようと思っています。
興味があれば、皆さんもチャレンジしてみてください。