2022年7月19日 星期二

Python 學習筆記 : 同時追蹤比特幣與乙太幣行情

本篇是前兩篇追蹤兩大虛擬幣 : 比特幣與虛擬幣行情的綜合測試, 參考 :


主要修改部分是爬蟲函式名稱, 因為可通用所以改成 coingecko_crawler(), 其餘只是複製貼上, 完整程式碼如下 : 


測試 1 : 擷取 CoinGecko 網站資料繪製比特幣+乙太幣價格變化圖形 [看原始碼]

import requests
import pandas as pd
import matplotlib.pyplot as plt
from PIL import Image

def coingecko_crawler(url):
    res=requests.get(url)
    prices=res.json()['stats']
    df=pd.DataFrame(prices)
    df.columns=['datetime', 'TWD']
    df['datetime']=pd.to_datetime(df['datetime'], unit='ms')
    df['datetime'] += pd.DateOffset(hours=8)
    df.index=df['datetime']
    return df

def notify_image(msg, token, image):
    url='https://notify-api.line.me/api/notify'
    headers={'Authorization': 'Bearer ' + token}
    data={'message': msg}
    image=open(image, 'rb')
    imageFile={'imageFile': image}
    r=requests.post(url, headers=headers, data=data, files=imageFile)
    if r.status_code==requests.codes.ok:
        return '圖片發送成功!'
    else:
        return f'圖片發送失敗: {r.status_code}'

plt.rcParams["font.family"]=["Microsoft JhengHei"]
token='ud7PaDL45fz849A0e1f5oaMCbRIkxMXapQCt7PfNkzz'   
# 比特幣
url='https://www.coingecko.com/price_charts/1/twd/90_days.json'
btc=coingecko_crawler(url)
btc['100MA']=btc['TWD'].rolling(window=100).mean()
btc[['TWD', '100MA']].plot(kind='line')
last_time=str(btc.iloc[-1:].index.values[0])[0:19]
last_price=int(btc.iloc[-1:]["TWD"].values[0])
plt.title(f'比特幣 {last_time} 台幣 {last_price} 元')
plt.xlabel('')
plt.ylabel('價格(台幣)')
plt.grid(True)
plt.legend(['價格', '100小時均價'], loc='best') 
plt.savefig('btc_prices.jpg')
img=Image.open('btc_prices.jpg')       # 開啟檔案   
img=img.crop((18, 26, 590, 453))       # 裁切圖片去除外圍白邊  
img.save('btc_prices.jpg')                    # 回存檔案   
msg=f'\n比特幣 {last_time} 台幣 {last_price} 元'
notify_image(msg, token, 'btc_prices.jpg')

# 乙太幣
url='https://www.coingecko.com/price_charts/279/twd/90_days.json'
eth=coingecko_crawler(url)
eth['100MA']=eth['TWD'].rolling(window=100).mean()
eth[['TWD', '100MA']].plot(kind='line')
last_time=str(eth.iloc[-1:].index.values[0])[0:19]
last_price=int(eth.iloc[-1:]["TWD"].values[0])
plt.title(f'乙太幣 {last_time} 台幣 {last_price} 元')
plt.xlabel('')
plt.ylabel('價格(台幣)')
plt.grid(True)
plt.legend(['價格', '100小時均價'], loc='best') 
plt.savefig('eth_prices.jpg')
img=Image.open('eth_prices.jpg')       # 開啟檔案   
img=img.crop((0, 26, 590, 453))       # 裁切圖片去除外圍白邊  
img.save('eth_prices.jpg')             # 回存檔案   
msg=f'\n乙太幣 {last_time} 台幣 {last_price} 元'
notify_image(msg, token, 'eth_prices.jpg')
#plt.show()  # 測試時才使用

此處最後一列的 plt.show() 是測試時檢視用, 上線時要註解掉. 結果如下 : 




可見兩大虛擬幣走勢幾乎一樣. 

接下來是佈署到樹莓派, 但因為此程式在繪圖時用到微軟正黑體中文字型, 樹莓派沒有此字型, 故須下載字型後進型設定, 方法參考 :


用 WinSCP 將爬蟲程式傳送到樹莓派後用下列指令將其改為可執行 :

pi@raspberrypi:~ $ sudo chmod +x /home/pi/btc_eth_prices_line_notify.py

然後編輯 Crontab, 加入執行此程式的時間指令, 參考 :

 
pi@raspberrypi:~ $ crontab -e   
crontab: installing new crontab
pi@raspberrypi:~ $ crontab -l    
0 16 * * 1-5 /usr/bin/python3 /home/pi/twstock_dashboard_update.py
*/30 9-14 * * 1-5 /usr/bin/python3 /home/pi/yahoo_twstock_monitor.py
0 8,18 * * * /usr/bin/python3 /home/pi/btc_eth_prices_line_notify.py    

OK, 收工啦. 

沒有留言 :