iT邦幫忙

2

python抓網頁data,及做圖表之十四:抓財務分析資料查詢彙總表

  • 分享至 

  • xImage
  •  

“他”指巴菲特提到:
He never travels by private jet, although he owns the world's largest private jet company.
(他雖然是世界最大的私人噴射客機公司的老闆,但卻從來沒有搭私人飛機旅行過.)

財務的好壞,總要細細的評比。好公司裏,還有更好的公司。但,首先,評比的指標要先弄懂。
觀測站裏的匯總報表裏,有一枝財務分析資料查詢彙總表

http://mops.twse.com.tw/mops/web/t51sb02

本來以為ROA/ROE要自己算,
但是這裏面算好了。
資產報酬率(%), 股東權益報酬率(%),它歸類在獲利能力,和財報狗的分類意思差不多。
但是,BUT,這張報表竟是年報,
註:本報表每年 5 月 1 日更新,似乎時效上面時差了點,最多只能容忍季報,
所以這個年報表比起財務狗的季報表是差了點。財務狗很有可能是自己算的。

觀察這個年報,因為公司家數很多(上市),所以
註:本報表每年 5 月 1 日更新裏會放很多TH, 讓user方便看,
有了昨天的經驗,這次會當心點。
還好這個TABLE的格式,是一個格式用到底,不像昨天分享的,欄位數目不固定,有20個,有15個,有18個,這個是大家都一樣。

這個特別重要的年報,其抓取的方法,特別簡單
如下:

import urllib.request
from bs4 import BeautifulSoup
url = 'http://mops.twse.com.tw/mops/web/ajax_t51sb02?'\
        'encodeURIComponent=1&step=1&firstin=1&off=1&TYPEK=sii&year=101'
response = urllib.request.urlopen(url)
html = response.read()
sp = BeautifulSoup(html.decode('utf8'))    
tbls=sp.find_all('table',attrs={ 'class' : "hasBorder"}) 

trs=tbls[0].find_all('tr',attrs={ 'class' : ["odd","even"]}) 
for tr in trs:
    tds=tr.find_all('td')
    print (tds[0].get_text(),tds[1].get_text(),tds[2].get_text(),tds[3].get_text(),tds[4].get_text(),tds[5].get_text(),tds[6].get_text())

output:
-------------
1109 信大水泥           9.62         317.02         669.31         490.56           0.00
1110 東泥           8.99         173.66         258.40         130.06       6,079.97
1201 味全公司          55.27         166.27         141.07          99.89          21.87
1203 味王公司          23.23         610.36         168.31          90.19          51.94
1210 大成長城          38.63         393.81         107.88          67.52          13.68
1213 大飲          20.05         211.82         287.70         263.76          67.84
1215 卜蜂企業          49.32         226.68         118.49          55.58          12.92
1216 統一          31.27         880.25         106.35          72.81          37.53
1217 愛之味          49.13         709.19         106.61          75.88           1.63
1218 泰山企業          54.39         280.83         181.32          90.87          -2.39
1219 福壽實業          36.94         237.83         303.68         153.95          -0.97
1220 台榮          16.07         264.95       1,042.21         582.63       9,776.09
---------

這裏用到一個很常用的技巧,筆者到參賽快要一半時,才知道,
一般tr, 會用odd, even來識別單數行,偶數行,你可以
只抓出class是odd, even的tr, 其他tr不抓,

trs=tbls[0].find_all('tr',attrs={ 'class' : ["odd","even"]}) 

這樣寫即可。這種格式蠻好用的。

本來接下來要這樣寫的,

for tr in trs:
    tds=tr.find_all('td')
    t0=tds[0].get_text();t1=tds[1].get_text();
    t2=tds[2].get_text().strip().replace(',','');t3=tds[3].get_text().strip().replace(',','');t4=tds[4].get_text().strip().replace(',','');
    t5=tds[5].get_text().strip().replace(',','');t6=tds[6].get_text().strip().replace(',','');

copy/paste不到一半,就手酸不想往下寫了。
引入第一個function,
真誇張,比賽都快到一半了,才引入程式語言中,基礎中的超級基礎
若是以介紹語言為主的分享文,應該很快就提函數了吧!!
挑第一個tr,擷取出裏面的td來試試。

def td2num(td):
    return float(td.get_text().strip().replace(',',''))

stk=[]
tds=trs[0].find_all('td')
i=0
for td in tds:
    
    i=i+1
    if i>2 :
        stk.append(td2num(tds[i-1]))
    else:
        stk.append(tds[i-1].get_text())

stk        

output:
['1101',
 '台泥',
 13.24,
 319.7,
 158.69,
 142.34,
 415.58,
 4.85,
 75.25,
 13.64,
 26.75,
 0.75,
 0.21,
 6.95,
 7.87,
 5.57,
 21.55,
 32.52,
 2.09,
 80.52,
 109.97,
 0.67]

20個數字欄位。把去空白,取代逗點,文字轉成數字,寫在函數裏。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言