Python 財報爬蟲

本系列已經介紹了各式各樣的爬蟲,從每天、每月,現在終於要季了,在尋找了各式各樣的網站,交叉比對之下,發現公開資訊觀測站的總報表還滿好抓的,所以就從這個網站下手。

Python中有個非常好用的package,叫做pandas,利用它我們就可以簡潔的把網頁上的表格,轉換成dataframe,也就是整理成程式看的懂的表格,我們幾乎不需要做太多的處理!這也是我喜歡用python一點。

這邊我用的是python3 喔~可能要注意一下,另外pandas的版本不一樣,可能會導致網頁轉dataframe的時候,有點小不一樣,可能要稍微檢查一下,我是用0.20.3這個版本。

財報爬蟲
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import requests
import pandas as pd
import numpy as np

def financial_statement(year, season, type='綜合損益彙總表'):

if year >= 1000:
year -= 1911

if type == '綜合損益彙總表':
url = 'http://mops.twse.com.tw/mops/web/ajax_t163sb04'
elif type == '資產負債彙總表':
url = 'http://mops.twse.com.tw/mops/web/ajax_t163sb05'
elif type == '營益分析彙總表':
url = 'http://mops.twse.com.tw/mops/web/ajax_t163sb06'
else:
print('type does not match')

r = requests.post(url, {
'encodeURIComponent':1,
'step':1,
'firstin':1,
'off':1,
'TYPEK':'sii',
'year':str(year),
'season':str(season),
})

r.encoding = 'utf8'
dfs = pd.read_html(r.text)


for i, df in enumerate(dfs):
df.columns = df.iloc[0]
dfs[i] = df.iloc[1:]

df = pd.concat(dfs).applymap(lambda x: x if x != '--' else np.nan)
df = df[df['公司代號'] != '公司代號']
df = df[~df['公司代號'].isnull()]
return df

這個function的用法,就跟月爬蟲是一樣的,可以直接輸入西元或國曆,然後第n季,只能輸入1~4季喔~不然會當掉,最後還要輸入哪一種財報:

  • 綜合損益彙總表
  • 資產負債彙總表
  • 營益分析彙總表

都可以爬取喔!以下就是利用這個function所爬取的資料

大家可以看到有些columns怪怪的,例如 “合計:共 808 家” 這個是什麼鬼XDD,由於我一次爬了三個表,這一點小問題應該還好啦!XDD,可以再寫一行code刪除該列就好了。

基本上資料都是對齊的,不用太擔心。

爬完之後就交給大家自由發揮囉~~可以做很多事情。
總算各種股價、財報、月報的爬蟲都分享完了~

接下來就是真的利用這些資料來選股囉!

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