Java获取web数据(Java获取股票数据)
使用Java8新特性获取股票数据
1.数据来源http://data.eastmoney.com/zjlx/detail.html
2.获取数据,就是解析这个data,代码如下
package test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.stream.Stream;
public class StokeData {
private static String time ="2018-09-2809:00:00";
private static int num = 1;
private static boolean flag = false;
private static BufferedWriter bw = null;
public static void main(String[] args) throws InterruptedException, IOException {
String url = "http://data.eastmoney.com/zjlx/detail.html";
get(url);
for(num = 1;num <= 74 && flag; num++) {
get(url);
}
if(bw != null) {
bw.close();
}
flag = false;
}
private static void stream(Stream<String> lines) throws IOException, ParseException {
String line = lines.filter(l -> l.contains("dataurl:") )
.map(l -> l.substring(l.lastIndexOf("token"), l.lastIndexOf("{")))
//ChangePercent 涨跌排序
//BalFlowMain 今日主力净流入-> 净额 排序
// <li data="C._AB">全部股票</li>
// <li data="C._A">沪深A股</li>
// <li data="C.2">沪市A股</li>
// <li data="C._SZAME">深市A股</li>
// <li data="C.80">创业板</li>
// <li data="C.13">中小板</li>
// <li data="C.3">沪市B股</li>
// <li data="C.7">深市B股</li>
// <li data="DCFFITA">今日排行<i></i></li>
// <li data="DCFFITA3">3日排行<i></i></li>
// <li data="DCFFITA5">5日排行<i></i></li>
// <li data="DCFFITA10">10日排行<i></i></li>
.map(l -> "http://nufm.dfcfw.com/EM_Finance2014NumericApplication/JS.aspx?type=ct&st=(ChangePercent)&sr=-1&p=1&ps=50&js=var%20CHKjvtxf={pages:(pc),date:%222014-10-22%22,data:[(x)]}&"+l+"&cmd=C._AB&sty=DCFFITA")
.map(l -> getData(l))
.map(l -> l.substring(l.indexOf("[")+1,l.lastIndexOf("]")))
.map(l -> l.replaceAll(" ", "").replaceAll("\t", ""))
.flatMap(l -> Stream.of(l.split("\",\"")))
. findFirst()
.get().split(",")[15];
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-ddHH:mm:ss");
Date date = sdf.parse(line);
sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
time = sdf.format(date);
File f = new File("F:\\stoke_data\\"+time+".txt");
flag = false;
if(!f.exists()) {
bw = new BufferedWriter(new FileWriter(f));
flag = true;
}
}
private static void write(Stream<String> lines) throws IOException {
lines.filter(l -> l.contains("dataurl:") )
.map(l -> l.substring(l.lastIndexOf("token"), l.lastIndexOf("{")))
.map(l -> "http://nufm.dfcfw.com/EM_Finance2014NumericApplication/JS.aspx?type=ct&st=(ChangePercent)&sr=-1&p="+num+"&ps=50&js=var%20CHKjvtxf={pages:(pc),date:%222014-10-22%22,data:[(x)]}&"+l+"&cmd=C._AB&sty=DCFFITA")
.map(l -> getData(l))
.map(l -> l.substring(l.indexOf("[")+1,l.lastIndexOf("]")))
.map(l -> l.replaceAll(" ", "").replaceAll("\t", ""))
.flatMap(l -> Stream.of(l.split("\",\"")))
.map(l -> l.replaceAll(" ", "").replaceAll("\"", ""))
.forEach(l ->{
try {
bw.write(l);
bw.newLine();
} catch (IOException e) {
System.out.println(l);
}
}
);
bw.flush();
}
/**
* 接口调用 GET
*/
public static void get(String urls) {
try {
URL url = new URL(urls); // 把字符串转换为URL请求地址
HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 打开连接
if (System.currentTimeMillis()%2==0) {
connection.setRequestProperty("Content-Type", "application/x-javascript");
connection.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4094.1 Safari/537.36");
}
connection.connect();// 连接会话
// 获取输入流
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
Stream<String> lines = br.lines();
if(!flag) {
stream(lines);
}else {
write(lines);
}
br.close();// 关闭流
connection.disconnect();// 断开连接
// System.out.println(sb.toString());
} catch (Exception e) {
System.out.println("请求失败!");
e.printStackTrace();
}
}
/**
* 接口调用 GET
*/
public static String getData(String urls) {
try {
URL url = new URL(urls); // 把字符串转换为URL请求地址
HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 打开连接
if (System.currentTimeMillis()%2==0) {
connection.setRequestProperty("Content-Type", "application/x-javascript");
connection.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4094.1 Safari/537.36");
}
connection.connect();// 连接会话
// 获取输入流
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line = br.readLine();
br.close();// 关闭流
connection.disconnect();// 断开连接
// System.out.println(sb.toString());
return line;
} catch (Exception e) {
System.out.println("请求失败!");
}
return null;
}
}
3.代码分析
访问web页面
找到对应的token
拼接处数据的URL地址
查看数据的日期
如果是新的数据,就写到磁盘
4.如果对Java的语言不熟悉
Java8新特性: https://blog.csdn.net/u014646662/article/details/52261511