基金变动信息获取之 Java 爬虫
1. 前言
通过前面两篇文章,可以获取基金列表以及基金的概况信息,接下来我们继续通过 Java 爬虫获取基金的变动信息。
有的童鞋就会问,直接访问基金网站的地址不是也能获取吗。确实是可以获取,,但是如果你想要对比多支基金时,就需要注册账号,收藏多支基金,不能形成一个对比形式方便自己观阅。难道手动每天记录每支基金的变化情况以及计算对比数据信息吗。
2. 获取基金变化曲线
访问基金详情地址,可以在页面上看到当前基金的净值估算、单位净值、累计净值及时间段净值变化等相关信息。
http://fund.eastmoney.com/009265.html复制代码
这些数据信息从哪里来呢,通过 页面解析,发现两个有意思的 js
文件,大致的分析如下:
http://fund.eastmoney.com/pingzhongdata/009265.js?v=20211120224036 # # http://fundgz.1234567.com.cn/js/009265.js?rt=1637419962027 返回数据如下: dwjz: "1.2283" fundcode: "009265" gsz: "1.2309" gszzl: "0.21" gztime: "2021-11-19 15:00" jzrq: "2021-11-18" name: "易方达消费精选股票" # 简单的分析下, dwjz:单位净值 fundcode: 基金代码 gsz:估算值 gszzl: 估值增长率 gztime:估值时间 jzrq:净值日期 # 看到这里是不是感觉,这些人很可爱呢 ~.~复制代码
如何获取界面的相关信息呢,本文提供两个方法供读者参考
一 、通过访问上面的 url 获取返回值的信息
// 指定对应基金的变动 url String fundUrldetl = "http://fundgz.1234567.com.cn/js/009265.js?rt=1637419962017"; // 发送一个 Http 请求,并获取返回信息 HttpResponse httpResponse = HttpRequest.get(fundUrldetl).timeout(300 * 1000) .setConnectionTimeout(200 * 1000).execute(); String body = httpResponse.body(); // 获取内容如下,可以对当前的字符串进行相应解析,获取对应的值 jsonpgz({"fundcode":"009265","name":"易方达消费精选股票", "jzrq":"2021-11-18","dwjz":"1.2283","gsz":"1.2309","gszzl":"0.21","gztime":"2021-11-19 15:00"});复制代码
二、通过 Java 的 Jsoup 进行爬虫解析
Connection connection = Jsoup.connect("http://fund.eastmoney.com/009265.html"); Document doc = connection.get(); // 可以选择通过获取Html 标签中id的方式解析当前基金的实时变化情况,下面几个字段的值只金交易时间段产生 Element gz_gsz = doc.getElementById("gz_gsz"); Element gz_gszze = doc.getElementById("gz_gszze"); Element gz_gszzl = doc.getElementById("gz_gszzl"); // 解析标签中的 class 属性信息 Elements dataItem01 = doc.getElementsByClass("dataItem01"); dataItem01.forEach( data -> { System.out.println(data.text()); }); // 打印结果信息如下: // 净值估算(21-11-19 15:00)净值估算每个交易日9:30-15:00盘中实时更新(QDII基金为海外交易时段)。 // -- 近1月:-0.37% 近1年:-3.86%复制代码
3. 基金阶段涨幅
根据基金阶段涨幅变化,可以更好的分析基金的变化情况,至于分析之后能做什么我这个韭菜,就不知道了。
Connection connection = Jsoup.connect("http://fund.eastmoney.com/009265.html"); Document doc = connection.get(); // 根据Html 界面元素属性获取对应的class标签 Elements itemLeft02 = doc.getElementsByClass("quotationItem_left quotationItem_left02"); Elements tr = itemLeft02.select("tr"); for (int i = 0; i < tr.size(); i++) { Element e = tr.get(i); // 截断后续Html 标签中的元素 if (e.text().contains("四分位排名")){ break; } // 获取时间段信息 Elements th = e.select("th"); if (Objects.nonNull(th)){ System.out.println(th.text()); } // 获取展示行数据信息 Elements td = e.select("td"); td.forEach( t -> { // ownText() 获取当前元素的文本信息 System.out.print(t.selectFirst("div").ownText()+ " "); }); }复制代码
Jsoup 中定位元素的方法有很多种,本文可能使用的是相对简单理解的方法,仅供参考使用。
如果想要获取更多关于Jsoup 使用方法的小伙伴欢迎留言,喜欢的小伙伴记得点赞哦。
作者:啤酒不加冰
链接:https://juejin.cn/post/7032919066079657991