持之以恆到了第二天,前一篇提到用公開資訊站抓取月營收資訊。 今天來分享用公開資訊站抓取"保留盈餘"這個資訊。
提到"保留盈餘",就必須參照"資產負債表",因為保留盈餘屬於資產負債表裡面的股東權益項目,所以我們要去公開資訊觀測站裡面查詢:https://mops.twse.com.tw/mops/web/t164sb03
為何保留盈餘這個指標具有參考性呢? 保留盈餘屬於股東權益的一部分,一家公司,保留盈餘是否有持續成長,代表這家公司是否有持續性提供股東權益的增長。若保留盈餘減少,卻還是大量發放股利,就代表我們需要小心公司未來成長的方向。
做法與Day1的程式碼很類似,只有入口網站有更改,觀察入口網站需要輸入的項目,需要使用者填寫的項目分別為"歷史資料"、"公司代號"、"年度"和"季度"。
在使用程式碼擷取前,我們可以先觀察一下公開資訊站的資產負債表格式,假如使用者填入第四季度,則資產負債表顯示如下,它的主欄位有兩欄,分別顯示查詢民國年12月底與去年12月底。
假如使用者填入"第一、二、三季度",則顯示如下,可發現主欄為變成三欄,除了原本使用這欲查詢的年份,還多了去年年底12月和去年對應的季度。
由這個變化,也提醒我們在做資料尋找時,要先確定網站上表格格式的變化是否會影響資料的抓取。
接下來,這些表格裡面,我們需要的是"保留盈餘"這列資訊。 以普萊德(6263) 民國110年第四季度為範例,可發現我們欲取得768,852這筆數據。
執行程式碼後,可在dfinfo這個Dataframe裡面擷取出所有表格的數據
觀察資料型態,可以發現我們要查找的"保留盈餘合計"位於第42列第一欄,而我們要撈取的資料768512則位於第42列第二欄。
我在程式碼中,使用dataframe篩選的技巧,首先創建一個filter變數,並讓他判斷
filter=dfinfo.iloc[:,0]=='保留盈餘合計'
這行指令代表,會去查找第一欄裡面所有元素是否有符合"保留盈餘合計"這個字串,並會生成布林陣列,接著再用這個filter去撈取第二欄的資料,這樣就能把768512這個數字篩選出來。
這個做法類似excel的vlookup,只是我簡單使用panda dataframe的函數去做篩選。
retained_surplus=dfinfo.loc[filter].iloc[0,1]
================================程式碼================================
"""
Day2範例-抓取每月累積營收年增率
"""
import requests
import pandas as pd
#####
url = 'https://mops.twse.com.tw/mops/web/t164sb03' #獨立報表-資產負債表
year=110 # 使用者輸入處: 年份(民國)
season=4 # 使用者輸入處:季度(1,2,3,4)
co_id=6263 # 使用者輸入處 :公司代碼
###
latest_revenue=[]
season="".join(['0',str(season)])
postinfo={
'encodeURIComponent':1,
'step':1,
'firstin':1,
'off':1,
'queryName':'co_id',
'inputType':'co_id',
'TYPEK':'all',
'isnew':False, #false:歷史資料 true:最新資料
'co_id':co_id,
'year':str(year),
'season':season,
}
headers = {'Connection': 'close'} # prevent pop up error:max retries exceed with url
info= requests.post(url,postinfo,headers=headers) #post to URL
info.encoding = 'utf8'
dfinfo = pd.read_html(info.text, header=None)[10] #data is in list[10]
filter=dfinfo.iloc[:,0]=='保留盈餘合計'
retained_surplus=dfinfo.loc[filter].iloc[0,1]
沒有留言:
張貼留言