这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
股市有风险,投资需谨慎。
复制代码
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 使用方法的小伙伴欢迎留言,喜欢的小伙伴记得点赞哦。
【参考文章】 juejin.cn/post/703158…