百吉财经 > 基金 > 怎么查历年全部基金发行总量-怎么看基金历史

怎么查历年全部基金发行总量-怎么看基金历史

2024-03-28 17:25:31基金

生活中的很多时候,都在教我们如何面对自己的世界,一个真正属于自己的世界。我们在遇到难题的时候应该如何解决,百吉财经将会介绍怎么查历年全部基金发行总量,有相关烦恼的人,就请继续看下去吧。

本老汉从去年3月份从成都天府五街天府软件园的程序开发岗后退下来,一直靠送外卖维持生计。不少头条朋友私信我想跟我学编程,老汉都谢绝了,原因是自己肚子里就这点货,怕耽误了大家,误人子弟。

还有些朋友对编程一无所知,不知道计算机代码可以帮助我们做哪些事情。本老汉今天就来举一个例子,用计算机代码获取指定基金的历史数据。

再次声明,本老汉编程水平很烂,所以才被公司优化,被迫送外卖为生。因此如果以前的程序员同行刷到了这篇文章,请不要对我蹩脚的代码大惊小怪。如果我和你们的水平一样,那多半现在仍然继续在成都天府五街天府软件园做开发,而不是现在这样送外卖,收破烂为生。

需求分析

我们在天天基金网等网站,可以输入基金代码,查看基金历史数据:

假设我想用代码获得的就是每只基金过去一段时间每天的涨跌幅和净值:

该从哪里分析入手呢?我们用编程的方式实现需求,无非就是想通过代码来帮助我们完成本来需要人工操作才能完成的动作。那么首先就要明确,当我们人工操作的时候,背后发生了什么事情?

我们使用 Chrome 浏览器随便打开一个基金的历史数据页面,然后使用快捷键 F12 开启 Chrome 的开发者工具。切换到 network 选项卡。我们在页面点击 2 进行翻页,查看这个基金下一页的历史数据。可以预见到,点击这个按钮后,网页会从后台服务器发起数据请求,以渲染并显示下一页的页面。

如何找到读取基金历史数据的 API endpoint?

我们使用 Chrome 开发者工具的目的,就是观察出网页发送往后台服务器的 API 请求的 url,然后编写代码,调用这个 url,就能在我们的代码里获取到同样的数据了。

每当浏览器里有 API 请求通过 HTTP 发送到后台服务器时,这些请求都能在 Chrome 开发者工具 network 标签页里被观察到。我们点击 2 页面时,网页端需要从后台服务器请求第二页的数据,这个请求的 url 在 network 里显示得很清楚了:

我们把这个 url 复制下来:

http://api.fund.eastmoney.com/f10/lsjz?callback=jQuery18309641173802216549_1669605580528&fundCode=007745&pageIndex=2&pageSize=20&startDate=&endDate=&_=1669607599676

可以分析 url 里面的参数。callback=jQuery18309641173802216549_1669605580528 这一段是用于前端网页渲染的 jQuery 回调信息,而我们的目的是编写代码直接调用 API,而不考虑前端渲染,因此可以忽略这个参数。

fundCode=007745,这个很清楚,fundCode 意思是基金代码,等号后面就是基金的6 位代码。pageIndex=2,意思是告诉服务器,我要读取第二页数据。pageSize=20,分页大小,意思是每一页即每一次 API 请求,返回基金 20 天内的历史数据。

这个 url 在我们程序员编程领域,有个专门术语叫做 API endpoint.

把 url 粘贴到浏览器地址栏里,回车,可以看到下面的输出:

https://fundf10.eastmoney.com/F10DataApi.aspx?type=lsjz&code=007745&page=1&edate=2099-02-17

其中红线描绘出的矩形框里就是 API 在服务器端执行并返回给浏览器的数据,也正是我们期望写代码获取的内容。

而 records 662 意思就是这个基金总共有 662 天的历史数据,总共分成 67 页显示,每页默认显示10条数据。

如何创建基金历史数据的抽象模型?

现在我们可以开始编写代码了。所谓编程,第一步就是用代码创建模型来描述现实生活中的业务实体。

比如一只基金,每天显示在网站上的历史数据,无非就是日期,累计净值,单位净值,当天的涨跌率这 4 个字段,因为我选择了使用 Node.js 来编程,所以首先创建一个 JavaScript 函数,名叫 ValuePerDay. 那么我每次用 new ValuePErtDay 新建一个实例,这个实例就用来描述某基金某一天的详细数据。

有了基金数据模型后,接下来我们需要使用代码向后台服务器,基于找到的 url 发起对应的 HTTP 请求,读取基金历史数据。

如何使用代码读取基金历史数据?

因为是 Node.js,本老汉选择了 request 这个工具库。

定义一个名叫 sendRequest 的函数,方便其他模块重用。输入参数为 sRequestUrl 即前文分析的 API endpoint.

我们新建一个 Promise 对象,将发送 API 这个异步操作封装到 Promise 的实体内,使用 Request 工具库发送请求,并将 response 通过 Promise 实体内参数 resolve 传递给调用者。

sendRequest 完成实现如下图所示:

我们在创建一个名叫 getRawDataWithHTMLFormatPerPage 的函数,这个函数接收两个输入参数,分别是基金历史数据的页码数和基金代码。在函数实现体内,根据前文介绍的逻辑,将传递进来的页面数和基金代码拼凑成完整的 API endpoint,然后将这个拼凑好的 endpoint 即存储在下图 urlForPageRequest 的变量传递到我们之前编写的 sendRequest 模块里。

如何解析通过 API 读取回来的基金历史数据?

基金读取 API 返回的是一个 HTML 格式的字符串,我们感兴趣的基金历史数据就包含在这个 HTML 字符串里,我们需要用代码将其解析出来,将结果存储到一个 JavaScript 数组 aResultPage 里。这个解析逻辑,就实现在下图第 10 行的 parsePerDayDataFromHTMLResponse 里。

API response 解析逻辑实现如下。首先代码第 1 行,我导入了 jsdom 工具库,从而让我能够在 Node.js 运行环境里,像浏览器环境里一样访问 document API 来解析 HTML 格式的字符串数据。

有了 JSDOM 之后,我在代码第 26 行将 HTML 响应字符串传递到其构造函数内,就可以通过 window.document.body 访问到 DOM 数据结构了,接下来没什么技术含量,找到 td 节点,把里面的基金数据读取出来,通过构造 ValuePerDay 实例对象,将数据存储到 aResultPerPage 输出数组就行了。

如何编写测试代码

最后我们来写一段测试代码测试。假设我们想批量读取两只基金的历史数据,那么就在一个 for 循环里,依次调用我们写好的 getRawDataWithHTMLFormatPerPage,这些历史数据包含在 then 指定的回调函数的输入参数 data 里,我们通过 console.log 打印出来,结果如下:

本老汉后续文章,会简单介绍,如何把这些打印在控制台的基金历史数据,输出到 HTML 页面里便于分析,感谢大家的阅读。

虽然我们无法避免生活中的问题和困难,但是我们可以用乐观的心态去面对这些难题,积极寻找这些问题的解决措施。百吉财经希望怎么查历年全部基金发行总量-怎么看基金历史,能给你带来一些启示。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息储存空间服务,不拥有所有权,不承担相关法律责任。如有发现本站涉嫌抄袭侵权/违法违规的内容,请发送邮件,一经查实,本站将立刻删除。

猜你喜欢