close

還記得幾天前,我用心良苦,緩下腳步讓各位花點時間練一下基本功,
相關項目如下:
(1).【Day17】認識matplotlib套件可以產生的各種統計圖表
(2).【Day18】了解程式碼流程與互動
(3).【Day19】遇到程式結果不如預期如何debug的一些小技巧以及Python撰寫時與其他程式碼特別差異的縮排呈現方式。
其實過程中也讓各位咀嚼消化,
畢竟學習新的東西直接看結果雖然很過癮,
但遇到變化題很容易就掛了。

今天終於要讓大家看到辛苦幾天後的成果,
傳說中的股價數據視覺化的結果呈現如下:
https://ithelp.ithome.com.tw/upload/images/20221005/20141198MqD6o9fwJP.png

從上面可以看出橫軸(X軸)是股價日期,縱軸(Y軸)是股價,
而圖形我們選擇折線圖來呈現。

其實撰寫程式的過程中難免會遇到一些狀況,
因此我自己將相關資訊print出來以利debug,
這樣就可以見樹又見林,全面的看待整個設計規劃,
相關的資訊如下:

讀取: ['9914,20220926,20221001']
start =  2022-09-26 00:00:00
end =  2022-10-01 00:00:00
 ['20220926', '20220927', '20220928', '20220929', '20220930']
         日期  證券代號 證券名稱       成交股數   成交筆數  ...  最後揭示買價 最後揭示買量  最後揭示賣價 最後揭示賣量    本益比
0  20220926  9914  美利達  1,627,208  1,432  ...  179.50     17  180.00      3  11.25
1  20220927  9914  美利達    646,254    600  ...  184.00      5  184.50      1  11.57
2  20220928  9914  美利達    666,197    756  ...  180.50      1  181.50      4  11.38
3  20220929  9914  美利達    770,727    652  ...  183.50      9  184.00      4  11.50
4  20220930  9914  美利達    957,208    969  ...  179.50      1  180.50     16  11.32

緊接著要送給大家的就是相關的參數檔與程式碼,
不過,還是建議大家親自打過程式會對問題比較有印象,
否則只是淪於複製貼上的手工藝。

(一) 參數檔設定檔: stockInfo.txt
9914,20220926,20221001

(二) 股價爬蟲主程式檔: stock_main.py

import matplotlib.pyplot as plt
import data_m as m
from time import sleep
import pandas as pd

all = []

# 先取得條件參數(爬取的日期起迄)
stock_symbol, dates = m.getConfig()

print(dates)
for date in dates:
    # 預防遠端主機誤認為攻擊連線
    sleep(15)

    spyderData = m.spyderData(date, stock_symbol)
    all.append(spyderData[0])
    df_columns = spyderData[1]

    
all_df = pd.DataFrame(all, columns = df_columns)
print(all_df)



#第一步,準備資料
day = all_df["日期"].astype(str)
price = all_df["收盤價"].astype(float)
    
#第二步,新建plot物件
plt.figure(figsize=(20, 10), dpi=100)
    
#第三步,進行繪圖
plt.plot(day, price,  's-', color= 'r', label=" 收盤價")
    
plt.title("Chart")

# 第四步,顯示圖形 
plt.show()


import requests
from io import StringIO
import pandas as pd
import datetime


def getData():
    res = []
    f = open('stockInfo.txt')
    alist = f.readlines()
    print('讀取:',alist)
    a, b, c = alist[0].split(',')
    res = [a, b, c]
    
    return res

(三) 爬取股價資料的檔案: data_m.py

def getConfig():
    data = getData()
    dates = []
    
    startDate = datetime.datetime.strptime(data[1], '%Y%m%d')
    endDate = datetime.datetime.strptime(data[2], '%Y%m%d')
    print('start = ', startDate)
    print('end = ', endDate)
    # 算出起始到結束共幾天
    days = (endDate - startDate).days + 1

    # 建立一個list承接工作日的日期
    dates = [] 
    for dayNum in range(days):
        # 從起始日開始依次
        date = (startDate + datetime.timedelta(days=dayNum))

        #過濾掉週日
        if date.weekday() < 5:
            dates.append(date.strftime('%Y%m%d'))

    return data[0], dates
  

    
# 使用request套件爬取股價資訊
def spyderData(date, symbol):
    
    # 爬取股價資訊
    requestData = requests.get('https://www.twse.com.tw/exchangeReport/MI_INDEX?response=csv&date=' + date + '&type=ALL')
    
    txt = [i for i in requestData.text.split('\n') if len(i.split('",')) == 17 and i[0] != '=']
    
    df = pd.read_csv(StringIO("\n".join(txt)), header = 0)
    
    df = df.drop(columns = ['Unnamed: 16'])
    
    f_df = df[df["證券代號"] == symbol]
    
    f_df.insert(0, "日期", date)
    
    df_columns = f_df.columns
    
    return list(f_df.iloc[0]), df_columns

經歷過包含今天的20天,感覺如何,
是不是覺得Python很神,
既會畫畫還能變身成為爬蟲抓取小資族的零用金,
當然,這個程式只是讓各位先了解股價爬蟲的敲門磚,
未來在其他場合我還可以繼續為各位服務咱們再細細道來Python更進階的用法。

今天就先到這兒,明天我們繼續看下去Python還能派出什麼天兵天將下來?

arrow
arrow

    生活實踐家Adam 發表在 痞客邦 留言(6) 人氣()