Python 爬蟲教學 : 以爬取比特幣價格並使用matplot製圖為例

stock market 2616931 1920 - Python 爬蟲教學 : 以爬取比特幣價格並使用matplot製圖為例

去年年底最熱門的搜尋關鍵字,是應用了區塊鏈技術的虛擬貨幣「比特幣」。2017年一年間,比特幣的價格曾由1,000美元漲至20,000美元,如今又回到了8,000美元左右的水平。這麼高的波動性對散戶而言,要怎麼決定入場的時機呢?雖然各大交易所乃至於許多網站都有提供現成的相關圖表,但能夠自己抓取想要的資訊、自行決定範圍並添加各類的輔助線也是這個時代裡很重要的能力之一。今天的主題便是:如何爬取比特幣的價格資訊,並以 python 的模組 matplot 來繪製成圖表。

Step0 待會需要用到的模組:

  1. pandas
  2. requests
  3. matplotlib

若還未安裝以上的模組,可藉由在終端機輸入:

pip install pandas
pip install requests
pip install matplotlib

來進行安裝。

Step1 鎖定用以抓取的網站:

本文以 Coinmarketcap 為例,先來到首頁,點擊 Bitcoin ,可看到相關的價格資訊及走勢圖。

Image 001 - Python 爬蟲教學 : 以爬取比特幣價格並使用matplot製圖為例

Image 002 - Python 爬蟲教學 : 以爬取比特幣價格並使用matplot製圖為例

以Chrome瀏覽器為例,按下F12叫出開發人員工具,切換到Network頁面,可以看到如下圖的畫面。

Image 003 - Python 爬蟲教學 : 以爬取比特幣價格並使用matplot製圖為例

此時重新整理該頁面,開發人員工具就會開始竊聽網頁上的行為,在XHR頁籤中找到了一筆 bitcoin/ 的紀錄,點它一下來看看裡頭的內容。

Image 004 - Python 爬蟲教學 : 以爬取比特幣價格並使用matplot製圖為例

Response 頁籤中,可以看到 market_cap_by_available_supply ,但裡頭未必包含我們想要的資訊,因此可以再點左邊的 Preview 來看看裡面大致包含了什麼東西。

Image 005 - Python 爬蟲教學 : 以爬取比特幣價格並使用matplot製圖為例

在Preview頁面可以看到它以json的格式儲存了四種資訊,分別是 market_cap_by_available_supply 、 price_btc 、 price_usd 及 volume_usd ,分別代表了比特幣在不同日期的市值、兌比特幣的比值、兌美金的比值及交易量。

Image 006 - Python 爬蟲教學 : 以爬取比特幣價格並使用matplot製圖為例

最後我們要知道這個Request的地址,切到header來,可以看到紅框處:

Image 007 - Python 爬蟲教學 : 以爬取比特幣價格並使用matplot製圖為例

這個地址就是待會我們會需要用到 requests 來送出請求的位址。

Step2 以Python爬取資訊:

現在終於可以回到Python來,要做的第一件事,就是 import 我們所需的三個模組:

import requests
import pandas
import matplotlib.pyplot as plt

接著我們就可以用 requests 這個模組所提供的 get 函數來取得剛剛我們找到的 response:

res = requests.get('https://graphs2.coinmarketcap.com/currencies/bitcoin/') #將取得的結果放入res中

requests模組甚至提供了json()函數,可將取得的結果直接轉為python的內建資料型態 dictionary。

d = res.json()

此時若印出 d 的內容,會得到以下結果:

Image 008 - Python 爬蟲教學 : 以爬取比特幣價格並使用matplot製圖為例

和我們剛剛在Chrome的開發者工具中看到的結果一致。不過我們可以發現每一個子 list 的第一筆資料,存放的應該是日期,在這裡卻因為 json 的格式而變得難以理解,幸好萬用的模組 pandas 有提供 to_datetime 的方法,因此我們可以先將剛剛的字典 d 轉為 pandas 的 DataFrame,並放入變數 df 中:

df = pandas.DataFrame(d)

此時若印出 df ,可看到如下的結果:

Image 009 - Python 爬蟲教學 : 以爬取比特幣價格並使用matplot製圖為例

此時 df 其實就已經代表了整個數據(雖然它並不會完整的印出來,但存取上是沒有問題的),1,727個 rows 表示有1,727筆資料,而4個 columns 則分別代表market_cap_by_available_supplyprice_btcprice_usdvolume_usd

假設我們只關心 price_usd ,也就是比特幣兌美元的價格,那麼在 pandas 的協助下可以很輕鬆的使用:

print(df['price_usd'])

來取得。

稍微整理一下,將 df 更新為只包含 price_usd 的部分,並用一個 for 迴圈來將日期轉換為我們看得懂的格式,將日期的部分存入 date 這個 list 中、價格存入 price 中,程式碼如下:

df = df['price_usd']
date=[]
price=[]
for i in df:
	i[0] = pandas.to_datetime(i[0],unit='ms')
	date.append(i[0])
	price.append(i[1])

做到這邊,資料的整理也差不多告一段落了,現在我們手上有著 1,726 筆包含了日期以及比特幣價格的資訊,可以開始對它做繪圖了。

Step3 以 Matplotlib 繪製價錢走勢圖:

有了剛剛的兩組串列,分別是日期及時間後,要使用 Matplot 繪製價格對時間的折線圖是非常容易的:

plt.plot(date,price)
plt.show()

得到的結果如圖:

Image 011 - Python 爬蟲教學 : 以爬取比特幣價格並使用matplot製圖為例

當然,你也可以為 x, y 軸取上相應的名字,並為圖表加上名稱:

plt.plot(date,price)
plt.xlabel('Date')
plt.ylabel('Price (USD)')
plt.title('Price of Bitcoin')
plt.show()

今天大概就先到這邊,下一次再來一起看看怎麼為圖表加上各式各樣的參考線吧!

後記:寫到一半才覺得對 pandas 還不夠熟悉,其實 pandas 產生的物件本身就可以使用 plot() 這個函數,不必再特別抓入 list 中,但圖片都截好了也就懶得再改…XD,而且使用 pandas 的 DataFrame 實在是太太太方便了,下一篇再打掉重來!!