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

スポンサーリンク

今回は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でtickをリクレストすると以下のような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は最終取引価格を表示しているのでそこを抽出します。詳しい話は↓の記事で解説しています。

データベースを作成する

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

2行目のcはconectionのcです。人によってはconnectionとしている人もいます。cの方が後々コードの文字数が減ります。

次は接続したデータベースの中に新規テーブルを作ります。今回はcrypto_masterというテーブルを作ります。テーブルとdbファイルは別物で、sample.sqliteというデータベースファイルの中にcrypto_masterというデータテーブルを作るというイメージです。

# テーブルの作成 
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みたいなデータをまず登録しておきます。

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

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

結果

1|bitcoin

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

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

#価格テーブルの作成
sqlite> create table price_data(id integer primarykey auto_increment , date text ,price integer);
cur.execute(sql)

#データを追加する
insert into price_data(date, id,price) VALUES ( '9-24','1','750000');
cur.execute(sql)
#データがちゃんと追加されたか確認する
sqlite> select * from price_data;
cur.execute(sql)

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 pybitflyer
import sqlite3

dbpath = 'sample.sqlite'
c = sqlite3.connect(dbpath)
cur = c.cursor()
id=1

 

for i in range(2):

url=('https://api.bitflyer.com/v1/ticker')
r=requests.get(url)
r=json.loads(r.text)
date=r['timestamp']
price=r['ltp']
sql = 'insert into price_data(date, id,price) VALUES ( ' +"'"+str(id)+"'"+(',')+"'"+str(date)+"'"+(',')+"'"+str(price)+"'"+')';
cur.execute(sql)
print(date,price,'OK')
time.sleep(10)

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする