日期:2023-05-15
来源:玫瑰财经网
浏览:次
本老汉从去年3月份从成都天府五街天府软件园的程序开发岗后退下来,一直靠送外卖维持生计。不少头条朋友私信我想跟我学编程,老汉都谢绝了,原因是自己肚子里就这点货,怕耽误了大家,误人子弟。
还有些朋友对编程一无所知,不知道计算机代码可以帮助我们做哪些事情。本老汉今天就来举一个例子,用计算机代码获取指定基金的历史数据。
再次声明,本老汉编程水平很烂,所以才被公司优化,被迫送外卖为生。因此如果以前的程序员同行刷到了这篇文章,请不要对我蹩脚的代码大惊小怪。如果我和你们的水平一样,那多半现在仍然继续在成都天府五街天府软件园做开发,而不是现在这样送外卖,收破烂为生。
我们在天天基金网等网站,可以输入基金代码,查看基金历史数据:
假设我想用代码获得的就是每只基金过去一段时间每天的涨跌幅和净值:
该从哪里分析入手呢我们用编程的方式实现需求,无非就是想通过代码来帮助我们完成本来需要人工操作才能完成的动作。那么首先就要明确,当我们人工操作的时候,背后发生了什么事情
我们使用 Chrome 浏览器随便打开一个基金的历史数据页面,然后使用快捷键 F12 开启 Chrome 的开发者工具。切换到 network 选项卡。我们在页面点击 2 进行翻页,查看这个基金下一页的历史数据。可以预见到,点击这个按钮后,网页会从后台服务器发起数据请求,以渲染并显示下一页的页面。
我们使用 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,而不考虑前端渲染,因此可以忽略这个参数。
这个 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 返回的是一个 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 页面里便于分析,感谢大家的阅读。
500吨汽车吊作业性能表(汽车吊支腿反力及抗倾覆验算)
石碣镇汽车站(今天,石碣汽车客运站恢复运营)
招贤汽车站(9月14日起,莒县K601路增开大站快车)
北京福田汽车图片(自重不到两吨,详解福田领航S1小卡)
东风轻型汽车(“东风轻型车”横空出世 未来无人驾驶车将快递送到家门口)
周口市汽车东站(郑阜高速铁路上的主要客运站——周口东站)
Copyright (c) 2022 玫瑰财经网 版权所有
备案号:冀ICP备17019481号
玫瑰财经网发布此信息的目的在于传播更多信息,与本站立场无关。玫瑰财经网不保证该信息(包含但不限于文字、视频、音频、数据及图表)全部或者部分内容的准确性、真实性、完整性、有效性、及时性、原创性等。
相关信息并未经过本网站证实,不对您构成任何投资建议,据此操作,风险自担。