python爬蟲 - 上市上櫃個股每日統計資訊

Rainie
職場學習筆記
Published in
Jun 21, 2018

最近公司開設一堂機器學習應用在股票分析的課程,資料集需要收集近十年的股票資訊,上網看了一些有關股票爬蟲的文章,覺得FinLab一系列的教學文寫得非常不錯,但是礙於code寫得非常精簡,省略掉比較多的細節,對於python初學者來說可能會覺得有點吃力,所以這篇文章會把FinLab的方法改寫的比較淺顯易懂,讓大家比較好上手。

先直接上程式碼

將上述程式碼拆分成四個階段:

1. import package2. 進入目標網站,爬取網頁盤後資訊3. 篩選出個股盤後資訊4. 選股

Step1. Import Package

首先會使用到三個package,分別是:

  • requests — 建立HTTP請求,從網頁上獲取想要的資料
  • pandas — 建立系統化的表格資訊,方便後續資料應用
  • StringIO — 進行檔案讀寫

程式一開始先將這兩個package import進來,如果電腦沒裝過上面這些套件,記得先用pip安裝,不然import時會產生error。

Step2. 進入目標網站,爬取網頁盤後資訊

台股大盤的每日統計資訊可以從台灣證卷交易所取得,我們的目標就是透過這個網站將指定日期的股票交易資訊爬取下來。進到網站後,從網址列可以看到日期格式,將想爬取的日期依照相同的格式代入網址的URL中:

台灣證卷交易所

Step3. 篩選個股盤後資訊

爬下來的網頁包含ETF、指數及個股資訊,假設今天要爬取的是個股的盤後資訊,我們得先知道爬取下來的資料型態才可以進一步做篩選,先使用r.text印出剛剛爬下來的資料,觀察到每個欄位是以逗號分隔、而每一筆資料是以\r\n分隔。

r.text

先將資料用換行符號(\n)切割成一筆一筆的串列後,再把不同資料間的型態與格式整理成下表:

指數因為沒有開盤價、收盤價、本益比等等的資訊,所以資料長度是三個裡面最短的。而ETF跟個股雖然都有17個欄位,但是ETF的資料開頭多了一個(=)做區隔,因此可以利用上述的資訊將個股篩選出來。

Step4. 選股

現在各股的盤後資料已經被切割成一筆一筆的串列,為了後續的選股方便,利用pandas的read_csv( )將資料轉換成dataframe格式。不過須特別注意的是,因為前面字串切割時已經把換行字元去除,因此得先透過join( )把串列透過換行符號再次合併起來。

顯示的資料的筆數若超過100筆,pandas默認只會顯示前後100筆,可能會造成數據顯示不完整的狀況。如果希望數據能完整顯示的話,可以將pandas的列數限制設成null。

最後列出幾個pandas好用的方法幫助我們篩選股票:

  • 利用股票代號/股票名稱選取指定的股票
// 股票代號
index = list(df['證券代號']).index('9943')
df.loc[index:index]
// 股票名稱
index = list(df['證券名稱']).index('台積電')
df.loc[index:index]
  • 挑選符合特定條件的股票
// 挑選本益比小於10的股票
df[(pd.to_numeric(df['本益比'], errors='coerce') < 10) &
(pd.to_numeric(df['本益比'], errors='coerce') > 0)]
  • 依特定欄位做排序
// 依照收盤價由低至高排序
df['收盤價'] = df['收盤價'].apply(pd.to_numeric, errors='coerce')
df.sort_values(by='收盤價')

以上就是python爬取每日個股資訊的教學,如果有任何問題或討論的話都可以留言給我喔 😃 😃 😃

[2023/1/9] 新增上櫃公司盤後統計資訊 (需自行更改日期與股票代號)

--

--