跳至主要內容
FinLab

Python 上櫃資料爬蟲教學:輕鬆抓取上櫃股票收盤價

謝謝各位的支持,有很多人寄信來問各式各樣不同的研究! 但因為討論熱烈,我目前先挑比較簡單的做,其它的在清單中,依序補上~ 最近發現上櫃的股票也滿多人在看的,今天教大家如何用 python 抓取上櫃公司的收盤價!

python 上櫃資料爬蟲教學縮圖

首先,我們只要從這個網址,把資料 get 下來就行了!

爬取上櫃股價網址

顯示程式碼
import requests
 
link = 'http://www.tpex.org.tw/web/stock/aftertrading/daily_close_quotes/stk_quote_download.php?l=zh-tw&d=107/02/09&s=0,asc,0'
r = requests.get(link)
r.ok

使用 requests 抓取上櫃股價回傳結果

可以看到網址中,包含了日期:107/02/09,這個字樣,可以改成其它日期。 get 下來就是 csv 檔了!直接丟進 pandas:

使用 pandas 讀取

顯示程式碼
lines = r.text.replace('\r', '').split('\n')
 
import pandas as pd
from io import StringIO
df = pd.read_csv(StringIO("\n".join(lines[3:])), header=None)
df.head()

但我發現一個小問題:

  • 在 csv 檔中,第一行是:”a”,”b”,”c”
  • 但是在其它行,則顯示:a,b,c

有沒有雙引號很重要,會讓 pandas 沒辦法直接讀進來,所以我們前面幾行先去除(上段 code 中 lines[3:]

就可以得到下圖:

pandas 讀取上櫃股價 csv 後的資料表,index 與 column 為數字

但我們的 index 跟 column 都還沒設定好(都是數字),要把它轉換成有意義的 label:

整理 index 跟 columns

顯示程式碼
df.columns = list(map(lambda l: l.replace(' ',''), lines[2].split(',')))
df.index = df['代號']
df = df.drop(['代號'], axis=1)
df.head()

首先先來換 column,裡面有些複雜的程式(第一行)慢慢講解:

  1. lambda l: l.replace(' ','') 是一個函式,但是我懶得命名,所以就用 lambda 賴省略函式名稱,它會讀入,這個函式讀入 l,並將 l 裡面的空白刪除並 outpu 出來。
  2. 其中的 map(func, array) 就指:將 array 裡面所有元素,都用 func 處理一遍。
  3. line[2].split(','):將字串依照 “,” 分割成好幾個小字串。

總體來說,就是將資串分割->針對每個子字串刪除空白。

另外針對 index,我們就單純用 df.index = df['代號'] 來設定,並用 df.drop 將原本的 column 刪除, 其實知道 pandas 有 df.set_index() 這個函式,但是發現存檔怪怪的,所以改用途法煉鋼(第 2、3 行)

這樣差不多就完成了:

整理好 index 與 columns 後的上櫃股價資料表

那要如何把檔案存起來呢?

我們可以利用 save file

顯示程式碼
df.to_csv('test.csv')
pd.read_csv('test.csv', index_col='代號').head()

來存檔跟讀檔喔!跑出來會是一模一樣的!

存檔讀檔後的上櫃股價資料表結果一模一樣

今天的簡易教學就到這邊!可以下載下來玩玩看喔!

想建立自己的策略?

用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案

免費開始