超簡單用python抓取每月營收

今天承接上次的超簡單python系列,教大家如何得到每家企業每個月的營收。這個系列的最終目的就是讓大家可以創造自己的投資自動化程式,甚至擁有自己的看盤軟體。

真的不要把程式交易想像的很難,感覺爬2000多支股票,並整理資料,好像是一件很累很痛苦的是情,但真的只需要30行,你可能會覺得這些代碼真的太短了,但真的就是這麼短,然而這必須建立在python或是R,這些package豐富的腳本語言才有可能辦到,這兩個語言都不錯,但我比較喜歡寫python就是了XD,因為python還可以做很多酷炫的事情,例如寫server,或是一些自動化工具,然而R好像沒有這麼多功能?

那我們就來爬取吧!首先先決定要爬哪個網頁,我選擇的是TWSE官方網頁
它的網址是
http://mops.twse.com.tw/nas/t21/sii/t21sc03_103_2_0.html

各位有看到103這個數字嗎?其實這個就是年份,而緊接在後面的 “2” 就是月份,所以只要改動這兩個值,我們就可以下載不同年月的歷史資訊:

月爬蟲

import pandas as pd
import requests
from io import StringIO
import time
def monthly_report(year, month):
    
    # 假如是西元,轉成民國
    if year > 1990:
        year -= 1911
    
    url = 'https://mops.twse.com.tw/nas/t21/sii/t21sc03_'+str(year)+'_'+str(month)+'_0.html'
    if year <= 98:
        url = 'https://mops.twse.com.tw/nas/t21/sii/t21sc03_'+str(year)+'_'+str(month)+'.html'
    
    # 偽瀏覽器
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
    
    # 下載該年月的網站,並用pandas轉換成 dataframe
    r = requests.get(url, headers=headers)
    r.encoding = 'big5'

    dfs = pd.read_html(StringIO(r.text), encoding='big-5')

    df = pd.concat([df for df in dfs if df.shape[1] <= 11 and df.shape[1] > 5])
    
    if 'levels' in dir(df.columns):
        df.columns = df.columns.get_level_values(1)
    else:
        df = df[list(range(0,10))]
        column_index = df.index[(df[0] == '公司代號')][0]
        df.columns = df.iloc[column_index]
    
    df['當月營收'] = pd.to_numeric(df['當月營收'], 'coerce')
    df = df[~df['當月營收'].isnull()]
    df = df[df['公司代號'] != '合計']
    
    # 偽停頓
    time.sleep(5)

    return df

以上這段程式碼就是一個function可以在其它地方隨時呼叫,code真的超短,但這樣就夠了!

接下來我們隨意讀取任意年月份(可以用民國或是西元都支援):

月爬蟲

# 民國100年1月
monthly_report(100,1)

# 西元2011年1月
monthly_report(2011,1)

就會跑出以下的表格:

其實寫程式真的好簡單XDD,坊間財經軟體都好貴,不就是幾行code而已,是不是!
目前已經交完 日、月 的資料爬取了,下一次就是一季囉!

當然還有各式各樣可以爬的東西,有時間再跟大家介紹~

FinLab - 韓承佑

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