台式电脑

怎么样获得电脑代码数据(干货分享,成都天府五街外卖老汉教大家通过代码获取基金历史数据)

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

干货分享,成都天府五街外卖老汉教大家通过代码获取基金历史数据

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

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

干货分享,成都天府五街外卖老汉教大家通过代码获取基金历史数据

需求分析

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

干货分享,成都天府五街外卖老汉教大家通过代码获取基金历史数据

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

干货分享,成都天府五街外卖老汉教大家通过代码获取基金历史数据

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

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

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

我们使用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在我们程序员编程领域,有个专门术语叫做APIendpoint.

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

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

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

干货分享,成都天府五街外卖老汉教大家通过代码获取基金历史数据

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

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

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

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

干货分享,成都天府五街外卖老汉教大家通过代码获取基金历史数据

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

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

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

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

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

sendRequest完成实现如下图所示:

干货分享,成都天府五街外卖老汉教大家通过代码获取基金历史数据

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

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

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

干货分享,成都天府五街外卖老汉教大家通过代码获取基金历史数据

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

干货分享,成都天府五街外卖老汉教大家通过代码获取基金历史数据

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

干货分享,成都天府五街外卖老汉教大家通过代码获取基金历史数据

如何编写测试代码

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

干货分享,成都天府五街外卖老汉教大家通过代码获取基金历史数据

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

干货分享,成都天府五街外卖老汉教大家通过代码获取基金历史数据

相关新闻

返回顶部