Python初心者がDebankの情報を取得してみた

仮想通貨

暗号資産の取引計算は面倒

管理人は2021年に暗号資産の取引を始めました。2022年を迎えたので確定申告用に損益計算をする必要がありますが,暗号資産の取引計算はとても面倒です。特にDeFiなどは取引履歴のデータが非常に見にくいので,データを収集するところから結構大変です。

私は一定のスパンで取引履歴を集約/管理していたので,9割近く計算は終わってしまいましたが,年末は時間があったので「Python」を使って「Debank」という取引履歴を確認するサイトから自動で情報を収集するコードを書いてみることにしました。

大晦日に思い立ったかのように「Python」をインストールしました。学生時代に実験データの処理にたまにコードは書いていましたが,「Python」は全く触ったことがなく初心者です。

Python

Pythonってなに?

そもそも「Python」とはなに?と思う人も多いかもしれません。「Python」は1931年に登場したプログラミング言語で「読みやすい」「書きやすい」ことを思想に作られています。

身近なプログラムを例に挙げると,Excelのマクロ機能もプログラムの一種です。

何ができるの?

「データ処理/分析」、「Web上の情報収集」「ゲーム制作」などなど多岐にわたります。

身近な具体的な例を挙げてみると,クレジットカードや携帯の明細データを毎月会員サイトからダウンロードしていませんか?「Python」でコードを書けば自動で終わります。

参考サイト

今回,Pythonを勉強するにあたり,こちらのサイトが非常に参考になりました。Youtubeに動画もあるのでわかりやすいです。

キノブログ
プログラミング初心者・未経験者にもわかりやすく。Pythonなどのプログラミング学習やIT用語の解説、最新のITニュースなどの情報を発信。

作りたいモノがないと勉強する気にならないのがプログラムですが,作り始めると理解がかなり進みます。

Debank

暗号資産のウォレットアドレスから取引履歴を表示してくれるサイトです。履歴の一覧が非常に見やすいので管理に最適です。このサイトが取引履歴のCSVファイルを提供してくれれば最高ですが,現状その機能はありませんので,今回「Python」を使って情報収集することにしました。

DeBank | The Real User Based Web3 Community
The Real User Based Web3 Community

サンプルコード

色々なサイトを参考にしながら,とりあえず動くコードが完成しました。確実にもっとスマートな表記があるはずですが後々勉強したいと思います。完全に初心者コードです。

「Debank」から「取引情報」「取引種別」「取引量」「手数料」をCSVファイルとして保存します。

from selenium import webdriver
import time
import pprint
import numpy as np
import pandas as pd

#chromeヘッドレスモードで取引履歴にアクセス
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(executable_path = 'C:\\Users\\..............\\chromedriver.exe', chrome_options=chrome_options)
driver.get('https://debank.com/profile/............................/history')
time.sleep(10)

#タイムアウトするまでロードボタンを繰り返しクリック
while True:
    try:
        frm = driver.find_element_by_xpath('............................')
        time.sleep(5)
        frm.click()
    except:
        break

time.sleep(10)

#取引履歴情報を取得
his=driver.find_elements_by_class_name('.........................')

#関数定義
#Debank取文字列から以下の情報を行列で返す
#1:Txn日時
#2:Txn種別
#3:取引量
#4:取引シンボル
#5:ガス量
#6:ガスシンボル

def Debank_to_Matrix(data):
    Matrix=[]
    #取引履歴にガス代以外の暗号資産が含まれる場合
    if '+' in data or '-' in data:
        num_symbol=data.count('+')+data.count('-')
        num_gas_fee=data.count('Gas Fee')
        if data.count('+')!=0 and data.count('-')!=0:
            if data.index('+')>data.index('-'):
                num_index=data.index('-')
            else:
                num_index=data.index('+')
        elif data.count('+')==0:
            num_index=data.index('-')
        elif data.count('-')==0:
            num_index=data.index('+')

        amount=[]
        symbol=[]
        str_same_txn='same_txn'
        for i in range(num_symbol):
            if i==0:
                time=data[0]
                sts=data[2]
                if num_gas_fee>0:
                    gas_fee=data[-1].split()[0]
                    gas_fee_symbol=data[-1].split()[1]
                else:
                    gas_fee='NaN'
                    gas_fee_symbol='NaN'
            else:
                time=str_same_txn
                sts=str_same_txn
                if num_gas_fee>0:
                    gas_fee=str_same_txn
                    gas_fee_symbol=str_same_txn
                else:
                    gas_fee='NaN'
                    gas_fee_symbol='NaN'
            amount.append(data[num_index+(2*i)]+data[num_index+(2*i)+1].split()[0])
            symbol.append(data[num_index+1+(2*i)].split()[1])
            Matrix.append([time,sts,amount[i],symbol[i],gas_fee,gas_fee_symbol])
    #取引履歴にガス代以外の暗号資産が含まれない場合
    elif '+' not in data and '-' not in data:
        time=data[0]
        sts=data[2]
        amount='NaN'
        symbol='NaN'
        gas_fee=data[-1].split()[0]
        gas_fee_symbol=data[-1].split()[1]
        Matrix.append([time,sts,amount,symbol,gas_fee,gas_fee_symbol])
    return Matrix


for i in range(len(his)):
    if i==0:
        #引数定義
        str=his[i].text
        Debank_data=str.splitlines()

        #結果の出力
        #-----------------
        #元データ
        #出力データ
        print('---------------------------------------------------------------------------------------------------')
        print(Debank_data)
        pprint.pprint(Debank_to_Matrix(Debank_data))

        #初期マトリクスの定義
        Matrix_initial=np.array(Debank_to_Matrix(Debank_data))

    else:
        #引数定義
        str=his[i].text
        Debank_data=str.splitlines()

        #結果の出力
        #-----------------
        #元データ
        #出力データ
        print('---------------------------------------------------------------------------------------------------')
        print(Debank_data)
        pprint.pprint(Debank_to_Matrix(Debank_data))

        #マトリクスを結合
        Matrix_result=np.array(Debank_to_Matrix(Debank_data))
        Matrix_combine=np.append(Matrix_initial,Matrix_result,axis=0)
        Matrix_initial=Matrix_combine

#結合マトリクスの表示
pprint.pprint(Matrix_combine)
#データフレーム変換
df=pd.DataFrame(Matrix_combine)
#データフレーム表示
print(df)
#データフレームとしてCSV書き込み
df.to_csv('test.csv')

まとめ

「Python」で「Debank」の情報を収集してみました。Python初心者でしたが,わかりやすい解説サイトなどが多く参考になりました。プログラムの基礎的な知識があったのも大きかったです。今回は「Debank」というマニアックなサイトを対象にしたので,コードの中身については触れませんでしたが,一般的に使えそうなモノを作る時は,細かく解説したいと思います。

わざわざ情報収集のコードを書いていますが,肝心の暗号資産の利益は大したことありません。今年は頑張ります。

コードをみて,「ここはこう書ける」などなどスマートな表記方法があればコメントください。

 

コメント

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