18910140161

还在纠结基金怎么买 Python手把手教你爬取2000多支优选基金

顺晟科技

2021-06-16 10:44:19

185

人家不理财,钱不在乎你。码农每个月都努力熬夜。为了拿到那份加班费,没有办法。谁说现在的房价高得离谱?菜里没有一滴油!有,我在一家咖啡店遇到一个叫彼得的师傅,聊了一些理财的概念。听了之后,我好好投资了!比如70%会存,30%的钱用来买一些基金做定投。坚持久了,收益就好!

还在纠结基金怎么买?Python手把手教你爬取2000多支优选基金!

代码农民听完眼睛一亮,爬虫数据分析对我来说小菜一碟。动手吧!立马熬夜写了个爬虫,爬了7000多条基金。接下来,我们将抓取一批较好的基金,为下一步的投资分析做准备。

01.页面分析

我们的数据源是东方财富网,在这里可以查看所有开放式基金的基本信息,包括基金代码、基金简称、近两天单位净值和累计净值、交易费用等。此页面将作为我们列表页面的数据源。

首先,我们试着翻页,发现网址没变。初步确定该页面的数据列为js动态加载。

然后我们寻找数据的真实地址和页面参数,发现有一个参数值叫“dt”,是一长串数字。

更麻烦的是这个数字还是随机的.先把这个问题搁置一段时间,先分析一下详情页。

还在纠结基金怎么买?Python手把手教你爬取2000多支优选基金!

我们随机选择一只基金进入明细页面,明细页面中间有一列“净值”数据。点击后,我们将到达以下页面:

还在纠结基金怎么买?Python手把手教你爬取2000多支优选基金!

首先,分析基金净值明细页面的网址。经过几次尝试,很容易发现,不同基金净值明细页面的URL的区别在于基金代码。我们可以通过拼接字符串直接获取基金净值明细页面的URL,方便很多。

我们来看看本页的历史净值数据。和列表页面一样,详细页面中的净值数据是动态加载的,参数比较复杂。——有两个随机生成的数字序列。

更麻烦的是回调参数每隔几秒就会更新一次,初步判断可能是应用了一些基于时间戳的加密算法。对于我这样的业余爱好者来说,直接破解太难了,最后我决定用selenium爬取基金数据。

02.获取列表页面信息

确定了爬行的基本思路后,我们就开始正式工作了。我们使用selenium来抓取列表页面数据。通过观察页面,我们可以看到数据栏下有一个“一键查看全部”的按钮。

所有的开放式基金都可以一次显示。点击右上角的“可购买”选项,过滤掉目前无法交易的基金,最终得到4137只基金的列表。

还在纠结基金怎么买?Python手把手教你爬取2000多支优选基金!

下面的代码模拟了上面的操作,然后我们使用page_source()方法获取页面的真实html数据,这样我们就可以按照常规的方式解析提取的数据,并保存在csv或excel文件中。

还在纠结基金怎么买?Python手把手教你爬取2000多支优选基金!

原列表页面数据存在一些问题,不方便直接使用,需要简单清理:

1).excel或csv文件中的基金代码会自动删除数字左侧的“0”。在解决方案:左侧填写0,完成6个基金代码。

2)资金质量参差不齐,大量质量差的资金没有获得价值。解决方案:筛选出累计净值不低于1.1(收入不低于10%)的基金代码,并抓取详细页面(共2000多只基金)。

3).有些数据没有存储价值或重复存储。解决方案:过滤三列数据,即基金代码、基金简称、手续费,在详细页面上传递给爬虫。

4).这部分功能实现起来相对简单。我们直接编码,其中fill_zero是用户自定义函数,用于填充基金代码左侧的0。

还在纠结基金怎么买?Python手把手教你爬取2000多支优选基金!

5).最后,我们将得到一个过滤后的数据帧数据,该数据帧数据将被传输到爬行器,用于抓取详细信息页面

03.获取详细信息页面信息

爬取详细页面是这个任务的亮点,也是硒发挥作用的主战场。

(1)加载并导入硒相关库

创建一个对象驱动chrome浏览器,更大等待时间设为10秒。

还在纠结基金怎么买?Python手把手教你爬取2000多支优选基金!

(2)翻页

我们模拟在文本框中填写页码,点击“确定”按钮实现翻页操作的方式。

还在纠结基金怎么买?Python手把手教你爬取2000多支优选基金!

实现翻页操作的基本思路是等待文本框和“确认”按钮加载,清空文本框数据并注入页码,点击执行翻页操作,调用页面解析功能。如果响应超时是由网络故障或其他原因引起的,请继续调用此函数,直到页面成功翻页。核心代码如下:

还在纠结基金怎么买?Python手把手教你爬取2000多支优选基金!

要以这种方式翻页,必须提前基金净值数据的更大页数,这可以从页面栏最后一页的文本值中获得。

还在纠结基金怎么买?Python手把手教你爬取2000多支优选基金!

在这个阶段,我们还可以做一些筛选操作。比如更大页数小于13,说明基金运营时间不足一年,数据太少无法分析,那么基金的数据暂时不会被抓取。

(3)分析

通过观察上图,我们发现详情页的数据排列很有规律。用selenium获取当前页面的html源代码后,我们可以通过常规手段轻松提取出所有想要的数据,包括:净值日期、单位净值、累计净值、日增长率、认购情况、赎回情况、分红情况。

然后将数据添加到数据框数据中,并以资金为单位进行存储。但是,在爬行的过程中,我遇到了一个奇怪的现象,——。我用pyquery定位不到目标数据,只好用xpath来完成数据提取的操作。

还在纠结基金怎么买?Python手把手教你爬取2000多支优选基金!

04.多线程和重复数据删除

以上功能实现后,另一个入口功能组织,爬虫基本完成。但是用selenium爬取数据有一个致命的缺陷,就是——慢,非常慢!

一只基金的详细数据从几十页到近200页不等。平均爬取一只基金的所有数据需要100秒左右,20多万只基金需要20多万秒,不能到晚爬。所以要加快爬虫的速度。首先想到的是使用多线程。

这里有个想法。待抓取的资金代码列表琐碎到N份(N是建立的线程数),然后通过下面的代码建立多线程,其中start_multi_work是爬虫的入口函数。我在运行中设置了10个线程,加速效果还是很明显的。

还在纠结基金怎么买?Python手把手教你爬取2000多支优选基金!

另一个问题是网址重复(其实是要爬的基金代码重复)。试想一下,如果出现网络故障或者其他原因,在抓取过程突然中断的情况下,重新开始并不是很压抑,所以每次启动爬虫之前都要过滤掉已经抓取过的资金代码。

这个任务用redis比较合适。但是由于去重要求不高,我粗暴地用txt文本存储爬取的资金代码。重复数据消除过程的核心代码如下。codes_left是要爬网的基金的筛选列表。

当然,在爬行过程中,需要实时告诉被爬行的基金代码,并写入‘check _ below . txt’文件。

还在纠结基金怎么买?Python手把手教你爬取2000多支优选基金!

05.关于后分析

首先,我们来展示一下爬行的结果。每一份文件都是一个基金的历史数据。

还在纠结基金怎么买?Python手把手教你爬取2000多支优选基金!

资金的筛选其实是一个综合考虑收益和风险的过程。这方面我没有入门,不敢太过强调。这里简单说两点:

1).计算基金的年化回报率

在我看来,10%的年化收益还是比较高的,至少比市面上大多数理财产品都要高。代码如下,其中df包含每个基金的历史数据。

def年度回报(df):

Total_days=(df[' ['交易日期'])。iloc[-1]df['交易日期']。iloc[0])。days total _ value=df ['累计净值']。iloc[-1]df['累计净值']。iloc [0

返回功率((总价值/本金),365.0/总天数)-1

2)计算基金上涨概率

比如某基金经历了500个交易日,其中400个交易日在上涨,那么其历史上涨概率为0.8。

def rase_porp(df):

Rase _ num=df [df ['上升和下降']=0]。shape [0] all _ num=df。形状[0]

返回rase_num/all_num

以上两个参数不是专业的,是我个人的想法。至于选择哪些指标作为评价参数,每个指标达到什么水平,值得持有资金。这些问题因人而异。

最后要强调的是,历史数据不能代表未来,没有万无一失的方法可以根据过去的数据预测未来。尤其是资本市场涉及的变量太多,未来难以预测,收益总是与风险成正比。

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航