今天承接上次的超簡單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而已,是不是!
目前已經交完 日、月 的資料爬取了,下一次就是一季囉!
當然還有各式各樣可以爬的東西,有時間再跟大家介紹~