財報爬蟲超簡單 – 用Python一次抓綜合損益、資產負債、營利分析

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

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

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

財報爬蟲

import requests
import pandas as pd
import numpy as np

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

    if year >= 1000:
        year -= 1911

    if type == '綜合損益彙總表':
        url = 'https://mops.twse.com.tw/mops/web/ajax_t163sb04'
    elif type == '資產負債彙總表':
        url = 'https://mops.twse.com.tw/mops/web/ajax_t163sb05'
    elif type == '營益分析彙總表':
        url = 'https://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, header=None)

    return pd.concat(dfs[1:], axis=0, sort=False)\
             .set_index(['公司代號'])\
             .apply(lambda s: pd.to_numeric(s, errors='ceorce'))

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

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

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

result 1

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

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

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

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

FinLab - 韓承佑

嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎薩克雷大學資工博士,目前擔任臺灣量化交易協會 學術顧問、台北商業大學 創新育成中心 創業技術顧問與上市科技公司 量化交易顧問。當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。我們成立 FinLab 量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。希望可以在量化投資的路上,當大家的「武器製造商」!