天天看點

用 Python 爬取各類基金資料并動态展示一、資料擷取二、資料可視化三、總結

去年接觸基金,體會到了基金的香(真香),這幾天也是過年後開始交易的日子,今天爬取『蛋卷基金』資料,通過pyecharts動圖可視化方式展示基金的漲跌情況。

本文将圍繞這三點去進行爬取資料,動圖可視化展示資料:

  • 近一月漲跌幅前10名
  • 基金各個階段漲跌幅
  • 近30個交易日淨值情況

一、資料擷取

1.資料來源

本文的資料來源:『蛋卷基金』

https://danjuanapp.com/
           

2.資料分析

接下爬取的資料涉及五大類(五種基金)

  1. 股票型基金
  2. 混合型基金
  3. 債券型基金
  4. 指數型基金
  5. QDII型基金
用 Python 爬取各類基金資料并動态展示一、資料擷取二、資料可視化三、總結

通過抓包分析ajax異步互動連結的規律:

  • type是對應的五種基金的代号
  • order_by是對應最近多久的基金漲跌幅排序
'近一周':'1w'              '近一月':'1m'              '近三月':'3m'              '近六月':'6m'              '近1年':'1y'              '近2年':'2y'              '近3年':'3y''近5年':'5y'           
  • page是對應的頁數,從第1頁開始
用 Python 爬取各類基金資料并動态展示一、資料擷取二、資料可視化三、總結

備注:『蛋卷基金』這個網站沒有反爬!!!,請求不需要cookie!!!

ok,這些都清楚之後,接下來就可以開始爬取資料了!

很多人學習python,不知道從何學起。

很多人學習python,掌握了基本文法過後,不知道在哪裡尋找案例上手。

很多已經做案例的人,卻不知道如何去學習更加高深的知識。

那麼針對這三類人,我給大家提供一個好的學習平台,免費領取視訊教程,電子書籍,以及課程的源代碼!

QQ群:810735403

二、資料可視化

由于『蛋卷基金』這個網站沒有反爬!!!,是以資料爬取和可視化分析放一起了(直接爬取資料後就進行可視化!)

1.分析1:近一月漲跌幅前10名

1.1 爬蟲代碼

###基金類型
dict_type={"股票型":1,"混合型":3,"債券型":2,"指數型":5,"QDII型":11}
###時間
dict_time={'近一周':'1w','近一月':'1m','近三月':'3m','近六月':'6m','近1年':'1y','近2年':'2y','近3年':'3y','近5年':'5y'}

for key in dict_type:
    url = "https://danjuanapp.com/djapi/v3/filter/fund?type="+str(dict_type[key])+"&order_by=1w&size=10&page=1"
    res = requests.get(url, headers=headers)
    res.encoding = 'utf-8'
    s = json.loads(res.text)
    s = s['data']['items']
    name = []
    value = []
    for i in range(0,len(s)):
        print(s[i]['fd_name']+":"+s[i]['yield'])
        name.append(s[i]['fd_name'])
        value.append(s[i]['yield'])
    ###開始繪圖
    pie(name, value, str(key)+"基金漲跌幅", "["+str(key)+"]基金近一月漲跌幅前10名")
           

​​​​
用 Python 爬取各類基金資料并動态展示一、資料擷取二、資料可視化三、總結

1.2 餅狀圖可視化代碼

###餅狀圖
def pie(name,value,picname,tips):
    c = (
        Pie()
            .add(
            "",
            [list(z) for z in zip(name, value)],
            # 餅圖的中心(圓心)坐标,數組的第一項是橫坐标,第二項是縱坐标
            # 預設設定成百分比,設定成百分比時第一項是相對于容器寬度,第二項是相對于容器高度
            center=["35%", "50%"],
        )
            .set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])  # 設定顔色
            .set_global_opts(
            title_opts=opts.TitleOpts(title=""+str(tips)),
            legend_opts=opts.LegendOpts(type_="scroll", pos_left="70%", orient="vertical"),  # 調整圖例位置
        )
            .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
            .render(str(picname)+".html")
    )
           

這裡将餅狀圖可視化代碼封裝成函數,繪制五種基金的餅狀圖隻需調用這個函數即可

###開始繪圖
pie(name, value, str(key)+"基金漲跌幅", "["+str(key)+"]基金近一月漲跌幅前10名")
           

1.1.1 股票型基金

用 Python 爬取各類基金資料并動态展示一、資料擷取二、資料可視化三、總結

1.1.2 混合型基金

用 Python 爬取各類基金資料并動态展示一、資料擷取二、資料可視化三、總結

1.1.3 債券型基金

用 Python 爬取各類基金資料并動态展示一、資料擷取二、資料可視化三、總結

1.1.4 指數型基金

用 Python 爬取各類基金資料并動态展示一、資料擷取二、資料可視化三、總結

1.1.5 QDII型基金

用 Python 爬取各類基金資料并動态展示一、資料擷取二、資料可視化三、總結

分析

上圖中是五大類基金的選取近一個月漲跌幅最高前10名的基金進行繪圖。

同理近一周、近三個月、近一年也可以通過這個代碼進行繪制,隻需要将參數order_by修改即可

'近一周':'1w'              '近一月':'1m'              '近三月':'3m'              '近六月':'6m'              '近1年':'1y'              '近2年':'2y'              '近3年':'3y''近5年':'5y'           

2.分析2:基金各個階段漲跌幅

上面分析中可以清楚這五類基金近一個月最高的漲跌幅排名情況,下面從排名中選取第一名基金(五類中各選取第一名)分别展示該基金各個階段的漲跌幅情況

階段情況:​​​​​​​

'近一周':'1w'              '近一月':'1m'              '近三月':'3m'              '近六月':'6m'              '近1年':'1y'              '近2年':'2y'              '近3年':'3y''近5年':'5y'           

2.1爬蟲代碼

####分析2:基金各個階段漲跌幅
def analysis2():
    name =['近1周','近1月','近3月','近6月','近1年','近3年','近5年']
    ##五類基金
    dict_value={}

    for key in dict_type:
        #### 擷取排名第一名基金代号
        url = "https://danjuanapp.com/djapi/v3/filter/fund?type="+str(dict_type[key])+"&order_by=1w&size=10&page=1"
        res = requests.get(url, headers=headers)
        res.encoding = 'utf-8'
        s = json.loads(res.text)
        ###取第一名
        fd_code = s['data']['items'][0]['fd_code']

        #### 擷取排名第一名基金各個階段情況
        fu_url = "https://danjuanapp.com/djapi/fund/derived/"+str(fd_code)
        res = requests.get(fu_url, headers=headers)
        res.encoding = 'utf-8'
        s = json.loads(res.text)
        data = s['data']

        valuess=[]

        ####防止基金最長時間不夠1年、2年、5年的情況報錯,用0填充
        ##近1周
        try:
            valuess.append(data['nav_grl1w'])
        except:
            valuess.append(0)
        ##近1月
        try:
            valuess.append(data['nav_grl1m'])
        except:
            valuess.append(0)
        ##近3月
        try:
            valuess.append(data['nav_grl3m'])
        except:
            valuess.append(0)
        ##近6月
        try:
            valuess.append(data['nav_grl6m'])
        except:
            valuess.append(0)
        ##近1年
        try:
            valuess.append(data['nav_grl1y'])
        except:
            valuess.append(0)
        ##近3年
        try:
            valuess.append(data['nav_grl3y'])
        except:
            valuess.append(0)
        ##近5年
        try:
            valuess.append(data['nav_grl5y'])
        except:
            valuess.append(0)
        ###添加到集合中
        dict_value[key]=valuess
    bars(name,dict_value)
           

2.2 可視化代碼

###柱形圖
def bars(name,dict_values):

    # 鍊式調用
    c = (
        Bar(
            init_opts=opts.InitOpts(  # 初始配置項
                theme=ThemeType.MACARONS,
                animation_opts=opts.AnimationOpts(
                    animation_delay=1000, animation_easing="cubicOut"  # 初始動畫延遲和緩動效果
                ))
        )
            .add_xaxis(xaxis_data=name)  # x軸
            .add_yaxis(series_name="股票型", yaxis_data=dict_values['股票型'])  # y軸
            .add_yaxis(series_name="混合型", yaxis_data=dict_values['混合型'])  # y軸
            .add_yaxis(series_name="債券型", yaxis_data=dict_values['債券型'])  # y軸
            .add_yaxis(series_name="指數型", yaxis_data=dict_values['指數型'])  # y軸
            .add_yaxis(series_name="QDII型", yaxis_data=dict_values['QDII型'])  # y軸
            .set_global_opts(
            title_opts=opts.TitleOpts(title='漲跌幅', subtitle='李運辰繪制',  # 标題配置和調整位置
                                      title_textstyle_opts=opts.TextStyleOpts(
                                          font_family='SimHei', font_size=25, font_weight='bold', color='red',
                                      ), pos_left="90%", pos_top="10",
                                      ),
            xaxis_opts=opts.AxisOpts(name='階段', axislabel_opts=opts.LabelOpts(rotate=45)),
            # 設定x名稱和Label rotate解決标簽名字過長使用
            yaxis_opts=opts.AxisOpts(name='漲跌點'),

        )
            .render("基金各個階段漲跌幅.html")
    )
           
用 Python 爬取各類基金資料并動态展示一、資料擷取二、資料可視化三、總結

分析

從上面動圖可以清楚這五類基金第一名基金各個階段的漲跌幅情況。

有的基金最長時間沒有達到3年或者5年,這裡使用填充0處理。

3.分析3:近30個交易日淨值情況

同理,上面分析中可以清楚這五類基金近一個月最高的漲跌幅排名情況,下面從排名中選取第一名基金(五類中各選取第一名)分别展示該基金近30個交易日淨值情況。

3.1 爬蟲代碼​​​​​​​

####分析3:近30個交易日淨值情況
def analysis3():
    for key in dict_type:
        #### 擷取排名第一名基金代号
        url = "https://danjuanapp.com/djapi/v3/filter/fund?type=" + str(
            dict_type[key]) + "&order_by=1w&size=10&page=1"
        res = requests.get(url, headers=headers)
        res.encoding = 'utf-8'
        s = json.loads(res.text)
        ###取第一名
        fd_code = s['data']['items'][0]['fd_code']

        #### 擷取排名第一名基金近30個交易日淨值情況
        fu_url = "https://danjuanapp.com/djapi/fund/nav/history/"+str(fd_code)+"?size=30&page=1"
        res = requests.get(fu_url, headers=headers)
        res.encoding = 'utf-8'
        s = json.loads(res.text)
        data = s['data']['items']
        name=[]
        value=[]
        for k in range(0,len(data)):
            name.append(data[k]['date'])
            value.append(data[k]['nav'])

        silder(name, value,key)
           

3.2 可視化代碼​​​​​​​

###拉伸圖
def silder(name,value,tips):
    c = (
        Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK))
            .add_xaxis(xaxis_data=name)
            .add_yaxis(tips, yaxis_data=value)
            .set_global_opts(
            title_opts=opts.TitleOpts(title=str(tips)+"近30個交易日淨值情況"),
            datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")],
        )
            .render(str(tips)+"近30個交易日淨值情況.html")
    )
           

3.2.1 股票型

用 Python 爬取各類基金資料并動态展示一、資料擷取二、資料可視化三、總結

3.2.2 混合型

用 Python 爬取各類基金資料并動态展示一、資料擷取二、資料可視化三、總結

3.2.3 債券型

用 Python 爬取各類基金資料并動态展示一、資料擷取二、資料可視化三、總結

3.2.4 指數型

用 Python 爬取各類基金資料并動态展示一、資料擷取二、資料可視化三、總結

3.2.5 QDII型

用 Python 爬取各類基金資料并動态展示一、資料擷取二、資料可視化三、總結

分析

從上面動圖可以清楚這五類基金第一名基金近30個交易日淨值情況。

三、總結

以上就是爬取基金資料并通過pyecharts動圖可視化方式展示基金的漲跌情況。

圍繞這三點去進行爬取資料,動圖可視化展示資料:

  • 近一月漲跌幅前10名
  • 基金各個階段漲跌幅
  • 近30個交易日淨值情況
用 Python 爬取各類基金資料并動态展示一、資料擷取二、資料可視化三、總結
在這裡還是要推薦下我自己建的Python開發交流學習(qq)群:810735403,群裡都是學Python開發的,如果你正在學習Python ,歡迎你加入,大家都是軟體開發黨,不定期分享幹貨(隻有Python軟體開發相關的),包括我自己整理的一份2021最新的Python進階資料和進階開發教程,歡迎進階中和想深入Python的小夥伴!