【Python】sqlite3を使ってスクレイピングしたデータをデータベース(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で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 pybitflyer
import sqlite3

for i in range(2):

   #データベースのパスを指定
     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()
   print(sql,'OK')
   time.sleep(3)

プログラミングの独学はとても難しい


プログラミングは小学校の義務教育にも導入され始めており、これから社会人として生きていく上でプログラミングはもはや出来て当たり前、出来なれば論外というエクセルレベルの必須スキルになりつつあります。そしてそういう話を聞いて参考書なりを購入して独学でプログラミング勉強しようと思っている人も少なくないでしょう。しかしプログラミングを独学で勉強し始めようと思うものの



・「分からない箇所で詰まって挫折してしまった」

・「勉強する時間が足りない」

・「ネットの記事だと情報が断片的でよくわからない」

・「コードのエラーの原因が分からない」



という壁にぶち当たって、プログラミングの勉強を止めてしまう方が少なくありません。独学でプログラミングを勉強してる時間のほとんどはつまづいている時間です。実際僕も最初のころ独学でプログラミングを勉強していた頃はエラーの原因が分からず丸1日を不意にしてしまった・・・そんな苦い経験がありました。



それで僕は一度はプログラミングの学習を諦めてしまいましたが、就活で現実を知る中で「プログラミングを勉強して、いずれフリーランスとして自由な生き方がしたい」「エンジニアとして若いうちから高収入を得たい」という気持ちから一念発起して「侍エンジニアのwebサービスコース」に申し込み、プロのエンジニアの方に対面でマンツーマンでPythonによるWebサービス作り方とWeb技術の基本を教えてもらい、ようやくプログラミングが理解でき、今ではエンジニアとしてそこそこの暮らしができるようになりました。





侍エンジニアでは、とりあえずプログラミングやインターネットの基本を知っておきたい人から、HTML・cssなどでWebサイトやWebアプリを作ってみたい人やPythonを勉強してデータサイエンティストやAIエンジニアになりたい人まで幅広いニーズに応えた様々なコースが用意されています。



IT業界と言ってもエンジニアの仕事はプログラミング言語次第でサーバーから機械学習・ディープラーニングまで多種多様ですし、侍エンジニアの無料レッスン(カウンセリング)を受けてみて、自分のやりたいITの仕事は何なのか?を見つけるのがエンジニアへの第一歩になります。ちなみに今侍エンジニアの無料レッスンを受けると1000円分のAmazonギフト券がもらえるので、試しに受けてみるだけもお得です。


自分は半端に独学やオンラインスクールで勉強して金と時間を無駄にするくらいなら、リアルのプログラミングスクールに通ってしっかりプログラミングを勉強した方がいいと思います。ちなみに今、侍エンジニアに申し込むと、25歳以下の学生の方であれば、受講料が20%OFFになるので超お得です。


そして、プログラミングは大勢で授業を受けたり漫然とオンライン学習をするよりも自分が分からない箇所をピンポイントでプロの講師に直接質問して、ちゃんと納得するというスタイルの方がお金は確かに少し掛かりますが、独学で学ぶよりも絶対にモノになります。


シェアする

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

フォローする