用 Python 爬取各类基金数据并动态展示
以下文章来源于Python爬虫数据分析挖掘 ,作者李运辰
Python爬虫数据分析挖掘
四年的编程开发爱好者,分享日常编程学习和接私活过程,记录生活,共同进步。关注小白,编程快乐
01
前言
去年接触基金,体会到了基金的香(真香),这几天也是过年后开始交易的日子,今天爬取『蛋卷基金』数据,通过pyecharts动图可视化方式展示基金的涨跌情况。
本文将围绕这三点去进行爬取数据,动图可视化展示数据:
- 近一月涨跌幅前10名
- 基金各个阶段涨跌幅
- 近30个交易日净值情况
02
数据获取
数据来源
本文的数据来源:『蛋卷基金』
https://danjuanapp.com/
看过我之前的这篇文章酱香科技!用 Python 分析白酒类基金有多赚钱!都学会了怎么在『蛋卷基金』爬取数据(ajax异步交互方式),不会的可以去看看,文中有详细步骤!!!
数据分析
接下爬取的数据涉及五大类(五种基金)
- 股票型基金
- 混合型基金
- 债券型基金
- 指数型基金
- QDII型基金
通过抓包分析ajax异步交互链接的规律:
- type是对应的五种基金的代号
- order_by是对应最近多久的基金涨跌幅排序
'近一周':'1w''近一月':'1m''近三月':'3m''近六月':'6m''近1年':'1y''近2年':'2y''近3年':'3y''近5年':'5y'
- page是对应的页数,从第1页开始
备注:『蛋卷基金』这个网站没有反爬!!!,请求不需要cookie!!!
ok,这些都清楚之后,接下来就可以开始爬取数据了!
03
数据可视化
由于『蛋卷基金』这个网站没有反爬!!!,所以数据爬取和可视化分析放一起了(直接爬取数据后就进行可视化!)
分析1:近一月涨跌幅前10名
爬虫代码
###基金类型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名')
饼状图可视化代码
###饼状图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.股票型基金
2.混合型基金
3.债券型基金
4.指数型基金
5.QDII型基金
分析
上图中是五大类基金的选取近一个月涨跌幅最高前10名的基金进行绘图。
同理近一周、近三个月、近一年也可以通过这个代码进行绘制,只需要将参数order_by修改即可
'近一周':'1w''近一月':'1m''近三月':'3m''近六月':'6m''近1年':'1y''近2年':'2y''近3年':'3y''近5年':'5y'
分析2:基金各个阶段涨跌幅
上面分析中可以清楚这五类基金近一个月最高的涨跌幅排名情况,下面从排名中选取第一名基金(五类中各选取第一名)分别展示该基金各个阶段的涨跌幅情况
阶段情况:
'近一周':'1w''近一月':'1m''近三月':'3m''近六月':'6m''近1年':'1y''近2年':'2y''近3年':'3y''近5年':'5y'
爬虫代码
####分析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)
可视化代码
###柱形图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') )
分析
从上面动图可以清楚这五类基金第一名基金各个阶段的涨跌幅情况。
有的基金最长时间没有达到3年或者5年,这里使用填充0处理。
分析3:近30个交易日净值情况
同理,上面分析中可以清楚这五类基金近一个月最高的涨跌幅排名情况,下面从排名中选取第一名基金(五类中各选取第一名)分别展示该基金近30个交易日净值情况。
爬虫代码
####分析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)
可视化代码
###拉伸图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') )
1.股票型
2.混合型
3.债券型
4.指数型
5.QDII型
分析
从上面动图可以清楚这五类基金第一名基金近30个交易日净值情况。
04
总结
以上就是爬取基金数据并通过pyecharts动图可视化方式展示基金的涨跌情况。
围绕这三点去进行爬取数据,动图可视化展示数据:
- 近一月涨跌幅前10名
- 基金各个阶段涨跌幅
- 近30个交易日净值情况