謝謝各位的支持,有很多人寄信來問各式各樣不同的研究!
但因為討論熱烈,我目前先挑比較簡單的做,其它的在清單中,依序補上~
最近發現上櫃的股票也滿多人在看的,今天教大家如何用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
可以看到網址中,包含了日期: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:]
)
但我們的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,裡面有些複雜的程式(第一行)慢慢講解:
lambda l: l.replace(' ','')
是一個函式,但是我懶得命名,所以就用lambda
賴省略函式名稱,它會讀入,這個函式讀入l
,並將l
裡面的空白刪除並outpu出來。- 其中的
map(func, array)
就指:將array
裡面所有元素,都用func
處理一遍。 line[2].split(',')
:將字串依照 “,” 分割成好幾個小字串。
總體來說,就是將資串分割->針對每個子字串刪除空白。
另外針對index
,我們就單純用df.index = df['代號']
來設定,並用df.drop
將原本的 column
刪除,
其實知道pandas有df.set_index()
這個函式,但是發現存檔怪怪的,所以改用途法煉鋼(第2、3行)
那要如何把檔案存起來呢?
我們可以利用save file
df.to_csv('test.csv')
pd.read_csv('test.csv', index_col='代號').head()
今天的簡易教學就到這邊!可以下載下來玩玩看喔!