close

一、前言

用Python爬下知名資訊網站的資料,大家試過嗎!爬下完整資料用於分析或打造自己的基金觀測站。不知道大家有沒有去過MoneyDJ,裡面擁有豐富的ETF資料還有Fund資料:

https://www.moneydj.com/ETF/X/Basic/Basic0003.xdjhtm?etfid=0050.TW

今天告訴大家初階的爬蟲用pandas就可以抓下來嘍!(移到最後完整程式碼)還不會pandas基本運用的可以把以下這篇當作字典遇到不會的就翻一下。

【Pandas】資料量化必學的DataFrame用法不會要吃虧喔:資料運算也就這幾個概念拉!

 

二、爬基金網站資料

(1) 首要任務

概念是這樣的,首先找到我們要取得資料的網址(MoneyDJ),抓取你要的ETF上面每個分頁的資訊。

https://www.moneydj.com/ETF/X/Basic/Basic0003.xdjhtm?etfid=0050.TW

可以看到我們的任務就是爬取元大0050ETF在MoneyDJ上的各個分頁。
image
 

(2) 觀察網址

而你會發現MoneyDJ 0050 ETF每個分頁網址是有規律的,都是https://www.moneydj.com/ETF/X/Basic/XXXXXXXXXXXX?etfid=ETF名稱,這時候我們只要把ETF名稱變成一個變數,這麼一來,我們就可以藉由改名稱,快速爬到該ETF的資料。

https://www.moneydj.com/ETF/X/Basic/Basic0004.xdjhtm?etfid=0050.TW
image

https://www.moneydj.com/ETF/X/Basic/Basic0007a.xdjhtm?etfid=0050.TW
image


https://www.moneydj.com/ETF/X/Basic/Basic0003.xdjhtm?etfid=0050.TW
image


https://www.moneydj.com/ETF/X/Basic/Basic0005.xdjhtm?etfid=0050.TW
image

 

(2) 運用pandas.read_html及try except:

藉由pandas中的read_html方法,可以幫我們找到給入網址的表格(在html中有table標籤的),並整理成dataframe回傳給你,也就是說你想爬取的網址中一臉表格樣可以直接先試試看著個函數。

# 爬取資料
try:
    # 基本資料
    url = 'https://www.moneydj.com/ETF/X/Basic/Basic0004.xdjhtm?etfid=' + ticker
    data = pandas.read_html(url)
    info = data[2]
    info = info.iloc[0:5]
    
except Exception as e:
    print(e)

image
把dataframe型態的資料畫成圖就很簡單了吧!還不會畫圖的可以參考這一篇:

【Python量化資料】手把手教你畫出萬用精美股票圖K線圖


而後藉由python的語法try except來避開抓取不到或是抓取遇到錯誤的問題,才不會因為某一行程式碼錯誤導致整支程式無法執行,語法為:

# 爬取資料
try:
    你要運行的程式碼
    
except Exception as e:
    如果遇到錯誤要錯的事情 # print(e)則為打印出錯誤訊息而後往下繼續執行程式碼

 

完整程式碼

import pandas
import numpy
import requests
import datetime

# 基金代號
ticker = '0050.TW'

# 初始化資料
today = datetime.datetime.today().strftime('%Y%m%d')

# 爬取資料
try:
    # 基本資料
    url = 'https://www.moneydj.com/ETF/X/Basic/Basic0004.xdjhtm?etfid=' + ticker
    data = pandas.read_html(url)
    info = data[2]
    info = info.iloc[0:5]
    
except Exception as e:
    print(e)

try:
    # 持股狀況
    url = 'https://www.moneydj.com/ETF/X/Basic/Basic0007a.xdjhtm?etfid=' + ticker
    data = pandas.read_html(url)
    
    holding = pandas.concat([data[3], data[4]]) # 持股狀況
    holding.index = holding.reset_index().index
    industry = data[2]
    industry.drop(columns=['顏色'], inplace=True)
    industry.columns = ['產業', '投資金額', '比例'] # 投資產業比重
    #industry.set_index(['產業'], inplace=True)
except Exception as e:
    print(e)

try:
    # 折溢價形況
    url = 'https://www.moneydj.com/ETF/X/Basic/Basic0003.xdjhtm?etfid=' + ticker
    data = pandas.read_html(url)
    net = pandas.concat([data[4], data[5]])
    net.index = pandas.to_datetime(net['日期'])
    net.sort_index(ascending=True, inplace=True)
except Exception as e:
    print(e)

try:
    # 配息狀況
    url = 'https://www.moneydj.com/ETF/X/Basic/Basic0005.xdjhtm?etfid=' + ticker
    data = pandas.read_html(url)
    dividend = data[2]
    dividend = dividend[['除息日', '發放日', '幣別', '配息總額']]
except Exception as e:
    print(e)
    
try:
    # 比較
    url = 'https://www.moneydj.com/ETF/X/Basic/Basic0010.xdjhtm?etfid=' + ticker
    data = pandas.read_html(url)
    compare = data[3]
    compare.rename(columns={'Unnamed: 0': '比較'}, inplace=True)
except Exception as e:
    print(e)

如此一來大家就可以打造自己的基金觀測台或用於資料分析!
 

image

image

image

 

三、後記

還有技術分析的股價資料還沒爬下來,給大家試試看吧~除了ETF以外MoneyDJ 還有其他豐富的資料!下一篇來告訴大家怎麼爬下時間更長的資料,不只有眼睛看的資料~一個網站蘊含的資料量比你想像中的還多!!

 

想要即時訂閱最新文章:

https://forms.gle/MdXmiF2HgHhNChL46

或者訂閱Telegram來接收最新資訊:

https://t.me/joinchat/VUUuDt67Uq5l6CIQ

arrow
arrow

    恩哥Python 發表在 痞客邦 留言(0) 人氣()