未分類

python上櫃資料爬蟲輕鬆做

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

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

爬取上櫃股價網址
1
2
3
4
5
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讀取
1
2
3
4
5
6
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
1
2
3
4
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行)

這樣差不多就完成了:

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

我們可以利用

save file
1
2
df.to_csv('test.csv')
pd.read_csv('test.csv', index_col='代號').head()

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

今天的簡易教學就到這邊!附件 是 jupyter notebook 檔案

可以下載下來玩玩看喔!

假如覺得文章不錯,那更不能錯過我們的影音課程喔!
或我們按個 鼓勵一下吧!