【Python】スクレイピングした価格データをデータベース(DB)に保存する

この記事は約9分で読めます。

 

 

 

 

 

 

今回はpythonを使ってビットコインを始めとする仮想通貨の価格データを取得し、sqlite3を使ってデータベースに保存するという流れを行っていきたいと思います。

 

 

 

ビットコインの価格を取得する

 

ビットコイン・アルトコインの価格を取得する方法はいくつかありますが、今回はビットフライヤーのビットコインの価格をAPIを通じて取得し、データベースに保存していきたいと思います。

 

 

#ライブラリのインポート

import requests
import json
import time
import pybitflyer
import sqlite3


#ビットフライヤーのビットコインの価格を取得する

url=('https://api.bitflyer.com/v1/ticker')
r=requests.get(url)
r=json.loads(r.text)
date=r['timestamp']
price=r['ltp']
 

 

ビットフライヤーのAPIでtickerをリクレストすると以下のようなjsonのレスポンスが返ってきます。

 

{‘best_ask’: 749597.0,
‘best_ask_size’: 0.63189306,
‘best_bid’: 749290.0,
‘best_bid_size’: 0.09,
‘ltp’: 749597.0,
‘product_code’: ‘BTC_JPY’,
‘tick_id’: 3715090,
‘timestamp’: ‘2018-10-02T06:01:18.703’,
‘total_ask_depth’: 1742.89523228,
‘total_bid_depth’: 2201.43568615,
‘volume’: 267260.85066754,
‘volume_by_product’: 5147.30354399}

 

 

timestampは時間、ltpは最終取引価格を表示しているのでそこを抽出します。タイムスタンプをdatetime型のデータに変換する方法は↓の記事で解説しています。

 

 

 

 

 

 

データベースを作成する&環境設定

 

SpyderやJupyterNotebookからsqlite3でSQLを操作しようとすると「unable to open database file sqlite」などなど意味不明なエラーが出たり、見た目上はちゃんと実行されているのに、処理が反映されていないなど魔境なので、pyファイルに書き込んでアナコンダプロンプトから実行する方法を取っています。この記事のコードの実行環境については↓の記事に書いています。

 

 

 

 

 

 

<sample.pyの中身(省略①)>

#データベースの作成とパスを通す
dbpath = 'pricedata.db' 
c = sqlite3.connect(dbpath) 
cur = c.cursor()

 

 

2行目のcはconectionのcです。人によってはconnectionとしている人もいます。cの方が後々コードの文字数が減ります。次は接続したデータベースの中に新規テーブルを作ります。

 

前回は仮想通貨の種類を識別するidデータベースを作りましたが、今回はpricedata_tableという価格データ専用のテーブルを作ります。コードの実行はsample.pyの中身を書き換えて、アナコンダプロンプトからpython sample.pyで実行しています。

 

※「[Errno 2] No such file or directory」と表示される人はコマンドプロンプトのパスが間違っているので、cdコマンドでsample.dbとsample.pyがあるフォルダにディレクトリを移動させましょう。

 

 

<この時のsample.pyの中身>

#データベースの作成とパスを通す 
dbpath = 'pricedata.db' 
c = sqlite3.connect(dbpath) 
cur = c.cursor()
# 新規テーブルの作成 
sql="create table crypto_master(id integer primarykey auto_increment , name text)";
cur.execute(sql)

 

 

テーブルの中身は無難にIDとNameにします。IDは数字型で同じものがあったら困るのでintegerとprimarykeyを指定しておきます。データ型とプライマリーキーの話はsqliteではなくSQLの仕様の話です。

 

ここで取得するデータの種類ごとにIDで紐づけしていきます。今回はとりあえずビットコインの価格を取得するので、ID 1 Name Bitcoinみたいなデータをまず登録しておきます。

 

 

<sample.pyの中身>

(省略①)

#テーブルにデータを追加する
sql="insert into crypto_master(id,name) values(1,'bitcoin');"
cur.execute(sql)

 

 

<sample.pyの中身>

(省略①)

#SELECT文でデータが追加されたか確認する
sql="select * from crypto_master";
i=cur.execute(sql)
for i in cur:
   print(i[0], i[1])

 

結果

1|bitcoin

 

 

取得した価格データをデータベースに格納する

 

次はdate・priceという変数に格納した日次と価格データをsqlite3を通して、データベースに保存していきたいと思います。

 

 

#価格データ用のテーブルを新規作成する
sql="create table price_data(id integer , date date ,price integer);"
cur.execute(sql)

 

 

#データを追加する
sql="insert into price_data(date, id,price) VALUES ( '1','9-24','750000');"
cur.execute(sql)

#データがちゃんと追加されたか確認する
sql="select * from price_data;"
cur.execute(sql)
i=cur.execute(sql) 
for i in cur: 
    print(i[0], i[1] ,i[2])

 

 

1|9-24|750000みたいなデータが返ってきていれば成功です。次はこの’1’,’9-24′,’750000’の部分を変数に置き換えます。

 

なので流れとしては、APIを通じて取得したデータを変数に格納し、それをデータベースに保存するという流れになります。

 

 

#tickデータを取得してデータベースに加える
sql="insert into price_data(date, id,price) VALUES ( ' +"'"+str(date)+"'"+(',')+"'"+str(id)+"'"+(',')+"'"+str(price)+"'"+')";
cur.execute(sql)
#データベースとの接続を終了する
conn.commit()
conn.close()

 

 

この一連の流れをまとめると以下のようなコードになります。

 

 

#ライブラリのインストール

import requests
import json
import time
import sqlite3

while True:

   #データベースのパスを指定
     dbpath = 'pricedata.db'

     #データベースに接続する
     c = sqlite3.connect(dbpath)
     cur = c.cursor()
   
   #ビットコインのid
     id=1
   
   #価格データを取得
     url=('https://api.bitflyer.com/v1/ticker')
     r=requests.get(url)
     r=json.loads(r.text)
     price=r['ltp']

     #当日の日付を取得する
     date=datetime.date.today()

   #文字列の作成
   exe="'"+str(date)+"'"+(",")+"'"+str(id)+"'"+(",")+"'"+str(price)+"'"
   sql="insert into price_data(date,id,price) VALUES ("+exe+");"
   #sqlに書いた処理を実行する
   cur.execute(sql)

   # 保存する(忘れると保存されないので注意)
   c.commit()

   #データベースとの接続を終了する
   c.close()
      
     # デバック&60秒待機
   print(sql,'OK')
   time.sleep(60)

 

1分ごとに価格を取得するという意味合いで、time.sleep(60)としています。

 

 

改良版はgithubに置いていますので、気になる方はどうぞ。

beginerSE/Bitcoin_price_scraping
ビットコインの価格データをスクレイピング&整形するスクリプト. Contribute to beginerSE/Bitcoin_price_scraping development by creating an account on GitHub.

 

 

コメント

タイトルとURLをコピーしました